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);
 
 //
 //////////////////////////////////////////////////////////////////////////
 
-def format StringInst(*opTypeSet) {{
+def format StringTestInst(*opTypeSet) {{
     allBlocks = OutputBlocks()
 
     regBlocks = specializeInst(Name, list(opTypeSet), EmulEnv())
     (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()
+}};
 
     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"
 };
 '''
 
 
     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"
 };
 '''