about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/arch/x86/arch.py9
-rw-r--r--miasm2/arch/x86/sem.py13
-rw-r--r--test/arch/x86/arch.py10
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"),
 ]