diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-12-23 22:08:43 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-12-24 18:38:19 +0100 |
| commit | 7dd9de865892837d275f0ef0a55f70d8df55fe43 (patch) | |
| tree | 830af67a279489dd0f55294984353af77d991744 | |
| parent | 8f5cd4efc8bc1442a413d7909ee3ee5edc486321 (diff) | |
| download | miasm-7dd9de865892837d275f0ef0a55f70d8df55fe43.tar.gz miasm-7dd9de865892837d275f0ef0a55f70d8df55fe43.zip | |
X86: add pcmpeq
| -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"), + ] |