1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors biassocs compiler.cfg.registers
4 compiler.cfg.stacks.finalize compiler.cfg.stacks.global
5 compiler.cfg.stacks.local compiler.cfg.utilities kernel math
7 IN: compiler.cfg.stacks
9 : begin-stack-analysis ( -- )
10 <bihash> locs>vregs set
11 0 0 0 0 height-state boa height-state set ;
13 : end-stack-analysis ( cfg -- )
20 finalize-stack-shuffling
23 : create-locs ( loc-class seq -- locs )
24 [ swap new swap >>n ] with map <reversed> ;
26 : stack-locs ( loc-class n -- locs )
29 : (load-vregs) ( n loc-class -- vregs )
30 swap stack-locs [ peek-loc ] map ;
32 : load-vregs ( n loc-class -- vregs )
33 [ (load-vregs) ] [ new swap neg >>n inc-stack ] 2bi ;
35 : store-vregs ( vregs loc-class -- )
36 over length stack-locs [ replace-loc ] 2each ;
39 : ds-drop ( -- ) D: -1 inc-stack ;
41 : ds-peek ( -- vreg ) D: 0 peek-loc ;
43 : ds-pop ( -- vreg ) ds-peek ds-drop ;
46 D: 1 inc-stack D: 0 replace-loc ;
48 : (2inputs) ( -- vreg1 vreg2 )
49 2 ds-loc (load-vregs) first2 ;
51 : 2inputs ( -- vreg1 vreg2 )
52 2 ds-loc load-vregs first2 ;
54 : 3inputs ( -- vreg1 vreg2 vreg3 )
55 3 ds-loc load-vregs first3 ;
57 : binary-op ( quot -- )
58 [ 2inputs ] dip call ds-push ; inline
60 : unary-op ( quot -- )
61 [ ds-pop ] dip call ds-push ; inline