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