diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-12-23 21:49:52 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-12-24 18:38:19 +0100 |
| commit | 865111f69ce947216cbdbc7b70f84595bfb3fb0d (patch) | |
| tree | efee26e695780a66edb1d56c6958cc9151fb1fac | |
| parent | d8dd590fddd67466b0f919f2cfc3702a221cbf1b (diff) | |
| download | miasm-865111f69ce947216cbdbc7b70f84595bfb3fb0d.tar.gz miasm-865111f69ce947216cbdbc7b70f84595bfb3fb0d.zip | |
X86: add pminu
Diffstat (limited to '')
| -rw-r--r-- | miasm2/arch/x86/arch.py | 12 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 29 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 12 |
3 files changed, 53 insertions, 0 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index 9bc8b3cc..95d9db0a 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -4042,6 +4042,18 @@ addop("pmaxud", [bs8(0x0f), bs8(0x38), bs8(0x3f), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) +addop("pminub", [bs8(0x0f), bs8(0xda), no_xmm_pref] + + rmmod(mm_reg, rm_arg_mm)) +addop("pminub", [bs8(0x0f), bs8(0xda), pref_66] + + rmmod(xmm_reg, rm_arg_xmm)) + +addop("pminuw", [bs8(0x0f), bs8(0x38), bs8(0x3a), pref_66] + + rmmod(xmm_reg, rm_arg_xmm)) + +addop("pminud", [bs8(0x0f), bs8(0x38), bs8(0x3b), 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 dd3f9bdd..ec0598d7 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -3536,6 +3536,31 @@ def pmaxud(ir, instr, a, b): return pmaxu(ir, instr, a, b, 32) +def pminu(ir, instr, a, b, size): + e = [] + for i in xrange(0, a.size, size): + op1 = a[i:i+size] + op2 = b[i:i+size] + res = op1 - op2 + # Compote CF in @res = @op1 - @op2 + ret = (((op1 ^ op2) ^ res) ^ ((op1 ^ res) & (op1 ^ op2))).msb() + + e.append(m2_expr.ExprAff(a[i:i+size], + m2_expr.ExprCond(ret, + a[i:i+size], + b[i:i+size]))) + return e, [] + +def pminub(ir, instr, a, b): + return pminu(ir, instr, a, b, 8) + +def pminuw(ir, instr, a, b): + return pminu(ir, instr, a, b, 16) + +def pminud(ir, instr, a, b): + return pminu(ir, instr, a, b, 32) + + mnemo_func = {'mov': mov, 'xchg': xchg, 'movzx': movzx, @@ -3962,6 +3987,10 @@ mnemo_func = {'mov': mov, "pmaxub" : pmaxub, "pmaxuw" : pmaxuw, "pmaxud" : pmaxud, + + "pminub" : pminub, + "pminuw" : pminuw, + "pminud" : pminud, } diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py index 27b426e2..b10497ae 100644 --- a/test/arch/x86/arch.py +++ b/test/arch/x86/arch.py @@ -2663,6 +2663,18 @@ reg_tests = [ (m32, "00000000 PMAXUD XMM2, XMMWORD PTR [EDX]", "660F383F12"), + + + (m32, "00000000 PMINUB MM2, QWORD PTR [EDX]", + "0FDA12"), + (m32, "00000000 PMINUB XMM2, XMMWORD PTR [EDX]", + "660FDA12"), + + (m32, "00000000 PMINUW XMM2, XMMWORD PTR [EDX]", + "660F383A12"), + (m32, "00000000 PMINUD XMM2, XMMWORD PTR [EDX]", + "660F383B12"), + ] |