diff options
Diffstat (limited to 'disassembler/disassembler_x86.cc')
| -rw-r--r-- | disassembler/disassembler_x86.cc | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/disassembler/disassembler_x86.cc b/disassembler/disassembler_x86.cc index a289433af5..e12bcec776 100644 --- a/disassembler/disassembler_x86.cc +++ b/disassembler/disassembler_x86.cc @@ -574,6 +574,20 @@ DISASSEMBLER_ENTRY(cmp, load = true; src_reg_file = dst_reg_file = SSE; break; + case 0x29: + opcode1 = "pcmpeqq"; + prefix[2] = 0; + has_modrm = true; + load = true; + src_reg_file = dst_reg_file = SSE; + break; + case 0x39: + opcode1 = "pcmpgtq"; + prefix[2] = 0; + has_modrm = true; + load = true; + src_reg_file = dst_reg_file = SSE; + break; case 0x40: opcode1 = "pmulld"; prefix[2] = 0; @@ -737,6 +751,24 @@ DISASSEMBLER_ENTRY(cmp, load = true; has_modrm = true; break; + case 0x64: + case 0x65: + case 0x66: + if (prefix[2] == 0x66) { + src_reg_file = dst_reg_file = SSE; + prefix[2] = 0; // clear prefix now it's served its purpose as part of the opcode + } else { + src_reg_file = dst_reg_file = MMX; + } + switch (*instr) { + case 0x64: opcode1 = "pcmpgtb"; break; + case 0x65: opcode1 = "pcmpgtw"; break; + case 0x66: opcode1 = "pcmpgtd"; break; + } + prefix[2] = 0; + has_modrm = true; + load = true; + break; case 0x6E: if (prefix[2] == 0x66) { dst_reg_file = SSE; @@ -832,6 +864,24 @@ DISASSEMBLER_ENTRY(cmp, store = true; immediate_bytes = 1; break; + case 0x74: + case 0x75: + case 0x76: + if (prefix[2] == 0x66) { + src_reg_file = dst_reg_file = SSE; + prefix[2] = 0; // clear prefix now it's served its purpose as part of the opcode + } else { + src_reg_file = dst_reg_file = MMX; + } + switch (*instr) { + case 0x74: opcode1 = "pcmpeqb"; break; + case 0x75: opcode1 = "pcmpeqw"; break; + case 0x76: opcode1 = "pcmpeqd"; break; + } + prefix[2] = 0; + has_modrm = true; + load = true; + break; case 0x7C: if (prefix[0] == 0xF2) { opcode1 = "haddps"; @@ -1083,6 +1133,22 @@ DISASSEMBLER_ENTRY(cmp, opcode1 = opcode_tmp.c_str(); } break; + case 0xE0: + case 0xE3: + if (prefix[2] == 0x66) { + src_reg_file = dst_reg_file = SSE; + prefix[2] = 0; // clear prefix now it's served its purpose as part of the opcode + } else { + src_reg_file = dst_reg_file = MMX; + } + switch (*instr) { + case 0xE0: opcode1 = "pavgb"; break; + case 0xE3: opcode1 = "pavgw"; break; + } + prefix[2] = 0; + has_modrm = true; + load = true; + break; case 0xEB: if (prefix[2] == 0x66) { src_reg_file = dst_reg_file = SSE; |