about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/arch/x86/arch.py18
-rw-r--r--miasm2/arch/x86/sem.py32
-rw-r--r--test/arch/x86/arch.py20
3 files changed, 70 insertions, 0 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py
index a084f9cb..1ef46499 100644
--- a/miasm2/arch/x86/arch.py
+++ b/miasm2/arch/x86/arch.py
@@ -4070,6 +4070,24 @@ addop("pcmpeqd", [bs8(0x0f), bs8(0x76), pref_66] +
       rmmod(xmm_reg, rm_arg_xmm))
 
 
+addop("punpckhbw", [bs8(0x0f), bs8(0x68), no_xmm_pref] +
+      rmmod(mm_reg, rm_arg_mm))
+addop("punpckhbw", [bs8(0x0f), bs8(0x68), pref_66] +
+      rmmod(xmm_reg, rm_arg_xmm))
+
+addop("punpckhwd", [bs8(0x0f), bs8(0x69), no_xmm_pref] +
+      rmmod(mm_reg, rm_arg_mm))
+addop("punpckhwd", [bs8(0x0f), bs8(0x69), pref_66] +
+      rmmod(xmm_reg, rm_arg_xmm))
+
+addop("punpckhdq", [bs8(0x0f), bs8(0x6a), no_xmm_pref] +
+      rmmod(mm_reg, rm_arg_mm))
+addop("punpckhdq", [bs8(0x0f), bs8(0x6a), pref_66] +
+      rmmod(xmm_reg, rm_arg_xmm))
+
+addop("punpckhqdq", [bs8(0x0f), bs8(0x6d), 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 f7f6ea75..18634551 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -3582,6 +3582,33 @@ def pcmpeqw(ir, instr, a, b):
 def pcmpeqd(ir, instr, a, b):
     return pcmpeq(ir, instr, a, b, 32)
 
+
+
+
+def punpckh(ir, instr, a, b, size):
+    e = []
+    for i in xrange(a.size / (2 * size)):
+        src1 = a[size * i + a.size / 2 : size * i + a.size / 2 + size]
+        src2 = b[size * i + a.size / 2 : size * i + a.size / 2 + size]
+        e.append(m2_expr.ExprAff(a[size * 2 * i : size * 2 * i + size], src1))
+        e.append(m2_expr.ExprAff(a[size * (2 * i + 1) : size * (2 * i + 1) + size], src2))
+    return e, []
+
+
+def punpckhbw(ir, instr, a, b):
+    return punpckh(ir, instr, a, b, 8)
+
+def punpckhwd(ir, instr, a, b):
+    return punpckh(ir, instr, a, b, 16)
+
+def punpckhdq(ir, instr, a, b):
+    return punpckh(ir, instr, a, b, 32)
+
+def punpckhqdq(ir, instr, a, b):
+    return punpckh(ir, instr, a, b, 64)
+
+
+
 mnemo_func = {'mov': mov,
               'xchg': xchg,
               'movzx': movzx,
@@ -4017,6 +4044,11 @@ mnemo_func = {'mov': mov,
               "pcmpeqw" : pcmpeqw,
               "pcmpeqd" : pcmpeqd,
 
+              "punpckhbw" : punpckhbw,
+              "punpckhwd" : punpckhwd,
+              "punpckhdq" : punpckhdq,
+              "punpckhqdq" : punpckhqdq,
+
               }
 
 
diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py
index 1c18fc3a..8a9402a0 100644
--- a/test/arch/x86/arch.py
+++ b/test/arch/x86/arch.py
@@ -2691,6 +2691,26 @@ reg_tests = [
     (m32, "00000000    PCMPEQD    XMM2, XMMWORD PTR [EDX]",
     "660F7612"),
 
+
+    (m32, "00000000    PUNPCKHBW  MM2, QWORD PTR [EDX]",
+    "0F6812"),
+    (m32, "00000000    PUNPCKHBW  XMM2, XMMWORD PTR [EDX]",
+    "660F6812"),
+
+    (m32, "00000000    PUNPCKHWD  MM2, QWORD PTR [EDX]",
+    "0F6912"),
+    (m32, "00000000    PUNPCKHWD  XMM2, XMMWORD PTR [EDX]",
+    "660F6912"),
+
+    (m32, "00000000    PUNPCKHDQ  MM2, QWORD PTR [EDX]",
+    "0F6A12"),
+    (m32, "00000000    PUNPCKHDQ  XMM2, XMMWORD PTR [EDX]",
+    "660F6A12"),
+
+
+    (m32, "00000000    PUNPCKHQDQ XMM2, XMMWORD PTR [EDX]",
+    "660F6D12"),
+
 ]