about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2015-12-24 01:43:22 +0100
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2015-12-24 18:38:19 +0100
commitf95a9cb25ef0c94f9b0af8952f459e346de9b5a2 (patch)
treec7f513ae36e71f030a9c852e5b55aa135671a9fd
parent7b23f2d519bc80870ea9d79c5cda02cef5141ce6 (diff)
downloadmiasm-f95a9cb25ef0c94f9b0af8952f459e346de9b5a2.tar.gz
miasm-f95a9cb25ef0c94f9b0af8952f459e346de9b5a2.zip
X86: add pextr
-rw-r--r--miasm2/arch/x86/arch.py19
-rw-r--r--miasm2/arch/x86/sem.py32
-rw-r--r--test/arch/x86/arch.py26
3 files changed, 77 insertions, 0 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py
index b996f4f0..42171c63 100644
--- a/miasm2/arch/x86/arch.py
+++ b/miasm2/arch/x86/arch.py
@@ -4174,6 +4174,25 @@ addop("pinsrw", [bs8(0x0f), bs8(0xc4), pref_66] +
       rmmod(xmm_reg, rm_arg_reg_m16) + [u08])
 
 
+addop("pextrb", [bs8(0x0f), bs8(0x3a), bs8(0x14), pref_66] +
+      rmmod(xmm_reg, rm_arg_reg_m08) + [u08], [rm_arg_reg_m08, xmm_reg, u08])
+addop("pextrd", [bs8(0x0f), bs8(0x3a), bs8(0x16), pref_66, bs_opmode32] +
+      rmmod(xmm_reg, rm_arg) + [u08], [rm_arg, xmm_reg, u08])
+addop("pextrq", [bs8(0x0f), bs8(0x3a), bs8(0x16), pref_66] +
+      rmmod(xmm_reg, rm_arg_m64) + [bs_opmode64] + [u08], [rm_arg_m64, xmm_reg, u08])
+
+
+addop("pextrw", [bs8(0x0f), bs8(0x3a), bs8(0x15), pref_66] +
+      rmmod(xmm_reg, rm_arg_m16) + [u08], [rm_arg_m16, xmm_reg, u08])
+#addop("pextrw", [bs8(0x0f), bs8(0x3a), bs8(0x15), no_xmm_pref] +
+#      rmmod(mm_reg, rm_arg_m16) + [u08], [rm_arg_m16, mm_reg, u08])
+
+addop("pextrw", [bs8(0x0f), bs8(0xc5), no_xmm_pref] +
+      rmmod(mm_reg, rm_arg_reg_m16) + [u08], [rm_arg_reg_m16, mm_reg, u08])
+addop("pextrw", [bs8(0x0f), bs8(0xc5), pref_66] +
+      rmmod(xmm_reg, rm_arg_reg_m16) + [u08], [rm_arg_reg_m16, xmm_reg, u08])
+
+
 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 9b20196d..7b6d0cb1 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -3648,6 +3648,33 @@ def pinsrq(ir, instr, a, b, c):
     return pinsr(ir, instr, a, b, c, 64)
 
 
+def pextr(ir, instr, a, b, c, size):
+    e = []
+
+    mask = {8 : 0xF,
+           16 : 0x7,
+           32 : 0x3,
+           64 : 0x1}[size]
+
+    sel = (int(c.arg) & mask) * size
+    e.append(m2_expr.ExprAff(a, b[sel:sel+size].zeroExtend(a.size)))
+
+    return e, []
+
+
+def pextrb(ir, instr, a, b, c):
+    return pextr(ir, instr, a, b, c, 8)
+
+def pextrw(ir, instr, a, b, c):
+    return pextr(ir, instr, a, b, c, 16)
+
+def pextrd(ir, instr, a, b, c):
+    return pextr(ir, instr, a, b, c, 32)
+
+def pextrq(ir, instr, a, b, c):
+    return pextr(ir, instr, a, b, c, 64)
+
+
 
 mnemo_func = {'mov': mov,
               'xchg': xchg,
@@ -4100,6 +4127,11 @@ mnemo_func = {'mov': mov,
               "pinsrd" : pinsrd,
               "pinsrq" : pinsrq,
 
+              "pextrb" : pextrb,
+              "pextrw" : pextrw,
+              "pextrd" : pextrd,
+              "pextrq" : pextrq,
+
               }
 
 
diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py
index c35a630c..00322037 100644
--- a/test/arch/x86/arch.py
+++ b/test/arch/x86/arch.py
@@ -2773,6 +2773,32 @@ reg_tests = [
     (m64, "00000000    PINSRQ     XMM2, QWORD PTR [RDX], 0x5",
     "66480F3A221205"),
 
+
+
+
+
+    (m32, "00000000    PEXTRB     BYTE PTR [EDX], XMM2, 0x5",
+    "660F3A141205"),
+    (m32, "00000000    PEXTRB     EAX, XMM2, 0x5",
+    "660F3A14D005"),
+
+    (m32, "00000000    PEXTRW     WORD PTR [EDX], XMM2, 0x5",
+    "660F3A151205"),
+
+
+    (m32, "00000000    PEXTRW     WORD PTR [EDX], MM2, 0x5",
+    "0FC51205"),
+    (m32, "00000000    PEXTRW     WORD PTR [EDX], XMM2, 0x5",
+    "660FC51205"),
+
+    (m32, "00000000    PEXTRD     DWORD PTR [EDX], XMM2, 0x5",
+    "660F3A161205"),
+
+    (m64, "00000000    PEXTRD     DWORD PTR [RDX], XMM2, 0x5",
+    "660F3A161205"),
+    (m64, "00000000    PEXTRQ     QWORD PTR [RDX], XMM2, 0x5",
+    "66480F3A161205"),
+
 ]