X86: Implement MOVS
authorGabe Black <gblack@eecs.umich.edu>
Wed, 3 Oct 2007 05:02:58 +0000 (22:02 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 3 Oct 2007 05:02:58 +0000 (22:02 -0700)
--HG--
extra : convert_revision : 29147e1b86f7c54ce9b5ff68001725802c665fc0

src/arch/x86/isa/decoder/one_byte_opcodes.isa
src/arch/x86/isa/insts/general_purpose/string/move_string.py

index 3e8b893bf3a95a99c0a3b83179afa6c0fcd8689d..d4e881128fd485d65240e5d3a2005a692061a37e 100644 (file)
             0x1: mov_rAX_Ov();
             0x2: mov_Ob_Al();
             0x3: mov_Ov_rAX();
-            0x4: movs_Yb_Xb();
-            0x5: movs_Yv_Xv();
+            0x4: StringInst::MOVS(Yb,Xb);
+            0x5: StringInst::MOVS(Yv,Xv);
             0x6: StringInst::CMPS(Yb,Xb);
             0x7: StringInst::CMPS(Yv,Xv);
         }
index 0a855b3843e3a0932cf4ea654882120bb98e520b..6a78a2cd43a9e86a50f1b26acd75b4f9fba6a9dc 100644 (file)
 #
 # Authors: Gabe Black
 
-microcode = ""
-#let {{
-#    class MOVS(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class MOVSB(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class MOVSW(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class MOVSD(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#    class MOVSQ(Inst):
-#      "GenFault ${new UnimpInstFault}"
-#}};
+microcode = '''
+def macroop MOVS_M_M {
+    # Find the constant we need to either add or subtract from rdi
+    ruflag t0, 10
+    movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
+    subi t4, t0, dsz, dataSize=asz
+    mov t3, t3, t4, flags=(nCEZF,), dataSize=asz
+
+    ld t1, seg, [1, t0, rsi]
+    st t1, es, [1, t0, rdi]
+
+    add rdi, rdi, t3, dataSize=asz
+    add rsi, rsi, t3, dataSize=asz
+};
+
+def macroop MOVS_E_M_M {
+    # Find the constant we need to either add or subtract from rdi
+    ruflag t0, 10
+    movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
+    subi t4, t0, dsz, dataSize=asz
+    mov t3, t3, t4, flags=(nCEZF,), dataSize=asz
+
+topOfLoop:
+    ld t1, seg, [1, t0, rsi]
+    st t1, es, [1, t0, rdi]
+
+    subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
+    add rdi, rdi, t3, dataSize=asz
+    add rsi, rsi, t3, dataSize=asz
+    bri t0, label("topOfLoop"), flags=(CSTRZnEZF,)
+    fault "NoFault"
+};
+
+def macroop MOVS_N_M_M {
+    # Find the constant we need to either add or subtract from rdi
+    ruflag t0, 10
+    movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
+    subi t4, t0, dsz, dataSize=asz
+    mov t3, t3, t4, flags=(nCEZF,), dataSize=asz
+
+topOfLoop:
+    ld t1, seg, [1, t0, rsi]
+    st t1, es, [1, t0, rdi]
+
+    subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
+    add rdi, rdi, t3, dataSize=asz
+    add rsi, rsi, t3, dataSize=asz
+    bri t0, label("topOfLoop"), flags=(CSTRnZnEZF,)
+    fault "NoFault"
+};
+'''