X86: Implement the CMPXCHG8B/CMPXCHG16B instruction.
authorGabe Black <gblack@eecs.umich.edu>
Sun, 9 Aug 2009 08:01:41 +0000 (01:01 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Sun, 9 Aug 2009 08:01:41 +0000 (01:01 -0700)
src/arch/x86/isa/decoder/locked_opcodes.isa
src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/general_purpose/semaphores.py

index f38f2abb81640498a16890e72b5e94dfe38c11b0..14d5e58a3dc976f90a2d58886a2843ccb5421467 100644 (file)
                         0x1: XADD_LOCKED(Mv,Gv);
                         //0x7: group9();
                         0x7: decode MODRM_REG {
-                            0x1: WarnUnimpl::cmpxchg_Mq_LOCKED();
+                            //Also CMPXCHG16B
+                            0x1: CMPXCHG8B_LOCKED(Mdp);
                         }
                     }
                 }
index dbde17964d03aa1e21acd795a78bd95f8355ba0b..55056da8192b5ad0e53f61bda8d390e8c1a289d6 100644 (file)
                 0x1: Inst::XADD(Ev,Gv);
                 //0x7: group9();
                 0x7: decode MODRM_REG {
-                    0x1: cmpxchg_Mq();
+                    //Also CMPXCHG16B
+                    0x1: Inst::CMPXCHG8B(Mdp);
                     0x6: decode LEGACY_OP {
                         0x1: vmclear_Mq();
                         default: decode LEGACY_REP {
index a7da0720e8e2b236932f3739b7a6c45e98432513..2bdbd0ada830f9fe136d8840e2981286a09066d0 100644 (file)
@@ -98,6 +98,100 @@ def macroop CMPXCHG_LOCKED_P_R {
     mov rax, rax, t1, flags=(nCZF,)
 };
 
+def macroop CMPXCHG8B_M {
+    lea t1, seg, sib, disp, dataSize=asz
+    ldst t2, seg, [1, t0, t1], 0
+    ldst t3, seg, [1, t0, t1], dsz
+
+    sub t0, rax, t2, flags=(ZF,)
+    br label("doneComparing"), flags=(nCZF,)
+    sub t0, rdx, t3, flags=(ZF,)
+doneComparing:
+
+    # If they're equal, set t3:t2 to rbx:rcx to write to memory
+    mov t2, t2, rbx, flags=(CZF,)
+    mov t3, t3, rcx, flags=(CZF,)
+
+    # If they're not equal, set rdx:rax to the value from memory.
+    mov rax, rax, t2, flags=(nCZF,)
+    mov rdx, rdx, t3, flags=(nCZF,)
+
+    # Write to memory
+    st t3, seg, [1, t0, t1], dsz
+    st t2, seg, [1, t0, t1], 0
+};
+
+def macroop CMPXCHG8B_P {
+    rdip t7
+    lea t1, seg, riprel, disp, dataSize=asz
+    ldst t2, seg, [1, t0, t1], 0
+    ldst t3, seg, [1, t0, t1], dsz
+
+    sub t0, rax, t2, flags=(ZF,)
+    br label("doneComparing"), flags=(nCZF,)
+    sub t0, rdx, t3, flags=(ZF,)
+doneComparing:
+
+    # If they're equal, set t3:t2 to rbx:rcx to write to memory
+    mov t2, t2, rbx, flags=(CZF,)
+    mov t3, t3, rcx, flags=(CZF,)
+
+    # If they're not equal, set rdx:rax to the value from memory.
+    mov rax, rax, t2, flags=(nCZF,)
+    mov rdx, rdx, t3, flags=(nCZF,)
+
+    # Write to memory
+    st t3, seg, [1, t0, t1], dsz
+    st t2, seg, [1, t0, t1], 0
+};
+
+def macroop CMPXCHG8B_LOCKED_M {
+    lea t1, seg, sib, disp, dataSize=asz
+    ldstl t2, seg, [1, t0, t1], 0
+    ldstl t3, seg, [1, t0, t1], dsz
+
+    sub t0, rax, t2, flags=(ZF,)
+    br label("doneComparing"), flags=(nCZF,)
+    sub t0, rdx, t3, flags=(ZF,)
+doneComparing:
+
+    # If they're equal, set t3:t2 to rbx:rcx to write to memory
+    mov t2, t2, rbx, flags=(CZF,)
+    mov t3, t3, rcx, flags=(CZF,)
+
+    # If they're not equal, set rdx:rax to the value from memory.
+    mov rax, rax, t2, flags=(nCZF,)
+    mov rdx, rdx, t3, flags=(nCZF,)
+
+    # Write to memory
+    stul t3, seg, [1, t0, t1], dsz
+    stul t2, seg, [1, t0, t1], 0
+};
+
+def macroop CMPXCHG8B_LOCKED_P {
+    rdip t7
+    lea t1, seg, riprel, disp, dataSize=asz
+    ldstl t2, seg, [1, t0, t1], 0
+    ldstl t3, seg, [1, t0, t1], dsz
+
+    sub t0, rax, t2, flags=(ZF,)
+    br label("doneComparing"), flags=(nCZF,)
+    sub t0, rdx, t3, flags=(ZF,)
+doneComparing:
+
+    # If they're equal, set t3:t2 to rbx:rcx to write to memory
+    mov t2, t2, rbx, flags=(CZF,)
+    mov t3, t3, rcx, flags=(CZF,)
+
+    # If they're not equal, set rdx:rax to the value from memory.
+    mov rax, rax, t2, flags=(nCZF,)
+    mov rdx, rdx, t3, flags=(nCZF,)
+
+    # Write to memory
+    stul t3, seg, [1, t0, t1], dsz
+    stul t2, seg, [1, t0, t1], 0
+};
+
 def macroop XADD_M_R {
     ldst t1, seg, sib, disp
     add t2, t1, reg, flags=(OF,SF,ZF,AF,PF,CF)