1 ! Copyright (C) 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays assocs cpu.architecture fry kernel layouts locals
4 math math.order namespaces sequences vectors ;
5 IN: compiler.cfg.builder.alien.params
9 GENERIC: alloc-stack-param ( rep -- n )
11 M: object alloc-stack-param ( rep -- n )
13 [ rep-size cell align stack-params +@ ] dip ;
15 M: float-rep alloc-stack-param ( rep -- n )
16 stack-params get swap rep-size
17 [ cell align stack-params +@ ] keep
18 float-right-align-on-stack? [ + ] [ drop ] if ;
20 : ?dummy-stack-params ( rep -- )
21 dummy-stack-params? [ alloc-stack-param drop ] [ drop ] if ;
23 : ?dummy-int-params ( rep -- )
25 rep-size cell /i 1 max
26 [ int-regs get [ pop* ] unless-empty ] times
29 : ?dummy-fp-params ( rep -- )
30 drop dummy-fp-params? [ float-regs get [ pop* ] unless-empty ] when ;
32 GENERIC: next-reg-param ( odd-register? rep -- reg )
34 M: int-rep next-reg-param
35 [ nip ?dummy-stack-params ]
36 [ nip ?dummy-fp-params ]
38 int-regs get last even?
39 [ int-regs get pop* ] when
41 2tri int-regs get pop ;
43 M: object next-reg-param
44 nip [ ?dummy-stack-params ] [ ?dummy-int-params ] bi
47 : reg-class-full? ( reg-class odd-register? -- ? )
48 over length 1 = and [ dup delete-all ] when empty? ;
50 : init-reg-class ( abi reg-class -- )
51 [ swap param-regs at <reversed> >vector ] keep set ;
53 : init-regs ( regs -- )
54 [ <reversed> >vector swap set ] assoc-each ;
56 SYMBOLS: stack-values reg-values ;
58 :: next-parameter ( vreg rep on-stack? odd-register? -- )
60 [ dup dup reg-class-of get odd-register? reg-class-full? ] dip or
61 [ alloc-stack-param stack-values ] [ odd-register? swap next-reg-param reg-values ] if
62 [ 3array ] dip get push ;
64 : next-return-reg ( rep -- reg ) reg-class-of get pop ;
66 : with-return-regs ( quot -- )
67 '[ return-regs init-regs @ ] with-scope ; inline