diff options
| -rw-r--r-- | miasm2/arch/x86/arch.py | 9 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 13 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 10 |
3 files changed, 32 insertions, 0 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index a9a59a08..8188cf49 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -4539,6 +4539,15 @@ addop("psadbw", [bs8(0x0f), bs8(0xf6), no_xmm_pref] + addop("psadbw", [bs8(0x0f), bs8(0xf6), pref_66] + rmmod(xmm_reg, rm_arg_xmm_m128)) +addop("pavgb", [bs8(0x0f), bs8(0xe0), no_xmm_pref] + + rmmod(mm_reg, rm_arg_mm_m64)) +addop("pavgb", [bs8(0x0f), bs8(0xe0), pref_66] + + rmmod(xmm_reg, rm_arg_xmm_m128)) +addop("pavgw", [bs8(0x0f), bs8(0xe3), no_xmm_pref] + + rmmod(mm_reg, rm_arg_mm_m64)) +addop("pavgw", [bs8(0x0f), bs8(0xe3), pref_66] + + rmmod(xmm_reg, rm_arg_xmm_m128)) + 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 51fcbe05..5a0f1b6b 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -3518,6 +3518,17 @@ def psadbw(ir, instr, dst, src): return [m2_expr.ExprAff(dst, m2_expr.ExprCompose(*out_dst))], [] +def _average(expr): + assert expr.is_op("avg") and len(expr.args) == 2 + + arg1 = expr.args[0].zeroExtend(expr.size * 2) + arg2 = expr.args[1].zeroExtend(expr.size * 2) + one = m2_expr.ExprInt(1, arg1.size) + # avg(unsigned) = (a + b + 1) >> 1, addition beeing at least on one more bit + return ((arg1 + arg2 + one) >> one)[:expr.size] + +pavgb = vec_vertical_instr('avg', 8, _average) +pavgw = vec_vertical_instr('avg', 16, _average) # Comparisons # @@ -4794,6 +4805,8 @@ mnemo_func = {'mov': mov, # SSE "pmaddwd": pmaddwd, "psadbw": psadbw, + "pavgb": pavgb, + "pavgw": pavgw, # Arithmetic (floating-point) # diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py index 0e6ffdd9..f1f95d46 100644 --- a/test/arch/x86/arch.py +++ b/test/arch/x86/arch.py @@ -3059,6 +3059,16 @@ reg_tests = [ "0ff6d9"), (m32, "00000000 PSADBW XMM0, XMM6", "660ff6c6"), + + (m32, "00000000 PAVGB MM3, MM1", + "0fe0d9"), + (m32, "00000000 PAVGB XMM0, XMM6", + "660fe0c6"), + + (m32, "00000000 PAVGW MM3, MM1", + "0fe3d9"), + (m32, "00000000 PAVGW XMM0, XMM6", + "660fe3c6"), ] |