diff options
| -rw-r--r-- | miasm2/arch/x86/arch.py | 2 | ||||
| -rw-r--r-- | miasm2/arch/x86/sem.py | 22 | ||||
| -rw-r--r-- | test/arch/x86/arch.py | 2 |
3 files changed, 19 insertions, 7 deletions
diff --git a/miasm2/arch/x86/arch.py b/miasm2/arch/x86/arch.py index 72ed3309..29303fdf 100644 --- a/miasm2/arch/x86/arch.py +++ b/miasm2/arch/x86/arch.py @@ -3481,7 +3481,7 @@ addop("cmpxchg", [bs8(0x0f), bs('1011000'), w8] + rmmod(rmreg, rm_arg_w8), [rm_arg_w8, rmreg]) addop("cmpxchg8b", [bs8(0x0f), bs8(0xc7), bs_opmode16] + rmmod(d1, rm_arg_m64)) addop("cmpxchg8b", [bs8(0x0f), bs8(0xc7), bs_opmode32] + rmmod(d1, rm_arg_m64)) -addop("cmpxchg16b", [bs8(0x0f), bs8(0xc7), bs_opmode64] + rmmod(d1, rm_arg_m64)) +addop("cmpxchg16b", [bs8(0x0f), bs8(0xc7), bs_opmode64] + rmmod(d1, rm_arg_xmm_m128)) # XXX TODO CMPXCHG8/16 diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index d81cbe5e..4baf6eec 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -3154,7 +3154,7 @@ def l_in(_, instr, src1, src2): @sbuild.parse def cmpxchg(arg1, arg2): - accumulator = mRAX[instr.mode][:arg1.size] + accumulator = mRAX[instr.v_opmode()][:arg1.size] if (accumulator - arg1): zf = i1(0) accumulator = arg1 @@ -3165,14 +3165,26 @@ def cmpxchg(arg1, arg2): @sbuild.parse def cmpxchg8b(arg1): - accumulator = {mRAX[instr.mode], mRDX[instr.mode]} + accumulator = {mRAX[32], mRDX[32]} if accumulator - arg1: zf = i1(0) - mRAX[instr.mode] = arg1[:instr.mode] - mRDX[instr.mode] = arg1[instr.mode:] + mRAX[32] = arg1[:32] + mRDX[32] = arg1[32:] else: zf = i1(1) - arg1 = {mRBX[instr.mode], mRCX[instr.mode]} + arg1 = {mRBX[32], mRCX[32]} + + +@sbuild.parse +def cmpxchg16b(arg1): + accumulator = {mRAX[64], mRDX[64]} + if accumulator - arg1: + zf = i1(0) + mRAX[64] = arg1[:64] + mRDX[64] = arg1[64:] + else: + zf = i1(1) + arg1 = {mRBX[64], mRCX[64]} def lds(ir, instr, dst, src): diff --git a/test/arch/x86/arch.py b/test/arch/x86/arch.py index 2af90c8a..7b834e2c 100644 --- a/test/arch/x86/arch.py +++ b/test/arch/x86/arch.py @@ -864,7 +864,7 @@ reg_tests = [ "0fc74c2408"), (m64, "00000000 CMPXCHG8B QWORD PTR [RSP + 0x8]", "0fc74c2408"), - (m64, "00000000 CMPXCHG16B QWORD PTR [RSP + 0x8]", + (m64, "00000000 CMPXCHG16B XMMWORD PTR [RSP + 0x8]", "480fc74c2408"), (m32, "00000000 CDQ", |