X86: Implement the cmpxchg instruction.
authorGabe Black <gblack@eecs.umich.edu>
Sun, 5 Aug 2007 03:15:27 +0000 (20:15 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Sun, 5 Aug 2007 03:15:27 +0000 (20:15 -0700)
--HG--
extra : convert_revision : b9e172bcb9551edf65c63f26dfa07d771edf3e1e

src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/semaphores.py

index e8307c6e6af8722cb07f05a028b5bbdb674d06d5..f2d8a972edf9e6f9ae59af9841b98a7e7309c642 100644 (file)
                 0x7: Inst::IMUL(Gv,Ev);
             }
             0x16: decode OPCODE_OP_BOTTOM3 {
-                0x0: cmpxchg_Eb_Gb();
-                0x1: cmpxchg_Ev_Gv();
+                0x0: Inst::CMPXCHG(Eb,Gb);
+                0x1: Inst::CMPXCHG(Ev,Gv);
                 0x2: lss_Gz_Mp();
                 0x3: btr_Ev_Gv();
                 0x4: lfs_Gz_Mp();
index 32f28cf8298b814f33ce41f44db20d876995107e..882213a3fb886ec520d5130b5a73d68cda7e2da9 100644 (file)
 #
 # Authors: Gabe Black
 
-microcode = ""
+microcode = '''
+def macroop CMPXCHG_R_R {
+    sub t0, rax, reg, flags=(OF, SF, ZF, AF, PF, CF)
+    mov reg, reg, regm, flags=(CZF,)
+    mov rax, rax, reg, flags=(nCZF,)
+};
+
+def macroop CMPXCHG_M_R {
+    ld t1, seg, sib, disp
+    sub t0, rax, t1, flags=(OF, SF, ZF, AF, PF, CF)
+
+    mov t1, t1, reg, flags=(CZF,)
+    st t1, seg, sib, disp
+    mov rax, rax, t1, flags=(nCZF,)
+};
+
+def macroop CMPXCHG_P_R {
+    rdip t7
+    ld t1, seg, riprel, disp
+    sub t0, rax, t1, flags=(OF, SF, ZF, AF, PF, CF)
+
+    mov t1, t1, reg, flags=(CZF,)
+    st t1, seg, riprel, disp
+    mov rax, rax, t1, flags=(nCZF,)
+};
+'''
 #let {{
 #    class CMPXCHG(Inst):
 #      "GenFault ${new UnimpInstFault}"