X86: Make string instructions work when rcx=0.
This commit is contained in:
parent
8688ef3fe5
commit
de6eeaaa27
6 changed files with 44 additions and 9 deletions
|
@ -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"
|
||||
};
|
||||
'''
|
||||
|
|
|
@ -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"
|
||||
};
|
||||
'''
|
||||
|
|
|
@ -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"
|
||||
};
|
||||
'''
|
||||
|
|
|
@ -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"
|
||||
};
|
||||
'''
|
||||
|
|
|
@ -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"
|
||||
};
|
||||
|
||||
|
|
|
@ -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"
|
||||
};
|
||||
'''
|
||||
|
|
Loading…
Reference in a new issue