about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/arch/x86/arch.py2
-rw-r--r--miasm2/arch/x86/sem.py22
-rw-r--r--test/arch/x86/arch.py2
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 4be9c78d..7682192f 100644
--- a/miasm2/arch/x86/sem.py
+++ b/miasm2/arch/x86/sem.py
@@ -3163,7 +3163,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
@@ -3174,14 +3174,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",