factor/basis/compiler/cfg/stacks/stacks.factor

71 lines
1.8 KiB
Factor

! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
USING: accessors biassocs compiler.cfg compiler.cfg.registers
compiler.cfg.stacks.finalize compiler.cfg.stacks.global
compiler.cfg.stacks.height compiler.cfg.stacks.local compiler.cfg.utilities
fry kernel math namespaces sequences ;
IN: compiler.cfg.stacks
: begin-stack-analysis ( -- )
<bihash> locs>vregs set
H{ } clone ds-heights set
H{ } clone rs-heights set
H{ } clone peek-sets set
H{ } clone replace-sets set
H{ } clone kill-sets set
initial-height-state height-state set ;
: end-stack-analysis ( -- )
cfg get
{
compute-anticip-sets
compute-live-sets
compute-pending-sets
compute-dead-sets
compute-avail-sets
finalize-stack-shuffling
} apply-passes ;
: create-locs ( loc-class seq -- locs )
[ swap new swap >>n ] with map <reversed> ;
: stack-locs ( loc-class n -- locs )
iota create-locs ;
: (load-vregs) ( n loc-class -- vregs )
swap stack-locs [ peek-loc ] map ;
: load-vregs ( n loc-class -- vregs )
[ (load-vregs) ] [ new swap neg >>n inc-stack ] 2bi ;
: store-vregs ( vregs loc-class -- )
over length stack-locs [ replace-loc ] 2each ;
! Utility
: ds-drop ( -- ) D: -1 inc-stack ;
: ds-peek ( -- vreg ) D: 0 peek-loc ;
: ds-pop ( -- vreg ) ds-peek ds-drop ;
: ds-push ( vreg -- )
D: 1 inc-stack D: 0 replace-loc ;
: (2inputs) ( -- vreg1 vreg2 )
2 ds-loc (load-vregs) first2 ;
: 2inputs ( -- vreg1 vreg2 )
2 ds-loc load-vregs first2 ;
: 3inputs ( -- vreg1 vreg2 vreg3 )
3 ds-loc load-vregs first3 ;
: binary-op ( quot -- )
[ 2inputs ] dip call ds-push ; inline
: unary-op ( quot -- )
[ ds-pop ] dip call ds-push ; inline
: adjust-d ( n -- )
<ds-loc> height-state get swap adjust ;