]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/ppc/bootstrap.factor
Merge branch 'master' of git://github.com/seckar/factor
[factor.git] / basis / cpu / ppc / bootstrap.factor
1 ! Copyright (C) 2007, 2008 Slava Pestov.\r
2 ! See http://factorcode.org/license.txt for BSD license.\r
3 USING: bootstrap.image.private kernel kernel.private namespaces\r
4 system cpu.ppc.assembler compiler.codegen.fixup compiler.units\r
5 compiler.constants math math.private layouts words\r
6 vocabs slots.private locals.backend ;\r
7 IN: bootstrap.ppc\r
8 \r
9 4 \ cell set\r
10 big-endian on\r
11 \r
12 CONSTANT: ds-reg 29\r
13 CONSTANT: rs-reg 30\r
14 \r
15 : factor-area-size ( -- n ) 4 bootstrap-cells ;\r
16 \r
17 : stack-frame ( -- n )\r
18     factor-area-size c-area-size + 4 bootstrap-cells align ;\r
19 \r
20 : next-save ( -- n ) stack-frame bootstrap-cell - ;\r
21 : xt-save ( -- n ) stack-frame 2 bootstrap-cells - ;\r
22 \r
23 [\r
24     0 6 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
25     11 6 profile-count-offset LWZ\r
26     11 11 1 tag-fixnum ADDI\r
27     11 6 profile-count-offset STW\r
28     11 6 word-code-offset LWZ\r
29     11 11 compiled-header-size ADDI\r
30     11 MTCTR\r
31     BCTR\r
32 ] jit-profiling jit-define\r
33 \r
34 [\r
35     0 6 LOAD32 rc-absolute-ppc-2/2 rt-this jit-rel\r
36     0 MFLR\r
37     1 1 stack-frame SUBI\r
38     6 1 xt-save STW\r
39     stack-frame 6 LI\r
40     6 1 next-save STW\r
41     0 1 lr-save stack-frame + STW\r
42 ] jit-prolog jit-define\r
43 \r
44 [\r
45     0 6 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
46     6 ds-reg 4 STWU\r
47 ] jit-push-immediate jit-define\r
48 \r
49 [\r
50     0 6 LOAD32 rc-absolute-ppc-2/2 rt-stack-chain jit-rel\r
51     7 6 0 LWZ\r
52     1 7 0 STW\r
53 ] jit-save-stack jit-define\r
54 \r
55 [\r
56     0 6 LOAD32 rc-absolute-ppc-2/2 rt-primitive jit-rel\r
57     6 MTCTR\r
58     BCTR\r
59 ] jit-primitive jit-define\r
60 \r
61 [ 0 BL rc-relative-ppc-3 rt-xt-direct jit-rel ] jit-word-call jit-define\r
62 \r
63 [ 0 B rc-relative-ppc-3 rt-xt jit-rel ] jit-word-jump jit-define\r
64 \r
65 [\r
66     3 ds-reg 0 LWZ\r
67     ds-reg dup 4 SUBI\r
68     0 3 \ f tag-number CMPI\r
69     2 BEQ\r
70     0 B rc-relative-ppc-3 rt-xt jit-rel\r
71 ] jit-if-1 jit-define\r
72 \r
73 [\r
74     0 B rc-relative-ppc-3 rt-xt jit-rel\r
75 ] jit-if-2 jit-define\r
76 \r
77 : jit->r ( -- )\r
78     4 ds-reg 0 LWZ\r
79     ds-reg dup 4 SUBI\r
80     4 rs-reg 4 STWU ;\r
81 \r
82 : jit-2>r ( -- )\r
83     4 ds-reg 0 LWZ\r
84     5 ds-reg -4 LWZ\r
85     ds-reg dup 8 SUBI\r
86     rs-reg dup 8 ADDI\r
87     4 rs-reg 0 STW\r
88     5 rs-reg -4 STW ;\r
89 \r
90 : jit-3>r ( -- )\r
91     4 ds-reg 0 LWZ\r
92     5 ds-reg -4 LWZ\r
93     6 ds-reg -8 LWZ\r
94     ds-reg dup 12 SUBI\r
95     rs-reg dup 12 ADDI\r
96     4 rs-reg 0 STW\r
97     5 rs-reg -4 STW\r
98     6 rs-reg -8 STW ;\r
99 \r
100 : jit-r> ( -- )\r
101     4 rs-reg 0 LWZ\r
102     rs-reg dup 4 SUBI\r
103     4 ds-reg 4 STWU ;\r
104 \r
105 : jit-2r> ( -- )\r
106     4 rs-reg 0 LWZ\r
107     5 rs-reg -4 LWZ\r
108     rs-reg dup 8 SUBI\r
109     ds-reg dup 8 ADDI\r
110     4 ds-reg 0 STW\r
111     5 ds-reg -4 STW ;\r
112 \r
113 : jit-3r> ( -- )\r
114     4 rs-reg 0 LWZ\r
115     5 rs-reg -4 LWZ\r
116     6 rs-reg -8 LWZ\r
117     rs-reg dup 12 SUBI\r
118     ds-reg dup 12 ADDI\r
119     4 ds-reg 0 STW\r
120     5 ds-reg -4 STW\r
121     6 ds-reg -8 STW ;\r
122 \r
123 [\r
124     jit->r\r
125     0 BL rc-relative-ppc-3 rt-xt jit-rel\r
126     jit-r>\r
127 ] jit-dip jit-define\r
128 \r
129 [\r
130     jit-2>r\r
131     0 BL rc-relative-ppc-3 rt-xt jit-rel\r
132     jit-2r>\r
133 ] jit-2dip jit-define\r
134 \r
135 [\r
136     jit-3>r\r
137     0 BL rc-relative-ppc-3 rt-xt jit-rel\r
138     jit-3r>\r
139 ] jit-3dip jit-define\r
140 \r
141 [\r
142     0 1 lr-save stack-frame + LWZ\r
143     1 1 stack-frame ADDI\r
144     0 MTLR\r
145 ] jit-epilog jit-define\r
146 \r
147 [ BLR ] jit-return jit-define\r
148 \r
149 ! Sub-primitives\r
150 \r
151 ! Quotations and words\r
152 [\r
153     3 ds-reg 0 LWZ\r
154     ds-reg dup 4 SUBI\r
155     4 3 quot-xt-offset LWZ\r
156     4 MTCTR\r
157     BCTR\r
158 ] \ (call) define-sub-primitive\r
159 \r
160 [\r
161     3 ds-reg 0 LWZ\r
162     ds-reg dup 4 SUBI\r
163     4 3 word-xt-offset LWZ\r
164     4 MTCTR\r
165     BCTR\r
166 ] \ (execute) define-sub-primitive\r
167 \r
168 ! Objects\r
169 [\r
170     3 ds-reg 0 LWZ\r
171     3 3 tag-mask get ANDI\r
172     3 3 tag-bits get SLWI\r
173     3 ds-reg 0 STW\r
174 ] \ tag define-sub-primitive\r
175 \r
176 [\r
177     3 ds-reg 0 LWZ\r
178     4 ds-reg -4 LWZU\r
179     3 3 1 SRAWI\r
180     4 4 0 0 31 tag-bits get - RLWINM\r
181     4 3 3 LWZX\r
182     3 ds-reg 0 STW\r
183 ] \ slot define-sub-primitive\r
184 \r
185 ! Shufflers\r
186 [\r
187     ds-reg dup 4 SUBI\r
188 ] \ drop define-sub-primitive\r
189 \r
190 [\r
191     ds-reg dup 8 SUBI\r
192 ] \ 2drop define-sub-primitive\r
193 \r
194 [\r
195     ds-reg dup 12 SUBI\r
196 ] \ 3drop define-sub-primitive\r
197 \r
198 [\r
199     3 ds-reg 0 LWZ\r
200     3 ds-reg 4 STWU\r
201 ] \ dup define-sub-primitive\r
202 \r
203 [\r
204     3 ds-reg 0 LWZ\r
205     4 ds-reg -4 LWZ\r
206     ds-reg dup 8 ADDI\r
207     3 ds-reg 0 STW\r
208     4 ds-reg -4 STW\r
209 ] \ 2dup define-sub-primitive\r
210 \r
211 [\r
212     3 ds-reg 0 LWZ\r
213     4 ds-reg -4 LWZ\r
214     5 ds-reg -8 LWZ\r
215     ds-reg dup 12 ADDI\r
216     3 ds-reg 0 STW\r
217     4 ds-reg -4 STW\r
218     5 ds-reg -8 STW\r
219 ] \ 3dup define-sub-primitive\r
220 \r
221 [\r
222     3 ds-reg 0 LWZ\r
223     ds-reg dup 4 SUBI\r
224     3 ds-reg 0 STW\r
225 ] \ nip define-sub-primitive\r
226 \r
227 [\r
228     3 ds-reg 0 LWZ\r
229     ds-reg dup 8 SUBI\r
230     3 ds-reg 0 STW\r
231 ] \ 2nip define-sub-primitive\r
232 \r
233 [\r
234     3 ds-reg -4 LWZ\r
235     3 ds-reg 4 STWU\r
236 ] \ over define-sub-primitive\r
237 \r
238 [\r
239     3 ds-reg -8 LWZ\r
240     3 ds-reg 4 STWU\r
241 ] \ pick define-sub-primitive\r
242 \r
243 [\r
244     3 ds-reg 0 LWZ\r
245     4 ds-reg -4 LWZ\r
246     4 ds-reg 0 STW\r
247     3 ds-reg 4 STWU\r
248 ] \ dupd define-sub-primitive\r
249 \r
250 [\r
251     3 ds-reg 0 LWZ\r
252     4 ds-reg -4 LWZ\r
253     3 ds-reg 4 STWU\r
254     4 ds-reg -4 STW\r
255     3 ds-reg -8 STW\r
256 ] \ tuck define-sub-primitive\r
257 \r
258 [\r
259     3 ds-reg 0 LWZ\r
260     4 ds-reg -4 LWZ\r
261     3 ds-reg -4 STW\r
262     4 ds-reg 0 STW\r
263 ] \ swap define-sub-primitive\r
264 \r
265 [\r
266     3 ds-reg -4 LWZ\r
267     4 ds-reg -8 LWZ\r
268     3 ds-reg -8 STW\r
269     4 ds-reg -4 STW\r
270 ] \ swapd define-sub-primitive\r
271 \r
272 [\r
273     3 ds-reg 0 LWZ\r
274     4 ds-reg -4 LWZ\r
275     5 ds-reg -8 LWZ\r
276     4 ds-reg -8 STW\r
277     3 ds-reg -4 STW\r
278     5 ds-reg 0 STW\r
279 ] \ rot define-sub-primitive\r
280 \r
281 [\r
282     3 ds-reg 0 LWZ\r
283     4 ds-reg -4 LWZ\r
284     5 ds-reg -8 LWZ\r
285     3 ds-reg -8 STW\r
286     5 ds-reg -4 STW\r
287     4 ds-reg 0 STW\r
288 ] \ -rot define-sub-primitive\r
289 \r
290 [ jit->r ] \ load-local define-sub-primitive\r
291 \r
292 ! Comparisons\r
293 : jit-compare ( insn -- )\r
294     0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
295     4 ds-reg 0 LWZ\r
296     5 ds-reg -4 LWZU\r
297     5 0 4 CMP\r
298     2 swap execute( offset -- ) ! magic number\r
299     \ f tag-number 3 LI\r
300     3 ds-reg 0 STW ;\r
301 \r
302 : define-jit-compare ( insn word -- )\r
303     [ [ jit-compare ] curry ] dip define-sub-primitive ;\r
304 \r
305 \ BEQ \ eq? define-jit-compare\r
306 \ BGE \ fixnum>= define-jit-compare\r
307 \ BLE \ fixnum<= define-jit-compare\r
308 \ BGT \ fixnum> define-jit-compare\r
309 \ BLT \ fixnum< define-jit-compare\r
310 \r
311 ! Math\r
312 [\r
313     3 ds-reg 0 LWZ\r
314     ds-reg ds-reg 4 SUBI\r
315     4 ds-reg 0 LWZ\r
316     3 3 4 OR\r
317     3 3 tag-mask get ANDI\r
318     \ f tag-number 4 LI\r
319     0 3 0 CMPI\r
320     2 BNE\r
321     1 tag-fixnum 4 LI\r
322     4 ds-reg 0 STW\r
323 ] \ both-fixnums? define-sub-primitive\r
324 \r
325 : jit-math ( insn -- )\r
326     3 ds-reg 0 LWZ\r
327     4 ds-reg -4 LWZU\r
328     [ 5 3 4 ] dip execute( dst src1 src2 -- )\r
329     5 ds-reg 0 STW ;\r
330 \r
331 [ \ ADD jit-math ] \ fixnum+fast define-sub-primitive\r
332 \r
333 [ \ SUBF jit-math ] \ fixnum-fast define-sub-primitive\r
334 \r
335 [\r
336     3 ds-reg 0 LWZ\r
337     4 ds-reg -4 LWZU\r
338     4 4 tag-bits get SRAWI\r
339     5 3 4 MULLW\r
340     5 ds-reg 0 STW\r
341 ] \ fixnum*fast define-sub-primitive\r
342 \r
343 [ \ AND jit-math ] \ fixnum-bitand define-sub-primitive\r
344 \r
345 [ \ OR jit-math ] \ fixnum-bitor define-sub-primitive\r
346 \r
347 [ \ XOR jit-math ] \ fixnum-bitxor define-sub-primitive\r
348 \r
349 [\r
350     3 ds-reg 0 LWZ\r
351     3 3 NOT\r
352     3 3 tag-mask get XORI\r
353     3 ds-reg 0 STW\r
354 ] \ fixnum-bitnot define-sub-primitive\r
355 \r
356 [\r
357     3 ds-reg 0 LWZ\r
358     3 3 tag-bits get SRAWI\r
359     ds-reg ds-reg 4 SUBI\r
360     4 ds-reg 0 LWZ\r
361     5 4 3 SLW\r
362     6 3 NEG\r
363     7 4 6 SRAW\r
364     7 7 0 0 31 tag-bits get - RLWINM\r
365     0 3 0 CMPI\r
366     2 BGT\r
367     5 7 MR\r
368     5 ds-reg 0 STW\r
369 ] \ fixnum-shift-fast define-sub-primitive\r
370 \r
371 [\r
372     3 ds-reg 0 LWZ\r
373     ds-reg ds-reg 4 SUBI\r
374     4 ds-reg 0 LWZ\r
375     5 4 3 DIVW\r
376     6 5 3 MULLW\r
377     7 6 4 SUBF\r
378     7 ds-reg 0 STW\r
379 ] \ fixnum-mod define-sub-primitive\r
380 \r
381 [\r
382     3 ds-reg 0 LWZ\r
383     ds-reg ds-reg 4 SUBI\r
384     4 ds-reg 0 LWZ\r
385     5 4 3 DIVW\r
386     5 5 tag-bits get SLWI\r
387     5 ds-reg 0 STW\r
388 ] \ fixnum/i-fast define-sub-primitive\r
389 \r
390 [\r
391     3 ds-reg 0 LWZ\r
392     4 ds-reg -4 LWZ\r
393     5 4 3 DIVW\r
394     6 5 3 MULLW\r
395     7 6 4 SUBF\r
396     5 5 tag-bits get SLWI\r
397     5 ds-reg -4 STW\r
398     7 ds-reg 0 STW\r
399 ] \ fixnum/mod-fast define-sub-primitive\r
400 \r
401 [\r
402     3 ds-reg 0 LWZ\r
403     3 3 1 SRAWI\r
404     rs-reg 3 3 LWZX\r
405     3 ds-reg 0 STW\r
406 ] \ get-local define-sub-primitive\r
407 \r
408 [\r
409     3 ds-reg 0 LWZ\r
410     ds-reg ds-reg 4 SUBI\r
411     3 3 1 SRAWI\r
412     rs-reg 3 rs-reg SUBF\r
413 ] \ drop-locals define-sub-primitive\r
414 \r
415 [ "bootstrap.ppc" forget-vocab ] with-compilation-unit\r