diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-12-24 01:43:22 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-12-24 18:38:19 +0100 |
| commit | f95a9cb25ef0c94f9b0af8952f459e346de9b5a2 (patch) | |
| tree | c7f513ae36e71f030a9c852e5b55aa135671a9fd | |
| parent | 7b23f2d519bc80870ea9d79c5cda02cef5141ce6 (diff) | |
| download | miasm-f95a9cb25ef0c94f9b0af8952f459e346de9b5a2.tar.gz miasm-f95a9cb25ef0c94f9b0af8952f459e346de9b5a2.zip | |
X86: add pextr
| -rw-r--r-- | miasm2/arch/x86/arch.py | 19 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 32 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 26 |
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"), + ] |