diff options
| -rw-r--r-- | miasm2/arch/x86/arch.py | 18 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 32 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 20 |
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"), + ] |