summaryrefslogtreecommitdiff
path: root/disassembler
diff options
context:
space:
mode:
authorAart Bik <ajcbik@google.com>2017-04-03 14:09:01 -0700
committerAart Bik <ajcbik@google.com>2017-04-04 09:15:45 -0700
commit8939c6474a34eb6d642db8fecb8b3a5c3194e464 (patch)
treea0a2db32a5147416d796907a3977dd29e04e9328 /disassembler
parent08ae45625d059891754e3c3ad63a5e6cae80b96b (diff)
SIMD pcmpgtb,w,d,q for x86/x86_64
Rationale: Enables fast compare gt. Test: assembler_x86[_64]_test Change-Id: I0a069649480529f3fec2c2b100e2aaaa2cd79820
Diffstat (limited to 'disassembler')
-rw-r--r--disassembler/disassembler_x86.cc32
1 files changed, 32 insertions, 0 deletions
diff --git a/disassembler/disassembler_x86.cc b/disassembler/disassembler_x86.cc
index f5c3ad20cc..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;