X86: Distinguish between the rep and repe prefixes.
authorGabe Black <gblack@eecs.umich.edu>
Wed, 3 Oct 2007 06:02:18 +0000 (23:02 -0700)
committerGabe Black <gblack@eecs.umich.edu>
Wed, 3 Oct 2007 06:02:18 +0000 (23:02 -0700)
STOS and MOVS only accept the rep prefix which always loops until rcx becomes
0. The other string instructions accept repe (same encoding as rep) and repne
which also check the condition code flags each iteration.

--HG--
extra : convert_revision : 544149f640302070810fb53e53bfeb0e87160ffc

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

index 0816eb175a3a7e2cb6eb3c27a9cc5351c923902b..f76912f063f442da2112393feaf0f213cdd4037d 100644 (file)
             0x3: mov_Ov_rAX();
             0x4: StringInst::MOVS(Yb,Xb);
             0x5: StringInst::MOVS(Yv,Xv);
-            0x6: StringInst::CMPS(Yb,Xb);
-            0x7: StringInst::CMPS(Yv,Xv);
+            0x6: StringTestInst::CMPS(Yb,Xb);
+            0x7: StringTestInst::CMPS(Yv,Xv);
         }
         0x15: decode OPCODE_OP_BOTTOM3 {
             0x0: Inst::TEST(rAb,Ib);
             0x3: StringInst::STOS(Yv);
             0x4: lods_Al_Xb();
             0x5: lods_rAX_Xv();
-            0x6: StringInst::SCAS(Yb);
-            0x7: StringInst::SCAS(Yv);
+            0x6: StringTestInst::SCAS(Yb);
+            0x7: StringTestInst::SCAS(Yv);
         }
         format Inst {
             0x16: MOV(Bb,Ib);
index cd182ff62a4be495122390e20cd61a54b7dbdab1..b1d3c4bbe4c7ad9d80190ba0505be3f66459e6a9 100644 (file)
@@ -61,7 +61,7 @@
 //
 //////////////////////////////////////////////////////////////////////////
 
-def format StringInst(*opTypeSet) {{
+def format StringTestInst(*opTypeSet) {{
     allBlocks = OutputBlocks()
 
     regBlocks = specializeInst(Name, list(opTypeSet), EmulEnv())
@@ -86,3 +86,29 @@ def format StringInst(*opTypeSet) {{
     (header_output, decoder_output,
      decode_block, exec_output) = allBlocks.makeList()
 }};
+
+def format StringInst(*opTypeSet) {{
+    allBlocks = OutputBlocks()
+
+    regBlocks = specializeInst(Name, list(opTypeSet), EmulEnv())
+    eBlocks = specializeInst(Name + "_E", list(opTypeSet), EmulEnv())
+
+    for blocks in (regBlocks, eBlocks):
+        allBlocks.header_output += blocks.header_output
+        allBlocks.decoder_output += blocks.decoder_output
+        allBlocks.exec_output += blocks.exec_output
+
+    allBlocks.decode_block = '''
+        if (LEGACY_REP) {
+            %s
+        } else if (LEGACY_REPNE) {
+            // The repne prefix is illegal
+            return new MicroFault(machInst, "illprefix", new InvalidOpcode);
+        } else {
+            %s
+        }
+    ''' % (eBlocks.decode_block, regBlocks.decode_block)
+
+    (header_output, decoder_output,
+     decode_block, exec_output) = allBlocks.makeList()
+}};
index 6a78a2cd43a9e86a50f1b26acd75b4f9fba6a9dc..b64acfdc261d5eb59ab954e9ea7f8096e2f06924 100644 (file)
@@ -82,25 +82,7 @@ topOfLoop:
     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,)
+    bri t0, label("topOfLoop"), flags=(nCEZF,)
     fault "NoFault"
 };
 '''
index a8655cf962385a5d058066784cd07582b77699f0..a8d558929208eca8333a62c2671b1a592625a3af 100644 (file)
@@ -78,23 +78,7 @@ topOfLoop:
 
     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,)
+    bri t0, label("topOfLoop"), flags=(nCEZF,)
     fault "NoFault"
 };
 '''