convert comparison branch code in compiler to use locals
parent
a6921edd29
commit
c480bec303
|
@ -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 ;
|
||||
|
|
|
@ -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 ;
|
||||
|
|
Loading…
Reference in New Issue