diff options
| author | Ajax <commial@gmail.com> | 2018-07-10 13:49:31 +0200 |
|---|---|---|
| committer | Ajax <commial@gmail.com> | 2018-07-10 14:14:35 +0200 |
| commit | 11eaa5c136a8c1801d80b890d5d3855ccb440586 (patch) | |
| tree | 5ad714e6ac1fd5cd1afc125a2a5d9b35cfd4edaf | |
| parent | 10003637521ecd370744f92ebb8ea023b31f5db0 (diff) | |
| download | miasm-11eaa5c136a8c1801d80b890d5d3855ccb440586.tar.gz miasm-11eaa5c136a8c1801d80b890d5d3855ccb440586.zip | |
Add new SSE instruction description and updates old ones
| -rw-r--r-- | miasm2/arch/x86/arch.py | 86 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 40 |
2 files changed, 111 insertions, 15 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index 815eaee6..bf872667 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -3771,7 +3771,8 @@ addop("movq", [bs8(0x0f), bs8(0xd6), pref_66] + addop("movmskps", [bs8(0x0f), bs8(0x50), no_xmm_pref] + rmmod(reg_modrm, rm_arg_xmm_reg)) - +addop("movmskpd", [bs8(0x0f), bs8(0x50), pref_66] + + rmmod(reg_modrm, rm_arg_xmm_reg)) addop("addss", [bs8(0x0f), bs8(0x58), pref_f3] + rmmod(xmm_reg, rm_arg_xmm_m32)) addop("addsd", [bs8(0x0f), bs8(0x58), pref_f2] + rmmod(xmm_reg, rm_arg_xmm_m64)) @@ -3792,10 +3793,6 @@ addop("pminsw", [bs8(0x0f), bs8(0xea), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) addop("ucomiss", [bs8(0x0f), bs8(0x2e), no_xmm_pref] + rmmod(xmm_reg, rm_arg_xmm_m32)) addop("ucomisd", [bs8(0x0f), bs8(0x2e), pref_66] + rmmod(xmm_reg, rm_arg_xmm_m64)) -addop("maxsd", [bs8(0x0f), bs8(0x5f), pref_f2] + rmmod(xmm_reg, rm_arg_xmm_m64)) -addop("maxss", [bs8(0x0f), bs8(0x5f), pref_f3] + rmmod(xmm_reg, rm_arg_xmm_m32)) - - addop("movzx", [bs8(0x0f), bs("1011011"), w8, sx] + rmmod(rmreg, rm_arg_sx)) addop("mul", [bs('1111011'), w8] + rmmod(d4, rm_arg_w8)) @@ -4021,9 +4018,9 @@ addop("xgetbv", [bs8(0x0f), bs8(0x01), bs8(0xd0)]) addop("movapd", [bs8(0x0f), bs("0010100"), swapargs] + rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode16], [xmm_reg, rm_arg_xmm]) addop("movaps", [bs8(0x0f), bs("0010100"), swapargs] - + rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode32], [xmm_reg, rm_arg_xmm]) + + rmmod(xmm_reg, rm_arg_xmm_m128) + [bs_opmode32], [xmm_reg, rm_arg_xmm_m128]) addop("movaps", [bs8(0x0f), bs("0010100"), swapargs] - + rmmod(xmm_reg, rm_arg_xmm) + [bs_opmode64], [xmm_reg, rm_arg_xmm]) + + rmmod(xmm_reg, rm_arg_xmm_m128) + [bs_opmode64], [xmm_reg, rm_arg_xmm_m128]) addop("movdqu", [bs8(0x0f), bs("011"), swapargs, bs("1111"), pref_f3] + rmmod(xmm_reg, rm_arg_xmm), [xmm_reg, rm_arg_xmm]) addop("movdqa", [bs8(0x0f), bs("011"), swapargs, bs("1111"), pref_66] @@ -4045,7 +4042,8 @@ addop("movlhps", [bs8(0x0f), bs8(0x16), no_xmm_pref] + addop("movdq2q", [bs8(0x0f), bs8(0xd6), pref_f2] + rmmod(mm_reg, rm_arg_xmm_reg), [mm_reg, rm_arg_xmm_reg]) - +addop("movq2dq", [bs8(0x0f), bs8(0xd6), pref_f3] + + rmmod(xmm_reg, rm_arg_mm)) ## Additions # SSE @@ -4144,13 +4142,54 @@ addop("pxor", [bs8(0x0f), bs8(0xef), no_xmm_pref] + addop("pxor", [bs8(0x0f), bs8(0xef), pref_66] + rmmod(xmm_reg, rm_arg_xmm)) +### Comparisons (floating-point) +### +addop("minps", [bs8(0x0f), bs8(0x5d), no_xmm_pref] + rmmod(xmm_reg, + rm_arg_xmm_m128)) +addop("minss", [bs8(0x0f), bs8(0x5d), pref_f3] + rmmod(xmm_reg, + rm_arg_xmm_m32)) +addop("minpd", [bs8(0x0f), bs8(0x5d), pref_66] + rmmod(xmm_reg, + rm_arg_xmm_m128)) +addop("minsd", [bs8(0x0f), bs8(0x5d), pref_f2] + rmmod(xmm_reg, + rm_arg_xmm_m64)) +addop("maxps", [bs8(0x0f), bs8(0x5f), no_xmm_pref] + rmmod(xmm_reg, + rm_arg_xmm_m128)) +addop("maxpd", [bs8(0x0f), bs8(0x5f), pref_66] + rmmod(xmm_reg, + rm_arg_xmm_m128)) +addop("maxsd", [bs8(0x0f), bs8(0x5f), pref_f2] + rmmod(xmm_reg, rm_arg_xmm_m64)) +addop("maxss", [bs8(0x0f), bs8(0x5f), pref_f3] + rmmod(xmm_reg, rm_arg_xmm_m32)) + +for cond_name, value in [ + ("eq", 0x00), + ("lt", 0x01), + ("le", 0x02), + ("unord", 0x03), + ("neq", 0x04), + ("nlt", 0x05), + ("nle", 0x06), + ("ord", 0x07), +]: + addop("cmp%sps" % cond_name, [bs8(0x0f), bs8(0xc2), no_xmm_pref] + + rmmod(xmm_reg, rm_arg_xmm_m64) + [bs8(value)]) + addop("cmp%spd" % cond_name, [bs8(0x0f), bs8(0xc2), pref_66] + + rmmod(xmm_reg, rm_arg_xmm_m64) + [bs8(value)]) + addop("cmp%sss" % cond_name, [bs8(0x0f), bs8(0xc2), pref_f3] + + rmmod(xmm_reg, rm_arg_xmm_m32) + [bs8(value)]) + addop("cmp%ssd" % cond_name, [bs8(0x0f), bs8(0xc2), pref_f2] + + rmmod(xmm_reg, rm_arg_xmm_m32) + [bs8(value)]) + + + addop("pshufb", [bs8(0x0f), bs8(0x38), bs8(0x00), no_xmm_pref] + - rmmod(mm_reg, rm_arg_mm)) + rmmod(mm_reg, rm_arg_mm_m64)) addop("pshufb", [bs8(0x0f), bs8(0x38), bs8(0x00), pref_66] + - rmmod(xmm_reg, rm_arg_xmm)) + rmmod(xmm_reg, rm_arg_xmm_m128)) addop("pshufd", [bs8(0x0f), bs8(0x70), pref_66] + - rmmod(xmm_reg, rm_arg_xmm) + [u08]) - + rmmod(xmm_reg, rm_arg_xmm_m128) + [u08]) +addop("pshuflw", [bs8(0x0f), bs8(0x70), pref_f2] + + rmmod(xmm_reg, rm_arg_xmm_m128) + [u08]) +addop("pshufhw", [bs8(0x0f), bs8(0x70), pref_f3] + + rmmod(xmm_reg, rm_arg_xmm_m128) + [u08]) ### Convert @@ -4241,10 +4280,29 @@ addop("psrlw", [bs8(0x0f), bs8(0x71), pref_66] + rmmod(d2, rm_arg_xmm) + [u08], [rm_arg_xmm, u08]) addop("psrlw", [bs8(0x0f), bs8(0xd1), no_xmm_pref] + - rmmod(mm_reg, rm_arg_mm), [mm_reg, rm_arg_mm]) + rmmod(mm_reg, rm_arg_mm_m64), [mm_reg, rm_arg_mm_m64]) addop("psrlw", [bs8(0x0f), bs8(0xd1), pref_66] + - rmmod(xmm_reg, rm_arg_xmm), [xmm_reg, rm_arg_xmm]) + rmmod(xmm_reg, rm_arg_xmm_m128), [xmm_reg, rm_arg_xmm_m128]) + +addop("psraw", [bs8(0x0f), bs8(0xe1), no_xmm_pref] + + rmmod(mm_reg, rm_arg_mm_m64), [mm_reg, rm_arg_mm_m64]) +addop("psraw", [bs8(0x0f), bs8(0xe1), pref_66] + + rmmod(xmm_reg, rm_arg_xmm_m128), [xmm_reg, rm_arg_xmm_m128]) + +addop("psraw", [bs8(0x0f), bs8(0x71), no_xmm_pref] + + rmmod(d4, rm_arg_mm_m64) + [u08], [rm_arg_mm_m64, u08]) +addop("psraw", [bs8(0x0f), bs8(0x71), pref_66] + + rmmod(d4, rm_arg_xmm_m128) + [u08], [rm_arg_xmm_m128, u08]) + +addop("psrad", [bs8(0x0f), bs8(0xe2), no_xmm_pref] + + rmmod(mm_reg, rm_arg_mm_m64), [mm_reg, rm_arg_mm_m64]) +addop("psrad", [bs8(0x0f), bs8(0xe2), pref_66] + + rmmod(xmm_reg, rm_arg_xmm_m128), [xmm_reg, rm_arg_xmm_m128]) +addop("psrad", [bs8(0x0f), bs8(0x72), no_xmm_pref] + + rmmod(d4, rm_arg_mm_m64) + [u08], [rm_arg_mm_m64, u08]) +addop("psrad", [bs8(0x0f), bs8(0x72), pref_66] + + rmmod(d4, rm_arg_xmm_m128) + [u08], [rm_arg_xmm_m128, u08]) addop("psllq", [bs8(0x0f), bs8(0x73), no_xmm_pref] + diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py index 43e973e1..ce6012a0 100644 --- a/test/arch/x86/arch.py +++ b/test/arch/x86/arch.py @@ -2306,7 +2306,8 @@ reg_tests = [ "0f50c2"), (m64, "00000000 MOVMSKPS R8D, XMM2", "440f50c2"), - + (m64, "00000000 MOVMSKPD EAX, XMM2", + "660F50C2"), (m32, "00000000 ADDSS XMM2, DWORD PTR [ECX]", "f30f5811"), (m32, "00000000 ADDSS XMM1, XMM2", @@ -2351,6 +2352,32 @@ reg_tests = [ (m32, "00000000 MAXSS XMM0, DWORD PTR [EBX + 0x2CBD37]", "f30f5f8337bd2c00"), + + (m32, "00000000 MINPS XMM0, XMM2", + "0F5DC2"), + (m32, "00000000 MINSS XMM0, XMM3", + "F30F5DC3"), + (m32, "00000000 MINPD XMM0, XMM4", + "660F5DC4"), + (m32, "00000000 MINSD XMM0, XMM5", + "F20F5DC5"), + (m32, "00000000 MAXPS XMM0, XMM6", + "0F5FC6"), + (m32, "00000000 MAXPD XMM0, XMM1", + "660F5FC1"), + (m32, "00000000 MAXSD XMM0, XMM2", + "F20F5FC2"), + (m32, "00000000 MAXSS XMM0, XMM7", + "F30F5FC7"), + (m32, "00000000 CMPEQPS XMM0, XMM3", + "0FC2C300"), + (m32, "00000000 CMPEQSS XMM0, XMM4", + "F30FC2C400"), + (m32, "00000000 CMPEQPD XMM0, XMM5", + "660FC2C500"), + (m32, "00000000 CMPEQSD XMM0, XMM6", + "F20FC2C600"), + (m32, "00000000 CVTDQ2PD XMM0, XMM3", "f30fe6c3"), (m32, "00000000 CVTDQ2PS XMM0, XMM3", @@ -2485,6 +2512,9 @@ reg_tests = [ (m64, "00000000 MOVQ RCX, XMM0", "66480F7EC1"), + (m32, "00000000 MOVQ2DQ XMM0, MM1", + "F30FD6C1"), + (m32, "00000000 PAND MM2, MM6", "0fdbd6"), (m32, "00000000 PAND XMM2, XMM6", @@ -2671,6 +2701,14 @@ reg_tests = [ (m32, "00000000 PSRLW XMM6, 0x5", "660F71D605"), + (m32, "00000000 PSRAW XMM0, 0x7", + "660F71E007"), + (m32, "00000000 PSRAW XMM0, XMM3", + "660FE1C3"), + (m32, "00000000 PSRAD XMM0, 0x7", + "660F72E007"), + (m32, "00000000 PSRAD XMM0, XMM3", + "660FE2C3"), (m32, "00000000 PSRLQ MM2, QWORD PTR [EDX]", "0FD312"), |