From 0f5d9d368aae9505533db25b6be7c3913dd58325 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sun, 16 May 2010 21:04:18 -0400 Subject: [PATCH] compiler.cfg: refactor stack frame code and fix frame pointer usage in callbacks --- .../build-stack-frame.factor | 33 ++++++++++++++----- basis/compiler/cfg/builder/alien/alien.factor | 5 +++ basis/compiler/cfg/cfg.factor | 1 + .../cfg/linear-scan/linear-scan.factor | 11 +++++-- .../cfg/stack-frame/stack-frame.factor | 5 --- basis/cpu/architecture/architecture.factor | 3 ++ basis/cpu/ppc/ppc.factor | 5 --- basis/cpu/x86/32/32.factor | 22 +++++++------ basis/cpu/x86/x86.factor | 4 +-- 9 files changed, 56 insertions(+), 33 deletions(-) diff --git a/basis/compiler/cfg/build-stack-frame/build-stack-frame.factor b/basis/compiler/cfg/build-stack-frame/build-stack-frame.factor index 1fc9e5ed78..100a14bfab 100644 --- a/basis/compiler/cfg/build-stack-frame/build-stack-frame.factor +++ b/basis/compiler/cfg/build-stack-frame/build-stack-frame.factor @@ -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 ; diff --git a/basis/compiler/cfg/builder/alien/alien.factor b/basis/compiler/cfg/builder/alien/alien.factor index eee2120666..e7da813fec 100644 --- a/basis/compiler/cfg/builder/alien/alien.factor +++ b/basis/compiler/cfg/builder/alien/alien.factor @@ -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 [ { diff --git a/basis/compiler/cfg/cfg.factor b/basis/compiler/cfg/cfg.factor index 5f5283bcd5..4a343d1651 100644 --- a/basis/compiler/cfg/cfg.factor +++ b/basis/compiler/cfg/cfg.factor @@ -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? ; diff --git a/basis/compiler/cfg/linear-scan/linear-scan.factor b/basis/compiler/cfg/linear-scan/linear-scan.factor index 7657937d33..53a7dd8e76 100644 --- a/basis/compiler/cfg/linear-scan/linear-scan.factor +++ b/basis/compiler/cfg/linear-scan/linear-scan.factor @@ -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) ; diff --git a/basis/compiler/cfg/stack-frame/stack-frame.factor b/basis/compiler/cfg/stack-frame/stack-frame.factor index 1018a95a61..2fe0b3cd73 100644 --- a/basis/compiler/cfg/stack-frame/stack-frame.factor +++ b/basis/compiler/cfg/stack-frame/stack-frame.factor @@ -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 \ No newline at end of file diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index 289ccc65ca..d8d36ee1a8 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -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 diff --git a/basis/cpu/ppc/ppc.factor b/basis/cpu/ppc/ppc.factor index 0708f7991f..89ec8f4efa 100644 --- a/basis/cpu/ppc/ppc.factor +++ b/basis/cpu/ppc/ppc.factor @@ -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 ] } diff --git a/basis/cpu/x86/32/32.factor b/basis/cpu/x86/32/32.factor index 31800759f6..5b56e251ac 100755 --- a/basis/cpu/x86/32/32.factor +++ b/basis/cpu/x86/32/32.factor @@ -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 ; diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 3806ccca9b..52d51cc1d0 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -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 ;