X86: Implement the load machine status word instruction (LMSW).
authorGabe Black <gblack@eecs.umich.edu>
Sun, 19 Apr 2009 10:17:14 +0000 (03:17 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Sun, 19 Apr 2009 10:17:14 +0000 (03:17 -0700)
src/arch/x86/isa/decoder/two_byte_opcodes.isa
src/arch/x86/isa/insts/system/control_registers.py

index 0f6d59f3d8b6be6c8f35b4ec496873998dcc86cb..e55756fec22ee63443239035756f4bb02302d42a 100644 (file)
                             0x7: invlpga();
                         }
                         0x4: smsw_Rv();
-                        0x6: lmsw_Rv();
+                        0x6: Inst::LMSW(Rv);
                         0x7: decode MODRM_RM {
                             0x0: Inst::SWAPGS();
                             0x1: rdtscp();
                             }
                         }
                         0x4: smsw_Mw();
-                        0x6: lmsw_Mw();
+                        0x6: Inst::LMSW(Mw);
                         0x7: Inst::INVLPG(M);
                         default: Inst::UD2();
                     }
index 902c01abb48399a368bcfedcefeb21c6cfd76f1e..c09cdf6e8481d45b602fbba439365eb53bea8b7f 100644 (file)
@@ -32,4 +32,40 @@ def macroop CLTS {
     andi t1, t1, 0xF7, dataSize=1
     wrcr 0, t1, dataSize=8
 };
+
+def macroop LMSW_R {
+    rdcr t1, 0, dataSize=8
+    # This logic sets MP, EM, and TS to whatever is in the operand. It will
+    # set PE but not clear it.
+    limm t2, "~ULL(0xe)", dataSize=8
+    and t1, t1, t2, dataSize=8
+    andi t2, reg, 0xf, dataSize=8
+    or t1, t1, t2, dataSize=8
+    wrcr 0, t1, dataSize=8
+};
+
+def macroop LMSW_M {
+    ld t3, seg, sib, disp, dataSize=2
+    rdcr t1, 0, dataSize=8
+    # This logic sets MP, EM, and TS to whatever is in the operand. It will
+    # set PE but not clear it.
+    limm t2, "~ULL(0xe)", dataSize=8
+    and t1, t1, t2, dataSize=8
+    andi t2, t3, 0xf, dataSize=8
+    or t1, t1, t2, dataSize=8
+    wrcr 0, t1, dataSize=8
+};
+
+def macroop LMSW_P {
+    rdip t7, dataSize=asz
+    ld t3, seg, riprel, disp, dataSize=2
+    rdcr t1, 0, dataSize=8
+    # This logic sets MP, EM, and TS to whatever is in the operand. It will
+    # set PE but not clear it.
+    limm t2, "~ULL(0xe)", dataSize=8
+    and t1, t1, t2, dataSize=8
+    andi t2, t3, 0xf, dataSize=8
+    or t1, t1, t2, dataSize=8
+    wrcr 0, t1, dataSize=8
+};
 '''