convert comparison branch code in compiler to use locals

db4
Joe Groff 2009-09-03 21:19:39 -05:00
parent a6921edd29
commit c480bec303
2 changed files with 65 additions and 63 deletions

View File

@ -501,13 +501,13 @@ M: ppc %epilogue ( n -- )
"end" get resolve-label ; inline
: %boolean ( dst temp cc -- )
negate-cc order-cc {
{ cc< [ \ BLT (%boolean) ] }
{ cc<= [ \ BLE (%boolean) ] }
{ cc> [ \ BGT (%boolean) ] }
{ cc>= [ \ BGE (%boolean) ] }
{ cc= [ \ BEQ (%boolean) ] }
{ cc/= [ \ BNE (%boolean) ] }
cc negate-cc order-cc {
{ cc< [ dst temp \ BLT (%boolean) ] }
{ cc<= [ dst temp \ BLE (%boolean) ] }
{ cc> [ dst temp \ BGT (%boolean) ] }
{ cc>= [ dst temp \ BGE (%boolean) ] }
{ cc= [ dst temp \ BEQ (%boolean) ] }
{ cc/= [ dst temp \ BNE (%boolean) ] }
} case ;
: (%compare) ( src1 src2 -- ) [ 0 ] dip CMP ; inline
@ -518,14 +518,14 @@ M: ppc %compare (%compare) %boolean ;
M: ppc %compare-imm (%compare-imm) %boolean ;
M: ppc %compare-float (%compare-float) %boolean ;
: %branch ( label cc -- )
order-cc {
{ cc< [ BLT ] }
{ cc<= [ BLE ] }
{ cc> [ BGT ] }
{ cc>= [ BGE ] }
{ cc= [ BEQ ] }
{ cc/= [ BNE ] }
:: %branch ( label cc -- )
cc order-cc {
{ cc< [ label BLT ] }
{ cc<= [ label BLE ] }
{ cc> [ label BGT ] }
{ cc>= [ label BGE ] }
{ cc= [ label BEQ ] }
{ cc/= [ label BNE ] }
} case ;
M: ppc %compare-branch (%compare) %branch ;

View File

@ -511,14 +511,15 @@ M: x86 %epilogue ( n -- ) cell - incr-stack-reg ;
temp 0 MOV \ t rc-absolute-cell rel-immediate
dst temp word execute ; inline
M: x86 %compare ( dst temp cc src1 src2 -- )
CMP order-cc {
{ cc< [ \ CMOVL %boolean ] }
{ cc<= [ \ CMOVLE %boolean ] }
{ cc> [ \ CMOVG %boolean ] }
{ cc>= [ \ CMOVGE %boolean ] }
{ cc= [ \ CMOVE %boolean ] }
{ cc/= [ \ CMOVNE %boolean ] }
M:: x86 %compare ( dst temp cc src1 src2 -- )
src1 src2 CMP
cc order-cc {
{ cc< [ dst temp \ CMOVL %boolean ] }
{ cc<= [ dst temp \ CMOVLE %boolean ] }
{ cc> [ dst temp \ CMOVG %boolean ] }
{ cc>= [ dst temp \ CMOVGE %boolean ] }
{ cc= [ dst temp \ CMOVE %boolean ] }
{ cc/= [ dst temp \ CMOVNE %boolean ] }
} case ;
M: x86 %compare-imm ( dst temp cc src1 src2 -- )
@ -545,32 +546,33 @@ M: x86 %compare-imm ( dst temp cc src1 src2 -- )
"no-move" resolve-label
] with-scope ;
M: x86 %compare-float ( dst temp cc src1 src2 -- )
rot {
{ cc< [ swap UCOMISD \ CMOVA %boolean ] }
{ cc<= [ swap UCOMISD \ CMOVAE %boolean ] }
{ cc> [ UCOMISD \ CMOVA %boolean ] }
{ cc>= [ UCOMISD \ CMOVAE %boolean ] }
{ cc= [ COMISD \ %cmov-float= %boolean ] }
{ cc<> [ UCOMISD \ CMOVNE %boolean ] }
{ cc<>= [ UCOMISD \ CMOVNP %boolean ] }
{ cc/< [ swap COMISD \ CMOVBE %boolean ] }
{ cc/<= [ swap COMISD \ CMOVB %boolean ] }
{ cc/> [ COMISD \ CMOVBE %boolean ] }
{ cc/>= [ COMISD \ CMOVB %boolean ] }
{ cc/= [ COMISD \ %cmov-float/= %boolean ] }
{ cc/<> [ COMISD \ CMOVE %boolean ] }
{ cc/<>= [ COMISD \ CMOVP %boolean ] }
M:: x86 %compare-float ( dst temp cc src1 src2 -- )
cc {
{ cc< [ src2 src1 UCOMISD dst temp \ CMOVA %boolean ] }
{ cc<= [ src2 src1 UCOMISD dst temp \ CMOVAE %boolean ] }
{ cc> [ src1 src2 UCOMISD dst temp \ CMOVA %boolean ] }
{ cc>= [ src1 src2 UCOMISD dst temp \ CMOVAE %boolean ] }
{ cc= [ src1 src2 COMISD dst temp \ %cmov-float= %boolean ] }
{ cc<> [ src1 src2 UCOMISD dst temp \ CMOVNE %boolean ] }
{ cc<>= [ src1 src2 UCOMISD dst temp \ CMOVNP %boolean ] }
{ cc/< [ src2 src1 COMISD dst temp \ CMOVBE %boolean ] }
{ cc/<= [ src2 src1 COMISD dst temp \ CMOVB %boolean ] }
{ cc/> [ src1 src2 COMISD dst temp \ CMOVBE %boolean ] }
{ cc/>= [ src1 src2 COMISD dst temp \ CMOVB %boolean ] }
{ cc/= [ src1 src2 COMISD dst temp \ %cmov-float/= %boolean ] }
{ cc/<> [ src1 src2 COMISD dst temp \ CMOVE %boolean ] }
{ cc/<>= [ src1 src2 COMISD dst temp \ CMOVP %boolean ] }
} case ;
M: x86 %compare-branch ( label cc src1 src2 -- )
CMP order-cc {
{ cc< [ JL ] }
{ cc<= [ JLE ] }
{ cc> [ JG ] }
{ cc>= [ JGE ] }
{ cc= [ JE ] }
{ cc/= [ JNE ] }
M:: x86 %compare-branch ( label cc src1 src2 -- )
src1 src2 CMP
cc order-cc {
{ cc< [ label JL ] }
{ cc<= [ label JLE ] }
{ cc> [ label JG ] }
{ cc>= [ label JGE ] }
{ cc= [ label JE ] }
{ cc/= [ label JNE ] }
} case ;
M: x86 %compare-imm-branch ( label src1 src2 cc -- )
@ -587,22 +589,22 @@ M: x86 %compare-imm-branch ( label src1 src2 cc -- )
: %jump-float/= ( label -- )
[ JNE ] [ JP ] bi ;
M: x86 %compare-float-branch ( label cc src1 src2 -- )
rot {
{ cc< [ swap UCOMISD JA ] }
{ cc<= [ swap UCOMISD JAE ] }
{ cc> [ UCOMISD JA ] }
{ cc>= [ UCOMISD JAE ] }
{ cc= [ COMISD %jump-float= ] }
{ cc<> [ UCOMISD JNE ] }
{ cc<>= [ UCOMISD JNP ] }
{ cc/< [ swap COMISD JBE ] }
{ cc/<= [ swap COMISD JB ] }
{ cc/> [ COMISD JBE ] }
{ cc/>= [ COMISD JB ] }
{ cc/= [ COMISD %jump-float/= ] } ! XXX
{ cc/<> [ COMISD JE ] }
{ cc/<>= [ COMISD JP ] }
M:: x86 %compare-float-branch ( label cc src1 src2 -- )
cc {
{ cc< [ src2 src1 UCOMISD label JA ] }
{ cc<= [ src2 src1 UCOMISD label JAE ] }
{ cc> [ src1 src2 UCOMISD label JA ] }
{ cc>= [ src1 src2 UCOMISD label JAE ] }
{ cc= [ src1 src2 COMISD label %jump-float= ] }
{ cc<> [ src1 src2 UCOMISD label JNE ] }
{ cc<>= [ src1 src2 UCOMISD label JNP ] }
{ cc/< [ src2 src1 COMISD label JBE ] }
{ cc/<= [ src2 src1 COMISD label JB ] }
{ cc/> [ src1 src2 COMISD label JBE ] }
{ cc/>= [ src1 src2 COMISD label JB ] }
{ cc/= [ src1 src2 COMISD label %jump-float/= ] }
{ cc/<> [ src1 src2 COMISD label JE ] }
{ cc/<>= [ src1 src2 COMISD label JP ] }
} case ;
M: x86 %spill ( src n rep -- ) [ spill@ swap ] dip copy-register ;