1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: parser kernel namespaces words layouts sequences classes
4 classes.algebra accessors math arrays byte-arrays
5 inference.dataflow optimizer.allot compiler.cfg compiler.vops ;
6 IN: compiler.vops.builder
8 << : TEMP: CREATE dup [ get ] curry define-inline ; parsing >>
10 ! Temps Inputs Outputs
11 TEMP: $1 TEMP: #1 TEMP: ^1
12 TEMP: $2 TEMP: #2 TEMP: ^2
13 TEMP: $3 TEMP: #3 TEMP: ^3
14 TEMP: $4 TEMP: #4 TEMP: ^4
15 TEMP: $5 TEMP: #5 TEMP: ^5
17 GENERIC: emit-literal ( vreg object -- )
19 M: fixnum emit-literal ( vreg object -- )
20 tag-bits get shift %iconst emit ;
23 class tag-number %iconst emit ;
25 M: object emit-literal ( vreg object -- )
26 next-vreg [ %literal-table emit ] keep
29 : temps ( seq -- ) [ next-vreg swap set ] each ;
31 : init-intrinsic ( -- )
32 { $1 $2 $3 $4 ^1 ^2 ^3 ^4 } temps ;
34 : load-iconst ( value -- vreg )
35 [ next-vreg dup ] dip %iconst emit ;
37 : load-tag-mask ( -- vreg )
38 tag-mask get load-iconst ;
40 : load-tag-bits ( -- vreg )
41 tag-bits get load-iconst ;
43 : emit-tag-fixnum ( out in -- )
44 load-tag-bits %shl emit ;
46 : emit-untag-fixnum ( out in -- )
47 load-tag-bits %sar emit ;
49 : emit-untag ( out in -- )
50 next-vreg dup tag-mask get bitnot %iconst emit
54 $1 #1 load-tag-mask %and emit
55 ^1 $1 emit-tag-fixnum ;
57 : emit-slot ( node -- )
58 [ ^1 #1 #2 ] dip dup in-d>> first node-class class-tag %%slot emit ;
60 UNION: immediate fixnum POSTPONE: f ;
62 : emit-write-barrier ( node -- )
63 dup in-d>> first node-class immediate class< [ #2 %write-barrier emit ] unless ;
65 : emit-set-slot ( node -- )
66 [ emit-write-barrier ]
67 [ [ #1 #2 #3 ] dip dup in-d>> second node-class class-tag %%set-slot emit ]
70 : emit-fixnum-bitnot ( -- )
72 ^1 $1 load-tag-mask %xor emit ;
74 : emit-fixnum+fast ( -- )
77 : emit-fixnum-fast ( -- )
80 : emit-fixnum-bitand ( -- )
83 : emit-fixnum-bitor ( -- )
86 : emit-fixnum-bitxor ( -- )
89 : emit-fixnum*fast ( -- )
90 $1 #1 emit-untag-fixnum
93 : emit-fixnum-shift-left-fast ( n -- )
94 [ $1 ] dip %iconst emit
97 : emit-fixnum-shift-right-fast ( n -- )
98 [ $1 ] dip %iconst emit
102 : emit-fixnum-shift-fast ( n -- )
104 [ emit-fixnum-shift-left-fast ]
105 [ neg emit-fixnum-shift-right-fast ] if ;
107 : emit-fixnum-compare ( cc -- )
109 [ ^1 $1 ] dip %%iboolean emit ;
111 : emit-fixnum<= ( -- )
112 cc<= emit-fixnum-compare ;
114 : emit-fixnum>= ( -- )
115 cc>= emit-fixnum-compare ;
117 : emit-fixnum< ( -- )
118 cc< emit-fixnum-compare ;
120 : emit-fixnum> ( -- )
121 cc> emit-fixnum-compare ;
124 cc= emit-fixnum-compare ;
126 : emit-unbox-float ( out in -- )
129 : emit-box-float ( out in -- )
132 : emit-unbox-floats ( -- )
133 $1 #1 emit-unbox-float
134 $2 #2 emit-unbox-float ;
139 ^1 $3 emit-box-float ;
144 ^1 $3 emit-box-float ;
149 ^1 $3 emit-box-float ;
151 : emit-float/f ( -- )
154 ^1 $3 emit-box-float ;
156 : emit-float-compare ( cc -- )
159 [ ^1 $3 ] dip %%fboolean emit ;
161 : emit-float<= ( -- )
162 cc<= emit-float-compare ;
164 : emit-float>= ( -- )
165 cc>= emit-float-compare ;
168 cc< emit-float-compare ;
171 cc> emit-float-compare ;
174 cc= emit-float-compare ;
176 : emit-allot ( vreg size class -- )
177 [ tag-number ] [ type-number ] bi %%allot emit ;
179 : emit-(tuple) ( layout -- )
180 [ [ ^1 ] dip size>> 2 + tuple emit-allot ]
181 [ [ $1 ] dip emit-literal ] bi
183 $1 ^1 $2 tuple tag-number %%set-slot emit ;
185 : emit-(array) ( n -- )
186 [ [ ^1 ] dip 2 + array emit-allot ]
187 [ [ $1 ] dip emit-literal ] bi
189 $1 ^1 $2 array tag-number %%set-slot emit ;
191 : emit-(byte-array) ( n -- )
192 [ [ ^1 ] dip bytes>cells 2 + byte-array emit-allot ]
193 [ [ $1 ] dip emit-literal ] bi
195 $1 ^1 $2 byte-array tag-number %%set-slot emit ;