diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2016-01-04 16:30:32 +0100 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2016-01-06 09:32:02 +0100 |
| commit | b217de3aad8228e467661aada05575412120ebae (patch) | |
| tree | 6d658a76105e17dff0789662287369c9c6eba6b0 | |
| parent | 5b71335511aaf47e2d0e46aef1cfd14234ae45f7 (diff) | |
| download | miasm-b217de3aad8228e467661aada05575412120ebae.tar.gz miasm-b217de3aad8228e467661aada05575412120ebae.zip | |
X86: add unpck[hl]p[sd]
Diffstat (limited to '')
| -rw-r--r-- | miasm2/arch/x86/arch.py | 12 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 41 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 11 |
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"), + ] |