diff options
Diffstat (limited to '')
| -rw-r--r-- | miasm2/arch/x86/arch.py | 30 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 33 |
2 files changed, 40 insertions, 23 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index 402644d2..fde7bff7 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -3573,16 +3573,9 @@ addop("divsd", [bs8(0x0f), bs8(0x5e), pref_f2] + rmmod(xmm_reg, rm_arg_xmm_m64)) addop("pminsw", [bs8(0x0f), bs8(0xea), no_xmm_pref] + rmmod(mm_reg, rm_arg_mm)) addop("pminsw", [bs8(0x0f), bs8(0xea), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) - -addop("pxor", [bs8(0x0f), bs8(0xef), xmm] + rmmod(xmm_reg, rm_arg_xmm)) - addop("ucomiss", [bs8(0x0f), bs8(0x2e), no_xmm_pref] + rmmod(xmm_reg, rm_arg_xmm_m32)) addop("ucomisd", [bs8(0x0f), bs8(0x2e), pref_66] + rmmod(xmm_reg, rm_arg_xmm_m64)) -addop("andps", [bs8(0x0f), bs8(0x54), no_xmm_pref] + rmmod(xmm_reg, rm_arg_xmm)) -addop("andpd", [bs8(0x0f), bs8(0x54), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) - - addop("maxsd", [bs8(0x0f), bs8(0x5f), pref_f2] + rmmod(xmm_reg, rm_arg_xmm_m64)) addop("maxss", [bs8(0x0f), bs8(0x5f), pref_f3] + rmmod(xmm_reg, rm_arg_xmm_m32)) @@ -3797,7 +3790,6 @@ addop("xor", [bs("001100"), swapargs, w8] + addop("xgetbv", [bs8(0x0f), bs8(0x01), bs8(0xd0)]) -#addop("pand", [bs8(0x0f), bs8(0xdb), pref_66])# + rmmod(rmreg, rm_arg)) #### MMX/SSE/AVX operations #### Categories are the same than here: https://software.intel.com/sites/landingpage/IntrinsicsGuide/ @@ -3872,10 +3864,16 @@ addop("divpd", [bs8(0x0f), bs8(0x5e), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) ### ## XOR -# SSE -addop("xorpd", [bs8(0x0f), bs8(0x57), xmm] + rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode16]) -addop("xorps", [bs8(0x0f), bs8(0x57), xmm] + rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode32]) -addop("xorps", [bs8(0x0f), bs8(0x57), xmm] + rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode64]) +addop("xorps", [bs8(0x0f), bs8(0x57), no_xmm_pref] + rmmod(xmm_reg, rm_arg_xmm)) +addop("xorpd", [bs8(0x0f), bs8(0x57), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) + +## AND +addop("andps", [bs8(0x0f), bs8(0x54), no_xmm_pref] + rmmod(xmm_reg, rm_arg_xmm)) +addop("andpd", [bs8(0x0f), bs8(0x54), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) + +## OR +addop("orps", [bs8(0x0f), bs8(0x56), no_xmm_pref] + rmmod(xmm_reg, rm_arg_xmm)) +addop("orpd", [bs8(0x0f), bs8(0x56), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) ## AND # MMX @@ -3893,6 +3891,14 @@ addop("por", [bs8(0x0f), bs8(0xeb), no_xmm_pref] + addop("por", [bs8(0x0f), bs8(0xeb), pref_66] + rmmod(xmm_reg, rm_arg_xmm), [xmm_reg, rm_arg_xmm]) +## XOR +# MMX +addop("pxor", [bs8(0x0f), bs8(0xef), no_xmm_pref] + + rmmod(mm_reg, rm_arg_mm)) +# MMX +addop("pxor", [bs8(0x0f), bs8(0xef), pref_66] + + rmmod(xmm_reg, rm_arg_xmm)) + ### Convert ### SS = single precision ### SD = double precision diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index 2e7eac6b..8e85e635 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -293,10 +293,6 @@ def xor(ir, instr, a, b): def pxor(ir, instr, a, b): e = [] - if isinstance(a, m2_expr.ExprMem): - a = m2_expr.ExprMem(a.arg, b.size) - if isinstance(b, m2_expr.ExprMem): - b = m2_expr.ExprMem(b.arg, a.size) c = a ^ b e.append(m2_expr.ExprAff(a, c)) return e, [] @@ -3233,13 +3229,24 @@ def movapd(ir, instr, a, b): return [m2_expr.ExprAff(a, b)], [] +def andps(ir, instr, a, b): + e = [] + e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('&', a, b))) + return e, [] + + +def orps(ir, instr, a, b): + e = [] + e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('|', a, b))) + return e, [] + + def xorps(ir, instr, a, b): e = [] - if isinstance(b, m2_expr.ExprMem): - b = m2_expr.ExprMem(b.arg, a.size) e.append(m2_expr.ExprAff(a, m2_expr.ExprOp('^', a, b))) return e, [] + def rdmsr(ir, instr): msr_addr = m2_expr.ExprId('MSR') + m2_expr.ExprInt32(8) * mRCX[instr.mode][:32] e = [] @@ -3375,12 +3382,11 @@ def pand(ir, instr, a, b): e.append(m2_expr.ExprAff(a, c)) return e, [] + +def por(ir, instr, a, b): e = [] - if isinstance(a, m2_expr.ExprMem): - a = m2_expr.ExprMem(a.arg, b.size) - if isinstance(b, m2_expr.ExprMem): - b = m2_expr.ExprMem(b.arg, a.size) - e.append(m2_expr.ExprAff(a, b)) + c = a | b + e.append(m2_expr.ExprAff(a, c)) return e, [] @@ -3836,6 +3842,10 @@ mnemo_func = {'mov': mov, "movupd": movapd, # XXX TODO alignement check "movaps": movapd, # XXX TODO alignement check "movups": movapd, # XXX TODO alignement check + "andps": andps, + "andpd": andps, + "orps": orps, + "orpd": orps, "xorps": xorps, "xorpd": xorps, @@ -3930,6 +3940,7 @@ mnemo_func = {'mov': mov, ### "pand": pand, + "por": por, "rdmsr": rdmsr, "wrmsr": wrmsr, |