compiler.cfg: refactor stack frame code and fix frame pointer usage in callbacks
parent
e286a8daef
commit
3f8e13bf66
|
@ -1,7 +1,7 @@
|
||||||
! Copyright (C) 2008, 2010 Slava Pestov.
|
! Copyright (C) 2008, 2010 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: namespaces accessors math math.order assocs kernel sequences
|
USING: namespaces accessors math math.order assocs kernel sequences
|
||||||
combinators classes words cpu.architecture layouts compiler.cfg
|
combinators classes words system cpu.architecture layouts compiler.cfg
|
||||||
compiler.cfg.rpo compiler.cfg.instructions
|
compiler.cfg.rpo compiler.cfg.instructions
|
||||||
compiler.cfg.registers compiler.cfg.stack-frame ;
|
compiler.cfg.registers compiler.cfg.stack-frame ;
|
||||||
IN: compiler.cfg.build-stack-frame
|
IN: compiler.cfg.build-stack-frame
|
||||||
|
@ -17,18 +17,33 @@ GENERIC: compute-stack-frame* ( insn -- )
|
||||||
M: ##stack-frame compute-stack-frame*
|
M: ##stack-frame compute-stack-frame*
|
||||||
stack-frame>> request-stack-frame ;
|
stack-frame>> request-stack-frame ;
|
||||||
|
|
||||||
M: ##call-gc compute-stack-frame*
|
: frame-required ( -- ) frame-required? on ;
|
||||||
drop
|
|
||||||
frame-required? on
|
: vm-frame-required ( -- )
|
||||||
|
frame-required
|
||||||
stack-frame new t >>calls-vm? request-stack-frame ;
|
stack-frame new t >>calls-vm? request-stack-frame ;
|
||||||
|
|
||||||
M: ##call compute-stack-frame* drop frame-required? on ;
|
M: ##call-gc compute-stack-frame* drop vm-frame-required ;
|
||||||
|
M: ##box compute-stack-frame* drop vm-frame-required ;
|
||||||
|
M: ##unbox compute-stack-frame* drop vm-frame-required ;
|
||||||
|
M: ##box-long-long compute-stack-frame* drop vm-frame-required ;
|
||||||
|
M: ##begin-callback compute-stack-frame* drop vm-frame-required ;
|
||||||
|
M: ##end-callback compute-stack-frame* drop vm-frame-required ;
|
||||||
|
M: ##unary-float-function compute-stack-frame* drop vm-frame-required ;
|
||||||
|
M: ##binary-float-function compute-stack-frame* drop vm-frame-required ;
|
||||||
|
|
||||||
M: ##alien-callback compute-stack-frame* drop frame-required? on ;
|
M: ##call compute-stack-frame* drop frame-required ;
|
||||||
|
M: ##alien-callback compute-stack-frame* drop frame-required ;
|
||||||
|
M: ##spill compute-stack-frame* drop frame-required ;
|
||||||
|
M: ##reload compute-stack-frame* drop frame-required ;
|
||||||
|
|
||||||
M: insn compute-stack-frame*
|
M: ##float>integer compute-stack-frame*
|
||||||
class "frame-required?" word-prop
|
drop cpu ppc? [ frame-required ] when ;
|
||||||
[ frame-required? on ] when ;
|
|
||||||
|
M: ##integer>float compute-stack-frame*
|
||||||
|
drop cpu ppc? [ frame-required ] when ;
|
||||||
|
|
||||||
|
M: insn compute-stack-frame* drop ;
|
||||||
|
|
||||||
: initial-stack-frame ( -- stack-frame )
|
: initial-stack-frame ( -- stack-frame )
|
||||||
stack-frame new cfg get spill-area-size>> >>spill-area-size ;
|
stack-frame new cfg get spill-area-size>> >>spill-area-size ;
|
||||||
|
|
|
@ -178,9 +178,14 @@ M: #alien-assembly emit-node
|
||||||
[ nip xt>> ] [ [ return>> ] [ abi>> ] bi stack-cleanup ] 2bi
|
[ nip xt>> ] [ [ return>> ] [ abi>> ] bi stack-cleanup ] 2bi
|
||||||
"stack-cleanup" set-word-prop ;
|
"stack-cleanup" set-word-prop ;
|
||||||
|
|
||||||
|
: needs-frame-pointer ( -- )
|
||||||
|
cfg get t >>frame-pointer? drop ;
|
||||||
|
|
||||||
M: #alien-callback emit-node
|
M: #alien-callback emit-node
|
||||||
dup params>> xt>> dup
|
dup params>> xt>> dup
|
||||||
[
|
[
|
||||||
|
needs-frame-pointer
|
||||||
|
|
||||||
##prologue
|
##prologue
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
|
@ -24,6 +24,7 @@ M: basic-block hashcode* nip id>> ;
|
||||||
TUPLE: cfg { entry basic-block } word label
|
TUPLE: cfg { entry basic-block } word label
|
||||||
spill-area-size
|
spill-area-size
|
||||||
stack-frame
|
stack-frame
|
||||||
|
frame-pointer?
|
||||||
post-order linear-order
|
post-order linear-order
|
||||||
predecessors-valid? dominance-valid? loops-valid? ;
|
predecessors-valid? dominance-valid? loops-valid? ;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
! Copyright (C) 2008, 2010 Slava Pestov.
|
! Copyright (C) 2008, 2010 Slava Pestov.
|
||||||
! See http://factorcode.org/license.txt for BSD license.
|
! See http://factorcode.org/license.txt for BSD license.
|
||||||
USING: kernel accessors namespaces make locals
|
USING: kernel accessors assocs sequences namespaces make locals
|
||||||
cpu.architecture
|
cpu.architecture
|
||||||
compiler.cfg
|
compiler.cfg
|
||||||
compiler.cfg.rpo
|
compiler.cfg.rpo
|
||||||
|
@ -37,5 +37,12 @@ IN: compiler.cfg.linear-scan
|
||||||
cfg resolve-data-flow
|
cfg resolve-data-flow
|
||||||
cfg check-numbering ;
|
cfg check-numbering ;
|
||||||
|
|
||||||
|
: admissible-registers ( cfg -- regs )
|
||||||
|
[ machine-registers ] dip
|
||||||
|
frame-pointer?>> [
|
||||||
|
[ int-regs ] dip clone
|
||||||
|
[ [ [ frame-reg ] dip remove ] change-at ] keep
|
||||||
|
] unless ;
|
||||||
|
|
||||||
: linear-scan ( cfg -- cfg' )
|
: linear-scan ( cfg -- cfg' )
|
||||||
dup machine-registers (linear-scan) ;
|
dup dup admissible-registers (linear-scan) ;
|
||||||
|
|
|
@ -30,8 +30,3 @@ TUPLE: stack-frame
|
||||||
[ [ spill-area-size>> ] bi@ max >>spill-area-size ]
|
[ [ spill-area-size>> ] bi@ max >>spill-area-size ]
|
||||||
[ [ calls-vm?>> ] bi@ or >>calls-vm? ]
|
[ [ calls-vm?>> ] bi@ or >>calls-vm? ]
|
||||||
} 2cleave ;
|
} 2cleave ;
|
||||||
|
|
||||||
! PowerPC backend sets frame-required? for ##integer>float too
|
|
||||||
\ ##spill t "frame-required?" set-word-prop
|
|
||||||
\ ##unary-float-function t "frame-required?" set-word-prop
|
|
||||||
\ ##binary-float-function t "frame-required?" set-word-prop
|
|
|
@ -212,6 +212,9 @@ M: ulonglong-2-rep scalar-rep-of drop ulonglong-scalar-rep ;
|
||||||
! Mapping from register class to machine registers
|
! Mapping from register class to machine registers
|
||||||
HOOK: machine-registers cpu ( -- assoc )
|
HOOK: machine-registers cpu ( -- assoc )
|
||||||
|
|
||||||
|
! Callbacks are not allowed to clobber this
|
||||||
|
HOOK: frame-reg cpu ( -- reg )
|
||||||
|
|
||||||
! Specifies if %slot, %set-slot and %write-barrier accept the
|
! Specifies if %slot, %set-slot and %write-barrier accept the
|
||||||
! 'scale' and 'tag' parameters, and if %load-memory and
|
! 'scale' and 'tag' parameters, and if %load-memory and
|
||||||
! %store-memory work
|
! %store-memory work
|
||||||
|
|
|
@ -32,11 +32,6 @@ M: label BC [ 0 BC ] dip rc-relative-ppc-2 label-fixup ;
|
||||||
|
|
||||||
enable-float-intrinsics
|
enable-float-intrinsics
|
||||||
|
|
||||||
<<
|
|
||||||
\ ##integer>float t "frame-required?" set-word-prop
|
|
||||||
\ ##float>integer t "frame-required?" set-word-prop
|
|
||||||
>>
|
|
||||||
|
|
||||||
M: ppc machine-registers
|
M: ppc machine-registers
|
||||||
{
|
{
|
||||||
{ int-regs $[ 2 12 [a,b] 16 29 [a,b] append ] }
|
{ int-regs $[ 2 12 [a,b] 16 29 [a,b] append ] }
|
||||||
|
|
|
@ -112,12 +112,12 @@ M: x86.32 %prepare-jump
|
||||||
dst ESP [] sse-insn execute
|
dst ESP [] sse-insn execute
|
||||||
ESP 4 ADD
|
ESP 4 ADD
|
||||||
] [
|
] [
|
||||||
dst x87-insn execute
|
dst ?spill-slot x87-insn execute
|
||||||
] if ; inline
|
] if ; inline
|
||||||
|
|
||||||
M: x86.32 %load-reg-param ( dst reg rep -- )
|
M: x86.32 %load-reg-param ( dst reg rep -- )
|
||||||
[ ?spill-slot ] dip {
|
{
|
||||||
{ int-rep [ MOV ] }
|
{ int-rep [ int-rep %copy ] }
|
||||||
{ float-rep [ drop \ FSTPS \ MOVSS load-float-return ] }
|
{ float-rep [ drop \ FSTPS \ MOVSS load-float-return ] }
|
||||||
{ double-rep [ drop \ FSTPL \ MOVSD load-float-return ] }
|
{ double-rep [ drop \ FSTPL \ MOVSD load-float-return ] }
|
||||||
} case ;
|
} case ;
|
||||||
|
@ -129,14 +129,14 @@ M: x86.32 %load-reg-param ( dst reg rep -- )
|
||||||
ESP [] x87-insn execute
|
ESP [] x87-insn execute
|
||||||
ESP 4 ADD
|
ESP 4 ADD
|
||||||
] [
|
] [
|
||||||
src x87-insn execute
|
src ?spill-slot x87-insn execute
|
||||||
] if ; inline
|
] if ; inline
|
||||||
|
|
||||||
M: x86.32 %store-reg-param ( src reg rep -- )
|
M: x86.32 %store-reg-param ( src reg rep -- )
|
||||||
[ ?spill-slot ] dip {
|
{
|
||||||
{ int-rep [ swap MOV ] }
|
{ int-rep [ swap int-rep %copy ] }
|
||||||
{ float-rep [ \ FLDS \ MOVSS store-float-return ] }
|
{ float-rep [ drop \ FLDS \ MOVSS store-float-return ] }
|
||||||
{ double-rep [ \ FLDL \ MOVSD store-float-return ] }
|
{ double-rep [ drop \ FLDL \ MOVSD store-float-return ] }
|
||||||
} case ;
|
} case ;
|
||||||
|
|
||||||
:: call-unbox-func ( src func -- )
|
:: call-unbox-func ( src func -- )
|
||||||
|
@ -158,8 +158,10 @@ M:: x86.32 %box ( dst src func rep -- )
|
||||||
|
|
||||||
M:: x86.32 %box-long-long ( dst src1 src2 func -- )
|
M:: x86.32 %box-long-long ( dst src1 src2 func -- )
|
||||||
8 save-vm-ptr
|
8 save-vm-ptr
|
||||||
4 stack@ src1 int-rep %copy
|
EAX src1 int-rep %copy
|
||||||
0 stack@ src2 int-rep %copy
|
0 stack@ EAX int-rep %copy
|
||||||
|
EAX src2 int-rep %copy
|
||||||
|
4 stack@ EAX int-rep %copy
|
||||||
func f %alien-invoke
|
func f %alien-invoke
|
||||||
dst EAX tagged-rep %copy ;
|
dst EAX tagged-rep %copy ;
|
||||||
|
|
||||||
|
|
|
@ -26,8 +26,6 @@ M: x86 vector-regs float-regs ;
|
||||||
|
|
||||||
HOOK: stack-reg cpu ( -- reg )
|
HOOK: stack-reg cpu ( -- reg )
|
||||||
|
|
||||||
HOOK: frame-reg cpu ( -- reg )
|
|
||||||
|
|
||||||
HOOK: reserved-stack-space cpu ( -- n )
|
HOOK: reserved-stack-space cpu ( -- n )
|
||||||
|
|
||||||
HOOK: extra-stack-space cpu ( stack-frame -- n )
|
HOOK: extra-stack-space cpu ( stack-frame -- n )
|
||||||
|
@ -1573,6 +1571,8 @@ M: x86 %loop-entry 16 alignment [ NOP ] times ;
|
||||||
M:: x86 %restore-context ( temp1 temp2 -- )
|
M:: x86 %restore-context ( temp1 temp2 -- )
|
||||||
#! Load Factor stack pointers on entry from C to Factor.
|
#! Load Factor stack pointers on entry from C to Factor.
|
||||||
temp1 %context
|
temp1 %context
|
||||||
|
temp2 stack-reg cell neg [+] LEA
|
||||||
|
temp1 "callstack-top" context-field-offset [+] temp2 MOV
|
||||||
ds-reg temp1 "datastack" context-field-offset [+] MOV
|
ds-reg temp1 "datastack" context-field-offset [+] MOV
|
||||||
rs-reg temp1 "retainstack" context-field-offset [+] MOV ;
|
rs-reg temp1 "retainstack" context-field-offset [+] MOV ;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue