Fixes: some conditionals were evaluated wrong due to the overflow bit

This commit is contained in:
ceriel 1995-07-21 12:05:26 +00:00
parent 3883860106
commit 5e03b1bebb
2 changed files with 111 additions and 20 deletions

View file

@ -227,6 +227,7 @@ jcxz label cost(1,4).
je label cost(1,4). je label cost(1,4).
jg label cost(1,4). jg label cost(1,4).
jge label cost(1,4). jge label cost(1,4).
jgt label cost(1,4).
jl label cost(1,4). jl label cost(1,4).
jle label cost(1,4). jle label cost(1,4).
jne label cost(1,4). jne label cost(1,4).
@ -234,6 +235,8 @@ jmp label cost(1,4).
proccall "call" label+rm cost(1,8). proccall "call" label+rm cost(1,8).
jxx "syntax error" label cost(1,4). jxx "syntax error" label cost(1,4).
setxx "syntax error" REG:rw cost(2,4). setxx "syntax error" REG:rw cost(2,4).
setle REG:rw cost(2,4).
setgt REG:rw cost(2,4).
lea anyreg:rw, halfindir:ro. lea anyreg:rw, halfindir:ro.
lea LOCAL:rw, halfindir:ro. /* only for register variables, UNSAFE!!! */ lea LOCAL:rw, halfindir:ro. /* only for register variables, UNSAFE!!! */
leave cost(1,4). leave cost(1,4).
@ -299,6 +302,7 @@ xorw "o16 xor" rm2:rw:cc, regorconst124:ro.
xorw "o16 xor" anyreg:rw:cc, rmorconst2:ro. xorw "o16 xor" anyreg:rw:cc, rmorconst2:ro.
killreg "! kill" anyreg:wo cost(0,0). killreg "! kill" anyreg:wo cost(0,0).
killcc "! kill cc" kills:cc cost(0,0).
/*****************************************************************/ /*****************************************************************/
@ -2452,12 +2456,31 @@ uses REG = {ANYCON,0}
gen test %1 gen test %1
setxx* %a yields %a setxx* %a yields %a
pat tlt call txx("setl") pat tlt call txx("sets")
pat tle call txx("setle")
pat teq call txx("sete") pat teq call txx("sete")
pat tne call txx("setne") pat tne call txx("setne")
pat tge call txx("setge") pat tge call txx("setns")
pat tgt call txx("setg")
/* Explicit test for TLE and TGT. We must make sure that the OC
flag is cleared.
*/
pat tle
with rm
uses REG = {ANYCON,0}
gen
killcc.
test %1
setle %a
yields %a
pat tgt
with rm
uses REG = {ANYCON,0}
gen
killcc.
test %1
setgt %a
yields %a
proc txxior proc txxior
with rm REG with rm REG
@ -2657,10 +2680,25 @@ with rm STACK
gen test %1 gen test %1
jxx* {label,$1} jxx* {label,$1}
pat zlt call zxx("jl") pat zlt call zxx("js")
pat zle call zxx("jle") pat zge call zxx("jns")
pat zge call zxx("jge")
pat zgt call zxx("jg") /* Explicit test for ZLE and ZGT. We must make sure that the OC
flag is cleared.
*/
pat zle
with rm STACK
gen
killcc.
test %1
jle {label,$1}
pat zgt
with rm STACK
gen
killcc.
test %1
jgt {label, $1}
pat zne pat zne
with rm+rm1 STACK with rm+rm1 STACK

View file

@ -268,6 +268,7 @@ xor anyreg:rw:cc, rmorconst:ro.
xorb rm1:rw:cc, regorconst12:ro. xorb rm1:rw:cc, regorconst12:ro.
xorb anyreg:rw:cc, rm1:ro. xorb anyreg:rw:cc, rm1:ro.
killreg "! kill" anyreg:wo cost(0,0). killreg "! kill" anyreg:wo cost(0,0).
killcc "! kill cc" kills:cc cost(0,0).
data ".sect .data". data ".sect .data".
word ".data2" const:ro. word ".data2" const:ro.
@ -2644,12 +2645,32 @@ uses REG = {ANYCON,0}
inc %a inc %a
1: yields %a 1: yields %a
pat tlt call txx("jge") pat tlt call txx("jns")
pat tle call txx("jg")
pat teq call txx("jne") pat teq call txx("jne")
pat tne call txx("je") pat tne call txx("je")
pat tge call txx("jl") pat tge call txx("js")
pat tgt call txx("jle")
/* For the next two patterns there is no I8086 test instruction (one that
ignores the OF flag. Therefore, condition codes are killed and the test
is done again.
*/
pat tgt
with rm
uses REG = {ANYCON, 0}
gen killcc.
test %1
jle {label, 1f}
inc %a
1: yields %a
pat tle
with rm
uses REG = {ANYCON, 0}
gen killcc.
test %1
jg {label, 1f}
inc %a
1: yields %a
proc txxior proc txxior
with rm REG with rm REG
@ -2658,12 +2679,30 @@ with rm REG
or %2,{ANYCON,1} or %2,{ANYCON,1}
1: yields %2 1: yields %2
pat tlt ior $2==2 call txxior("jge") pat tlt ior $2==2 call txxior("jns")
pat tle ior $2==2 call txxior("jg") pat tge ior $2==2 call txxior("js")
pat teq ior $2==2 call txxior("jne") pat teq ior $2==2 call txxior("jne")
pat tne ior $2==2 call txxior("je") pat tne ior $2==2 call txxior("je")
pat tge ior $2==2 call txxior("jl")
pat tgt ior $2==2 call txxior("jle") /* For the next two patterns there is no I8086 test instruction (one that
ignores the OF flag. Therefore, condition codes are killed and the test
is done again.
*/
pat tle ior $2==2
with rm REG
gen killcc.
test %1
jg {label,1f}
or %2,{ANYCON,1}
1: yields %2
pat tgt ior $2==2
with rm REG
gen killcc.
test %1
jle {label,1f}
or %2,{ANYCON,1}
1: yields %2
proc cmixxior proc cmixxior
with regorconst rm REG with regorconst rm REG
@ -3013,10 +3052,24 @@ with rm STACK
gen test %1 gen test %1
jxx* {label,$1} jxx* {label,$1}
pat zlt call zxx("jl") pat zlt call zxx("js")
pat zle call zxx("jle") pat zge call zxx("jns")
pat zge call zxx("jge")
pat zgt call zxx("jg") /* For the next two patterns there is no I8086 test instruction (one that
ignores the OF flag. Therefore, condition codes are killed and the test
is done again.
*/
pat zle
with rm STACK
gen killcc.
test %1
jle {label,$1}
pat zgt
with rm STACK
gen killcc.
test %1
jg {label,$1}
pat zne pat zne
with rm+rm1 STACK with rm+rm1 STACK