about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2016-01-04 16:30:32 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2016-01-06 09:32:02 +0100
commitb217de3aad8228e467661aada05575412120ebae (patch)
tree6d658a76105e17dff0789662287369c9c6eba6b0
parent5b71335511aaf47e2d0e46aef1cfd14234ae45f7 (diff)
downloadmiasm-b217de3aad8228e467661aada05575412120ebae.tar.gz
miasm-b217de3aad8228e467661aada05575412120ebae.zip
X86: add unpck[hl]p[sd]
Diffstat (limited to '')
-rw-r--r--miasm2/arch/x86/arch.py12
-rw-r--r--miasm2/arch/x86/sem.py41
-rw-r--r--test/arch/x86/arch.py11
3 files changed, 64 insertions, 0 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py
index 42171c63..d364bc32 100644
--- a/miasm2/arch/x86/arch.py
+++ b/miasm2/arch/x86/arch.py
@@ -4160,6 +4160,18 @@ addop("punpcklqdq", [bs8(0x0f), bs8(0x6c), pref_66] +
       rmmod(xmm_reg, rm_arg_xmm))
 
 
+addop("unpckhps", [bs8(0x0f), bs8(0x15), no_xmm_pref] +
+      rmmod(xmm_reg, rm_arg_xmm))
+addop("unpckhpd", [bs8(0x0f), bs8(0x15), pref_66] +
+      rmmod(xmm_reg, rm_arg_xmm))
+
+
+addop("unpcklps", [bs8(0x0f), bs8(0x14), no_xmm_pref] +
+      rmmod(xmm_reg, rm_arg_xmm))
+addop("unpcklpd", [bs8(0x0f), bs8(0x14), pref_66] +
+      rmmod(xmm_reg, rm_arg_xmm))
+
+
 
 addop("pinsrb", [bs8(0x0f), bs8(0x3a), bs8(0x20), pref_66] +
       rmmod(xmm_reg, rm_arg_reg_m08) + [u08])
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py
index f32d7758..6501d0ff 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -3831,6 +3831,42 @@ def pextrq(ir, instr, a, b, c):
     return pextr(ir, instr, a, b, c, 64)
 
 
+def unpckhps(ir, instr, a, b):
+    e = []
+    src = m2_expr.ExprCompose([(a[64:96], 0, 32),
+                               (b[64:96], 32, 64),
+                               (a[96:128], 64, 96),
+                               (b[96:128], 96, 128)])
+    e.append(m2_expr.ExprAff(a, src))
+    return e, []
+
+
+def unpckhpd(ir, instr, a, b):
+    e = []
+    src = m2_expr.ExprCompose([(a[64:128], 0, 64),
+                               (b[64:128], 64, 128)])
+    e.append(m2_expr.ExprAff(a, src))
+    return e, []
+
+
+def unpcklps(ir, instr, a, b):
+    e = []
+    src = m2_expr.ExprCompose([(a[0:32], 0, 32),
+                               (b[0:32], 32, 64),
+                               (a[32:64], 64, 96),
+                               (b[32:64], 96, 128)])
+    e.append(m2_expr.ExprAff(a, src))
+    return e, []
+
+
+def unpcklpd(ir, instr, a, b):
+    e = []
+    src = m2_expr.ExprCompose([(a[0:64], 0, 64),
+                               (b[0:64], 64, 128)])
+    e.append(m2_expr.ExprAff(a, src))
+    return e, []
+
+
 mnemo_func = {'mov': mov,
               'xchg': xchg,
               'movzx': movzx,
@@ -4287,6 +4323,11 @@ mnemo_func = {'mov': mov,
               "pextrd": pextrd,
               "pextrq": pextrq,
 
+              "unpckhps": unpckhps,
+              "unpckhpd": unpckhpd,
+              "unpcklps": unpcklps,
+              "unpcklpd": unpcklpd,
+
               }
 
 
diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py
index 00322037..a00c33cf 100644
--- a/test/arch/x86/arch.py
+++ b/test/arch/x86/arch.py
@@ -2799,6 +2799,17 @@ reg_tests = [
     (m64, "00000000    PEXTRQ     QWORD PTR [RDX], XMM2, 0x5",
     "66480F3A161205"),
 
+
+    (m32, "00000000    UNPCKHPS   XMM2, XMMWORD PTR [EDX]",
+     "0f1512"),
+    (m32, "00000000    UNPCKHPD   XMM2, XMMWORD PTR [EDX]",
+     "660f1512"),
+
+    (m32, "00000000    UNPCKLPS   XMM2, XMMWORD PTR [EDX]",
+     "0f1412"),
+    (m32, "00000000    UNPCKLPD   XMM2, XMMWORD PTR [EDX]",
+     "660f1412"),
+
 ]