about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2015-12-23 22:08:43 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2015-12-24 18:38:19 +0100
commit7dd9de865892837d275f0ef0a55f70d8df55fe43 (patch)
tree830af67a279489dd0f55294984353af77d991744
parent8f5cd4efc8bc1442a413d7909ee3ee5edc486321 (diff)
downloadmiasm-7dd9de865892837d275f0ef0a55f70d8df55fe43.tar.gz
miasm-7dd9de865892837d275f0ef0a55f70d8df55fe43.zip
X86: add pcmpeq
-rw-r--r--miasm2/arch/x86/arch.py17
-rw-r--r--miasm2/arch/x86/sem.py26
-rw-r--r--test/arch/x86/arch.py16
3 files changed, 59 insertions, 0 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py
index 95d9db0a..a084f9cb 100644
--- a/miasm2/arch/x86/arch.py
+++ b/miasm2/arch/x86/arch.py
@@ -4054,6 +4054,23 @@ addop("pminud", [bs8(0x0f), bs8(0x38), bs8(0x3b), pref_66] +
       rmmod(xmm_reg, rm_arg_xmm))
 
 
+addop("pcmpeqb", [bs8(0x0f), bs8(0x74), no_xmm_pref] +
+      rmmod(mm_reg, rm_arg_mm))
+addop("pcmpeqb", [bs8(0x0f), bs8(0x74), pref_66] +
+      rmmod(xmm_reg, rm_arg_xmm))
+
+addop("pcmpeqw", [bs8(0x0f), bs8(0x75), no_xmm_pref] +
+      rmmod(mm_reg, rm_arg_mm))
+addop("pcmpeqw", [bs8(0x0f), bs8(0x75), pref_66] +
+      rmmod(xmm_reg, rm_arg_xmm))
+
+addop("pcmpeqd", [bs8(0x0f), bs8(0x76), no_xmm_pref] +
+      rmmod(mm_reg, rm_arg_mm))
+addop("pcmpeqd", [bs8(0x0f), bs8(0x76), pref_66] +
+      rmmod(xmm_reg, rm_arg_xmm))
+
+
+
 mn_x86.bintree = factor_one_bit(mn_x86.bintree)
 # mn_x86.bintree = factor_fields_all(mn_x86.bintree)
 """
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py
index ec0598d7..f7f6ea75 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -3561,6 +3561,27 @@ def pminud(ir, instr, a, b):
     return pminu(ir, instr, a, b, 32)
 
 
+
+def pcmpeq(ir, instr, a, b, size):
+    e = []
+    for i in xrange(0, a.size, size):
+        test = a[i:i+size] - b[i:i+size]
+        e.append(m2_expr.ExprAff(a[i:i+size],
+                                 m2_expr.ExprCond(test,
+                                                  m2_expr.ExprInt(0, size),
+                                                  m2_expr.ExprInt(-1, size))))
+    return e, []
+
+
+def pcmpeqb(ir, instr, a, b):
+    return pcmpeq(ir, instr, a, b, 8)
+
+def pcmpeqw(ir, instr, a, b):
+    return pcmpeq(ir, instr, a, b, 16)
+
+def pcmpeqd(ir, instr, a, b):
+    return pcmpeq(ir, instr, a, b, 32)
+
 mnemo_func = {'mov': mov,
               'xchg': xchg,
               'movzx': movzx,
@@ -3991,6 +4012,11 @@ mnemo_func = {'mov': mov,
               "pminub" : pminub,
               "pminuw" : pminuw,
               "pminud" : pminud,
+
+              "pcmpeqb" : pcmpeqb,
+              "pcmpeqw" : pcmpeqw,
+              "pcmpeqd" : pcmpeqd,
+
               }
 
 
diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py
index b10497ae..1c18fc3a 100644
--- a/test/arch/x86/arch.py
+++ b/test/arch/x86/arch.py
@@ -2675,6 +2675,22 @@ reg_tests = [
     (m32, "00000000    PMINUD     XMM2, XMMWORD PTR [EDX]",
     "660F383B12"),
 
+
+    (m32, "00000000    PCMPEQB    MM2, QWORD PTR [EDX]",
+    "0F7412"),
+    (m32, "00000000    PCMPEQB    XMM2, XMMWORD PTR [EDX]",
+    "660F7412"),
+
+    (m32, "00000000    PCMPEQW    MM2, QWORD PTR [EDX]",
+    "0F7512"),
+    (m32, "00000000    PCMPEQW    XMM2, XMMWORD PTR [EDX]",
+    "660F7512"),
+
+    (m32, "00000000    PCMPEQD    MM2, QWORD PTR [EDX]",
+    "0F7612"),
+    (m32, "00000000    PCMPEQD    XMM2, XMMWORD PTR [EDX]",
+    "660F7612"),
+
 ]