X86: Implement the PUSHF, POPF, SAHF, and LAHF instructions.
authorGabe Black <gblack@eecs.umich.edu>
Fri, 19 Oct 2007 22:21:16 +0000 (15:21 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Fri, 19 Oct 2007 22:21:16 +0000 (15:21 -0700)
--HG--
extra : convert_revision : 37c63b1133022fa3432888592f8c84785fb95091

src/arch/x86/isa/decoder/one_byte_opcodes.isa
src/arch/x86/isa/insts/general_purpose/flags/load_and_store.py
src/arch/x86/isa/insts/general_purpose/flags/push_and_pop.py

index ac714b3fff17da74f71854c9787030a00336ad17..62b8c8d597bca1b4a8e445d2e30110e26f8a5488 100644 (file)
                 default: WarnUnimpl::call_far_Ap();
             }
             0x3: WarnUnimpl::fwait(); //aka wait
-            0x4: WarnUnimpl::pushf_Fv();
-            0x5: WarnUnimpl::popf_Fv();
-            //Both of these should be illegal only if CPUID.AHF64=0,
-            //according to sandpile.org
+            0x4: PUSHF();
+            0x5: POPF();
+            //The 64 bit versions of both of these should be illegal only
+            //if CPUID says it isn't supported. For now, we'll just assume
+            //that it's supported.
             0x6: decode MODE_SUBMODE {
-                0x0: UD2();
-                default: WarnUnimpl::sahf();
+                0x0: SAHF_64();
+                default: SAHF();
             }
             0x7: decode MODE_SUBMODE {
-                0x0: UD2();
-                default: WarnUnimpl::lahf();
+                0x0: LAHF_64();
+                default: LAHF();
             }
         }
         0x14: decode OPCODE_OP_BOTTOM3 {
index c6f279a2552c91ec3978a1ffd50594631089b783..0915bf81940fb998c8c4cf80cb965c0e6461989a 100644 (file)
 #
 # Authors: Gabe Black
 
-microcode = ""
-#let {{
-#    class LAHF(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class SAHF(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#}};
+microcode = '''
+def macroop SAHF {
+    # This will fold to ah since this never executes in 64 bit mode.
+    ruflags rsp, dataSize=1
+};
+
+# This is allows the instruction to write to ah in 64 bit mode.
+def macroop SAHF_64 {
+    ruflags t1
+    slli t1, t1, 8
+    mov t1, t1, rax, dataSize=1
+    mov rax, rax, t1, dataSize=2
+};
+
+def macroop LAHF {
+    # This will fold to ah since this never executes in 64 bit mode.
+    wruflags rsp, t0, dataSize=1
+};
+
+# This is allows the instruction to read from ah in 64 bit mode.
+def macroop LAHF_64 {
+    srli t1, rax, 8, dataSize=2
+    wruflags t1, t0, dataSize=1
+};
+'''
index dbb6c34c4bb54e3a15d0666260de2453de664332..87e9ef03ae1a6579546d4a3ae8ced18420531563 100644 (file)
 #
 # Authors: Gabe Black
 
-microcode = ""
-#let {{
-#    class POPF(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class POPFD(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class POPFQ(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class PUSHF(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class PUSHFD(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class pushfq(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#}};
+microcode = '''
+def macroop PUSHF {
+    .adjust_env oszIn64Override
+
+    # This should really read the whole flags register, not just user flags.
+    ruflags t1
+    st t1, ss, [1, t0, rsp], "-env.dataSize"
+    subi rsp, rsp, dsz
+};
+
+def macroop POPF {
+    .adjust_env oszIn64Override
+
+    ld t1, ss, [1, t0, rsp]
+    addi rsp, rsp, dsz
+    # This should really write the whole flags register, not just user flags.
+    wruflags t1, t0
+};
+'''