diff options
| -rw-r--r-- | miasm2/arch/x86/arch.py | 17 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 26 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 16 |
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"), + ] |