]> gitweb.factorcode.org Git - factor.git/blob - basis/compiler/cfg/builder/alien/params/params.factor
85e9176c44b8887dbd20430dac0b193fac1dec4b
[factor.git] / basis / compiler / cfg / builder / alien / params / params.factor
1 ! Copyright (C) 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: cpu.architecture fry kernel layouts math math.order
4 namespaces sequences vectors ;
5 IN: compiler.cfg.builder.alien.params
6
7 : alloc-stack-param ( rep -- n )
8     stack-params get
9     [ rep-size cell align stack-params +@ ] dip ;
10
11 : ?dummy-stack-params ( rep -- )
12     dummy-stack-params? [ alloc-stack-param drop ] [ drop ] if ;
13
14 : ?dummy-int-params ( rep -- )
15     dummy-int-params? [
16         rep-size cell /i 1 max
17         [ int-regs get [ pop* ] unless-empty ] times
18     ] [ drop ] if ;
19
20 : ?dummy-fp-params ( rep -- )
21     drop dummy-fp-params? [ float-regs get [ pop* ] unless-empty ] when ;
22
23 GENERIC: next-reg-param ( rep -- reg )
24
25 M: int-rep next-reg-param
26     [ ?dummy-stack-params ] [ ?dummy-fp-params ] bi int-regs get pop ;
27
28 M: float-rep next-reg-param
29     [ ?dummy-stack-params ] [ ?dummy-int-params ] bi float-regs get pop ;
30
31 M: double-rep next-reg-param
32     [ ?dummy-stack-params ] [ ?dummy-int-params ] bi float-regs get pop ;
33
34 GENERIC: reg-class-full? ( reg-class -- ? )
35
36 M: stack-params reg-class-full? drop t ;
37
38 M: reg-class reg-class-full? get empty? ;
39
40 : init-reg-class ( abi reg-class -- )
41     [ swap param-regs <reversed> >vector ] keep set ;
42
43 : with-param-regs ( abi quot -- )
44     '[
45         [ int-regs init-reg-class ]
46         [ float-regs init-reg-class ] bi
47         0 stack-params set
48         @
49     ] with-scope ; inline