2009-06-02 19:23:47 -04:00
|
|
|
! Copyright (C) 2009 Slava Pestov.
|
2008-09-17 20:31:35 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2009-06-02 19:23:47 -04:00
|
|
|
USING: math math.order namespaces accessors kernel layouts combinators
|
|
|
|
combinators.smart assocs sequences cpu.architecture ;
|
2008-09-17 20:31:35 -04:00
|
|
|
IN: compiler.cfg.stack-frame
|
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
TUPLE: stack-frame
|
|
|
|
{ params integer }
|
|
|
|
{ return integer }
|
|
|
|
{ total-size integer }
|
|
|
|
{ gc-root-size integer }
|
|
|
|
spill-counts ;
|
2008-09-17 20:31:35 -04:00
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
! Stack frame utilities
|
|
|
|
: param-base ( -- n )
|
|
|
|
stack-frame get [ params>> ] [ return>> ] bi + ;
|
2008-09-17 20:31:35 -04:00
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
: spill-float-offset ( n -- offset )
|
|
|
|
double-float-regs reg-size * ;
|
2008-09-17 20:31:35 -04:00
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
: spill-integer-base ( -- n )
|
|
|
|
stack-frame get spill-counts>> double-float-regs [ swap at ] keep reg-size *
|
|
|
|
param-base + ;
|
2008-11-06 20:00:56 -05:00
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
: spill-integer-offset ( n -- offset )
|
|
|
|
cells spill-integer-base + ;
|
2008-09-17 20:31:35 -04:00
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
: spill-area-size ( stack-frame -- n )
|
|
|
|
spill-counts>> [ swap reg-size * ] { } assoc>map sum ;
|
2008-09-17 20:31:35 -04:00
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
: gc-root-base ( -- n )
|
|
|
|
stack-frame get spill-area-size
|
|
|
|
param-base + ;
|
2008-09-17 20:31:35 -04:00
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
: gc-root-offset ( n -- n' ) gc-root-base + ;
|
2008-09-17 20:31:35 -04:00
|
|
|
|
2009-07-04 00:11:23 -04:00
|
|
|
: gc-roots-size ( live-values -- n )
|
|
|
|
keys [ reg-class>> reg-size ] sigma ;
|
2008-09-17 20:31:35 -04:00
|
|
|
|
2009-06-02 19:23:47 -04:00
|
|
|
: (stack-frame-size) ( stack-frame -- n )
|
2008-09-17 20:31:35 -04:00
|
|
|
[
|
2009-06-02 19:23:47 -04:00
|
|
|
{
|
|
|
|
[ spill-area-size ]
|
|
|
|
[ gc-root-size>> ]
|
|
|
|
[ params>> ]
|
|
|
|
[ return>> ]
|
|
|
|
} cleave
|
|
|
|
] sum-outputs ;
|
|
|
|
|
|
|
|
: max-stack-frame ( frame1 frame2 -- frame3 )
|
|
|
|
[ stack-frame new ] 2dip
|
|
|
|
[ [ params>> ] bi@ max >>params ]
|
|
|
|
[ [ return>> ] bi@ max >>return ]
|
|
|
|
[ [ gc-root-size>> ] bi@ max >>gc-root-size ]
|
|
|
|
2tri ;
|