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.
|
||||
! See http://factorcode.org/license.txt for BSD license.
|
||||
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.registers compiler.cfg.stack-frame ;
|
||||
IN: compiler.cfg.build-stack-frame
|
||||
|
@ -17,18 +17,33 @@ GENERIC: compute-stack-frame* ( insn -- )
|
|||
M: ##stack-frame compute-stack-frame*
|
||||
stack-frame>> request-stack-frame ;
|
||||
|
||||
M: ##call-gc compute-stack-frame*
|
||||
drop
|
||||
frame-required? on
|
||||
: frame-required ( -- ) frame-required? on ;
|
||||
|
||||
: vm-frame-required ( -- )
|
||||
frame-required
|
||||
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*
|
||||
class "frame-required?" word-prop
|
||||
[ frame-required? on ] when ;
|
||||
M: ##float>integer compute-stack-frame*
|
||||
drop cpu ppc? [ frame-required ] when ;
|
||||
|
||||
M: ##integer>float compute-stack-frame*
|
||||
drop cpu ppc? [ frame-required ] when ;
|
||||
|
||||
M: insn compute-stack-frame* drop ;
|
||||
|
||||
: initial-stack-frame ( -- stack-frame )
|
||||
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
|
||||
"stack-cleanup" set-word-prop ;
|
||||
|
||||
: needs-frame-pointer ( -- )
|
||||
cfg get t >>frame-pointer? drop ;
|
||||
|
||||
M: #alien-callback emit-node
|
||||
dup params>> xt>> dup
|
||||
[
|
||||
needs-frame-pointer
|
||||
|
||||
##prologue
|
||||
[
|
||||
{
|
||||
|
|
|
@ -24,6 +24,7 @@ M: basic-block hashcode* nip id>> ;
|
|||
TUPLE: cfg { entry basic-block } word label
|
||||
spill-area-size
|
||||
stack-frame
|
||||
frame-pointer?
|
||||
post-order linear-order
|
||||
predecessors-valid? dominance-valid? loops-valid? ;
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
! Copyright (C) 2008, 2010 Slava Pestov.
|
||||
! 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
|
||||
compiler.cfg
|
||||
compiler.cfg.rpo
|
||||
|
@ -37,5 +37,12 @@ IN: compiler.cfg.linear-scan
|
|||
cfg resolve-data-flow
|
||||
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' )
|
||||
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 ]
|
||||
[ [ calls-vm?>> ] bi@ or >>calls-vm? ]
|
||||
} 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
|
||||
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
|
||||
! 'scale' and 'tag' parameters, and if %load-memory and
|
||||
! %store-memory work
|
||||
|
|
|
@ -32,11 +32,6 @@ M: label BC [ 0 BC ] dip rc-relative-ppc-2 label-fixup ;
|
|||
|
||||
enable-float-intrinsics
|
||||
|
||||
<<
|
||||
\ ##integer>float t "frame-required?" set-word-prop
|
||||
\ ##float>integer t "frame-required?" set-word-prop
|
||||
>>
|
||||
|
||||
M: ppc machine-registers
|
||||
{
|
||||
{ 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
|
||||
ESP 4 ADD
|
||||
] [
|
||||
dst x87-insn execute
|
||||
dst ?spill-slot x87-insn execute
|
||||
] if ; inline
|
||||
|
||||
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 ] }
|
||||
{ double-rep [ drop \ FSTPL \ MOVSD load-float-return ] }
|
||||
} case ;
|
||||
|
@ -129,14 +129,14 @@ M: x86.32 %load-reg-param ( dst reg rep -- )
|
|||
ESP [] x87-insn execute
|
||||
ESP 4 ADD
|
||||
] [
|
||||
src x87-insn execute
|
||||
src ?spill-slot x87-insn execute
|
||||
] if ; inline
|
||||
|
||||
M: x86.32 %store-reg-param ( src reg rep -- )
|
||||
[ ?spill-slot ] dip {
|
||||
{ int-rep [ swap MOV ] }
|
||||
{ float-rep [ \ FLDS \ MOVSS store-float-return ] }
|
||||
{ double-rep [ \ FLDL \ MOVSD store-float-return ] }
|
||||
{
|
||||
{ int-rep [ swap int-rep %copy ] }
|
||||
{ float-rep [ drop \ FLDS \ MOVSS store-float-return ] }
|
||||
{ double-rep [ drop \ FLDL \ MOVSD store-float-return ] }
|
||||
} case ;
|
||||
|
||||
:: 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 -- )
|
||||
8 save-vm-ptr
|
||||
4 stack@ src1 int-rep %copy
|
||||
0 stack@ src2 int-rep %copy
|
||||
EAX src1 int-rep %copy
|
||||
0 stack@ EAX int-rep %copy
|
||||
EAX src2 int-rep %copy
|
||||
4 stack@ EAX int-rep %copy
|
||||
func f %alien-invoke
|
||||
dst EAX tagged-rep %copy ;
|
||||
|
||||
|
|
|
@ -26,8 +26,6 @@ M: x86 vector-regs float-regs ;
|
|||
|
||||
HOOK: stack-reg cpu ( -- reg )
|
||||
|
||||
HOOK: frame-reg cpu ( -- reg )
|
||||
|
||||
HOOK: reserved-stack-space cpu ( -- 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 -- )
|
||||
#! Load Factor stack pointers on entry from C to Factor.
|
||||
temp1 %context
|
||||
temp2 stack-reg cell neg [+] LEA
|
||||
temp1 "callstack-top" context-field-offset [+] temp2 MOV
|
||||
ds-reg temp1 "datastack" context-field-offset [+] MOV
|
||||
rs-reg temp1 "retainstack" context-field-offset [+] MOV ;
|
||||
|
||||
|
|
Loading…
Reference in New Issue