X86: Make string instructions work when rcx=0.
authorGabe Black <gblack@eecs.umich.edu>
Thu, 12 Jun 2008 04:48:15 +0000 (00:48 -0400)
committerGabe Black <gblack@eecs.umich.edu>
Thu, 12 Jun 2008 04:48:15 +0000 (00:48 -0400)
src/arch/x86/isa/insts/general_purpose/input_output/string_io.py
src/arch/x86/isa/insts/general_purpose/string/compare_strings.py
src/arch/x86/isa/insts/general_purpose/string/load_string.py
src/arch/x86/isa/insts/general_purpose/string/move_string.py
src/arch/x86/isa/insts/general_purpose/string/scan_string.py
src/arch/x86/isa/insts/general_purpose/string/store_string.py

index 1b4e086d2831cd010ba4274623b427bb9d07245c..29b722d664a135b1f550a63d56d707f2b706e2aa 100644 (file)
@@ -70,6 +70,8 @@ def macroop INS_M_R {
 };
 
 def macroop INS_E_M_R {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
     # Find the constant we need to either add or subtract from rdi
     ruflag t0, 10
     movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -85,6 +87,7 @@ topOfLoop:
     subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
     add rdi, rdi, t3, dataSize=asz
     bri t0, label("topOfLoop"), flags=(nCEZF,)
+end:
     fault "NoFault"
 };
 
@@ -104,6 +107,8 @@ def macroop OUTS_R_M {
 };
 
 def macroop OUTS_E_R_M {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
     # Find the constant we need to either add or subtract from rdi
     ruflag t0, 10
     movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -119,6 +124,7 @@ topOfLoop:
     subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
     add rsi, rsi, t3, dataSize=asz
     bri t0, label("topOfLoop"), flags=(nCEZF,)
+end:
     fault "NoFault"
 };
 '''
index 71b8511b48e6aa263c92e50ad95438e816dedc7f..9810fe3c20ec8e1ca68f6bce6d060fbef3589b49 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2007-2008 The Hewlett-Packard Development Company
 # All rights reserved.
 #
 # Redistribution and use of this software in source and binary forms,
@@ -75,12 +75,16 @@ def macroop CMPS_M_M {
 #
 
 def macroop CMPS_E_M_M {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
+
     # 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]
     ld t2, es, [1, t0, rdi]
     sub t0, t1, t2, flags=(OF, SF, ZF, AF, PF, CF)
@@ -88,17 +92,22 @@ def macroop CMPS_E_M_M {
     subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
     add rdi, rdi, t3, dataSize=asz
     add rsi, rsi, t3, dataSize=asz
-    bri t0, 4, flags=(CSTRZnEZF,)
+    bri t0, label("topOfLoop"), flags=(CSTRZnEZF,)
+end:
     fault "NoFault"
 };
 
 def macroop CMPS_N_M_M {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
+
     # 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]
     ld t2, es, [1, t0, rdi]
     sub t0, t1, t2, flags=(OF, SF, ZF, AF, PF, CF)
@@ -106,7 +115,8 @@ def macroop CMPS_N_M_M {
     subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
     add rdi, rdi, t3, dataSize=asz
     add rsi, rsi, t3, dataSize=asz
-    bri t0, 4, flags=(CSTRnZnEZF,)
+    bri t0, label("topOfLoop"), flags=(CSTRnZnEZF,)
+end:
     fault "NoFault"
 };
 '''
index 61525c2f28187d87852bd00b6fcf2c87816a6934..8cf07fea61cffdc46ed20e12455f41c2bb050961 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2007-2008 The Hewlett-Packard Development Company
 # All rights reserved.
 #
 # Redistribution and use of this software in source and binary forms,
@@ -67,6 +67,8 @@ def macroop LODS_M {
 };
 
 def macroop LODS_E_M {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
     # Find the constant we need to either add or subtract from rdi
     ruflag t0, 10
     movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -79,6 +81,7 @@ topOfLoop:
     subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
     add rdi, rdi, t3, dataSize=asz
     bri t0, label("topOfLoop"), flags=(nCEZF,)
+end:
     fault "NoFault"
 };
 '''
index b64acfdc261d5eb59ab954e9ea7f8096e2f06924..1d7dd75ad4cc8ba02f20106cb19fbf1aa8d97b16 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2007-2008 The Hewlett-Packard Development Company
 # All rights reserved.
 #
 # Redistribution and use of this software in source and binary forms,
@@ -69,6 +69,8 @@ def macroop MOVS_M_M {
 };
 
 def macroop MOVS_E_M_M {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
     # Find the constant we need to either add or subtract from rdi
     ruflag t0, 10
     movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -83,6 +85,7 @@ topOfLoop:
     add rdi, rdi, t3, dataSize=asz
     add rsi, rsi, t3, dataSize=asz
     bri t0, label("topOfLoop"), flags=(nCEZF,)
+end:
     fault "NoFault"
 };
 '''
index b038cc00ab433c142a705f945a275b257acd5060..b37e367be5d68dfce65866cd8fdd9af98f36d579 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2007-2008 The Hewlett-Packard Development Company
 # All rights reserved.
 #
 # Redistribution and use of this software in source and binary forms,
@@ -73,34 +73,44 @@ def macroop SCAS_M {
 #
 
 def macroop SCAS_E_M {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
+
     # Find the constant we need to either add or subtract from rdi
     ruflag t0, 10
     movi t2, t2, dsz, flags=(CEZF,), dataSize=asz
     subi t3, t0, dsz, dataSize=asz
     mov t2, t2, t3, flags=(nCEZF,), dataSize=asz
 
+topOfLoop:
     ld t1, es, [1, t0, rdi]
     sub t0, t1, rax, flags=(OF, SF, ZF, AF, PF, CF)
 
     subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
     add rdi, rdi, t2, dataSize=asz
-    bri t0, 4, flags=(CSTRZnEZF,)
+    bri t0, label("topOfLoop"), flags=(CSTRZnEZF,)
+end:
     fault "NoFault"
 };
 
 def macroop SCAS_N_M {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
+
     # Find the constant we need to either add or subtract from rdi
     ruflag t0, 10
     movi t2, t2, dsz, flags=(CEZF,), dataSize=asz
     subi t3, t0, dsz, dataSize=asz
     mov t2, t2, t3, flags=(nCEZF,), dataSize=asz
 
+topOfLoop:
     ld t1, es, [1, t0, rdi]
     sub t0, t1, rax, flags=(OF, SF, ZF, AF, PF, CF)
 
     subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
     add rdi, rdi, t2, dataSize=asz
-    bri t0, 4, flags=(CSTRnZnEZF,)
+    bri t0, label("topOfLoop"), flags=(CSTRnZnEZF,)
+end:
     fault "NoFault"
 };
 
index a8d558929208eca8333a62c2671b1a592625a3af..b52b1f1fbd20c12613418ea3c5001f984feb55e9 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (c) 2007 The Hewlett-Packard Development Company
+# Copyright (c) 2007-2008 The Hewlett-Packard Development Company
 # All rights reserved.
 #
 # Redistribution and use of this software in source and binary forms,
@@ -67,6 +67,8 @@ def macroop STOS_M {
 };
 
 def macroop STOS_E_M {
+    and t0, rcx, rcx, flags=(EZF,), dataSize=asz
+    bri t0, label("end"), flags=(CEZF,)
     # Find the constant we need to either add or subtract from rdi
     ruflag t0, 10
     movi t3, t3, dsz, flags=(CEZF,), dataSize=asz
@@ -79,6 +81,7 @@ topOfLoop:
     subi rcx, rcx, 1, flags=(EZF,), dataSize=asz
     add rdi, rdi, t3, dataSize=asz
     bri t0, label("topOfLoop"), flags=(nCEZF,)
+end:
     fault "NoFault"
 };
 '''