1 ! Copyright (C) 2008, 2009 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel sequences alien math classes.algebra fry
4 locals combinators combinators.short-circuit cpu.architecture
5 compiler.tree.propagation.info compiler.cfg.hats
6 compiler.cfg.stacks compiler.cfg.instructions
7 compiler.cfg.utilities compiler.cfg.builder.blocks ;
8 IN: compiler.cfg.intrinsics.alien
10 : emit-<displaced-alien>? ( node -- ? )
12 [ first class>> fixnum class<= ]
13 [ second class>> c-ptr class<= ]
16 : emit-<displaced-alien> ( node -- )
17 dup emit-<displaced-alien>? [
18 [ 2inputs [ ^^untag-fixnum ] dip ] dip
19 node-input-infos second class>>
20 ^^box-displaced-alien ds-push
21 ] [ emit-primitive ] if ;
23 :: inline-alien ( node quot test -- )
24 [let | infos [ node node-input-infos ] |
27 [ node emit-primitive ]
31 : inline-alien-getter? ( infos -- ? )
32 [ first class>> c-ptr class<= ]
33 [ second class>> fixnum class<= ]
36 : prepare-alien-accessor ( info -- offset-vreg )
37 class>> [ 2inputs ^^untag-fixnum swap ] dip ^^unbox-c-ptr ^^add ;
39 : prepare-alien-getter ( infos -- offset-vreg )
40 first prepare-alien-accessor ;
42 : inline-alien-getter ( node quot -- )
43 '[ prepare-alien-getter @ ds-push ]
44 [ inline-alien-getter? ] inline-alien ; inline
46 : inline-alien-setter? ( infos class -- ? )
47 '[ first class>> _ class<= ]
48 [ second class>> c-ptr class<= ]
49 [ third class>> fixnum class<= ]
52 : prepare-alien-setter ( infos -- offset-vreg )
53 second prepare-alien-accessor ;
55 : inline-alien-integer-setter ( node quot -- )
56 '[ prepare-alien-setter ds-pop ^^untag-fixnum @ ]
57 [ fixnum inline-alien-setter? ]
60 : inline-alien-cell-setter ( node quot -- )
61 '[ [ prepare-alien-setter ds-pop ] [ first class>> ] bi ^^unbox-c-ptr @ ]
62 [ pinned-c-ptr inline-alien-setter? ]
65 : inline-alien-float-setter ( node quot -- )
66 '[ prepare-alien-setter ds-pop @ ]
67 [ float inline-alien-setter? ]
70 : emit-alien-unsigned-getter ( node n -- )
73 { 1 [ ^^alien-unsigned-1 ] }
74 { 2 [ ^^alien-unsigned-2 ] }
75 { 4 [ ^^alien-unsigned-4 ] }
77 ] inline-alien-getter ;
79 : emit-alien-signed-getter ( node n -- )
82 { 1 [ ^^alien-signed-1 ] }
83 { 2 [ ^^alien-signed-2 ] }
84 { 4 [ ^^alien-signed-4 ] }
86 ] inline-alien-getter ;
88 : emit-alien-integer-setter ( node n -- )
91 { 1 [ ##set-alien-integer-1 ] }
92 { 2 [ ##set-alien-integer-2 ] }
93 { 4 [ ##set-alien-integer-4 ] }
95 ] inline-alien-integer-setter ;
97 : emit-alien-cell-getter ( node -- )
98 [ ^^alien-cell ^^box-alien ] inline-alien-getter ;
100 : emit-alien-cell-setter ( node -- )
101 [ ##set-alien-cell ] inline-alien-cell-setter ;
103 : emit-alien-float-getter ( node rep -- )
106 { float-rep [ ^^alien-float ] }
107 { double-rep [ ^^alien-double ] }
109 ] inline-alien-getter ;
111 : emit-alien-float-setter ( node rep -- )
114 { float-rep [ ##set-alien-float ] }
115 { double-rep [ ##set-alien-double ] }
117 ] inline-alien-float-setter ;