X86: Implement STOS.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 3 Oct 2007 05:02:30 +0000 (22:02 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 3 Oct 2007 05:02:30 +0000 (22:02 -0700)
--HG--
extra : convert_revision : 95f3bf185f07fe644d6ab96bbb6e598e406b92f4

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

index ecb92947f6d62ae3e64dc1f4029b870d2c926640..3e8b893bf3a95a99c0a3b83179afa6c0fcd8689d 100644 (file)
         0x15: decode OPCODE_OP_BOTTOM3 {
             0x0: Inst::TEST(rAb,Ib);
             0x1: Inst::TEST(rAv,Iz);
-            0x2: stos_Yb_Al();
-            0x3: stos_Yv_rAX();
+            0x2: StringInst::STOS(Yb);
+            0x3: StringInst::STOS(Yv);
             0x4: lods_Al_Xb();
             0x5: lods_rAX_Xv();
             0x6: StringInst::SCAS(Yb);
index 08a126c1f4d5aab9cc6bf022c949fab663888377..a8655cf962385a5d058066784cd07582b77699f0 100644 (file)
 #
 # Authors: Gabe Black
 
-microcode = ""
-#let {{
-#    class STOS(Inst):
-#      "Add 0 0 0"
-#    class STOSB(Inst):
-#      "Add 0 0 0"
-#    class STOSW(Inst):
-#      "Add 0 0 0"
-#    class STOSD(Inst):
-#      "Add 0 0 0"
-#    class STOSQ(Inst):
-#      "Add 0 0 0"
-#}};
+microcode = '''
+def macroop STOS_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
+
+    st rax, es, [1, t0, rdi]
+
+    add rdi, rdi, t3, dataSize=asz
+};
+
+def macroop STOS_E_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:
+    st rax, es, [1, t0, rdi]
+
+    subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
+    add rdi, rdi, t3, dataSize=asz
+    bri t0, label("topOfLoop"), flags=(CSTRZnEZF,)
+    fault "NoFault"
+};
+
+def macroop STOS_N_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:
+    st rax, es, [1, t0, rdi]
+
+    subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
+    add rdi, rdi, t3, dataSize=asz
+    bri t0, label("topOfLoop"), flags=(CSTRnZnEZF,)
+    fault "NoFault"
+};
+'''