]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/stack-frame/stack-frame.factor
8ad55d76d81e86a63a2f20b46fa988585c54ed05
[factor.git] / basis / compiler / cfg / stack-frame / stack-frame.factor
1 ! Copyright (C) 2009, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: math math.order namespaces accessors kernel layouts
4 combinators combinators.smart assocs sequences cpu.architecture
5 words compiler.cfg.instructions ;
6 IN: compiler.cfg.stack-frame
7
8 TUPLE: stack-frame
9 { params integer }
10 { return integer }
11 { spill-area-size integer }
12 { total-size integer }
13 { calls-vm? boolean } ;
14
15 ! Stack frame utilities
16 : param-base ( -- n )
17     stack-frame get [ params>> ] [ return>> ] bi + ;
18
19 : spill-offset ( n -- offset )
20     param-base + ;
21
22 : (stack-frame-size) ( stack-frame -- n )
23     [
24         [ params>> ] [ return>> ] [ spill-area-size>> ] tri
25     ] sum-outputs ;
26
27 : max-stack-frame ( frame1 frame2 -- frame3 )
28     [ stack-frame new ] 2dip
29     {
30         [ [ params>> ] bi@ max >>params ]
31         [ [ return>> ] bi@ max >>return ]
32         [ [ spill-area-size>> ] bi@ max >>spill-area-size ]
33         [ [ calls-vm?>> ] bi@ or >>calls-vm? ]
34     } 2cleave ;
35
36 ! PowerPC backend sets frame-required? for ##integer>float too
37 \ ##spill t "frame-required?" set-word-prop
38 \ ##unary-float-function t "frame-required?" set-word-prop
39 \ ##binary-float-function t "frame-required?" set-word-prop