]> gitweb.factorcode.org Git - factor.git/blob - basis/cpu/ppc/bootstrap.factor
Merge branch 'master' of git://factorcode.org/git/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 13\r
13 CONSTANT: rs-reg 14\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     0 6 LOAD32 rc-absolute-ppc-2/2 rt-primitive jit-rel\r
54     6 MTCTR\r
55     BCTR\r
56 ] jit-primitive jit-define\r
57 \r
58 [ 0 BL rc-relative-ppc-3 rt-xt-pic jit-rel ] jit-word-call jit-define\r
59 \r
60 [ 0 B rc-relative-ppc-3 rt-xt jit-rel ] jit-word-jump jit-define\r
61 \r
62 [\r
63     3 ds-reg 0 LWZ\r
64     ds-reg dup 4 SUBI\r
65     0 3 \ f tag-number CMPI\r
66     2 BEQ\r
67     0 B rc-relative-ppc-3 rt-xt jit-rel\r
68     0 B rc-relative-ppc-3 rt-xt jit-rel\r
69 ] jit-if jit-define\r
70 \r
71 : jit->r ( -- )\r
72     4 ds-reg 0 LWZ\r
73     ds-reg dup 4 SUBI\r
74     4 rs-reg 4 STWU ;\r
75 \r
76 : jit-2>r ( -- )\r
77     4 ds-reg 0 LWZ\r
78     5 ds-reg -4 LWZ\r
79     ds-reg dup 8 SUBI\r
80     rs-reg dup 8 ADDI\r
81     4 rs-reg 0 STW\r
82     5 rs-reg -4 STW ;\r
83 \r
84 : jit-3>r ( -- )\r
85     4 ds-reg 0 LWZ\r
86     5 ds-reg -4 LWZ\r
87     6 ds-reg -8 LWZ\r
88     ds-reg dup 12 SUBI\r
89     rs-reg dup 12 ADDI\r
90     4 rs-reg 0 STW\r
91     5 rs-reg -4 STW\r
92     6 rs-reg -8 STW ;\r
93 \r
94 : jit-r> ( -- )\r
95     4 rs-reg 0 LWZ\r
96     rs-reg dup 4 SUBI\r
97     4 ds-reg 4 STWU ;\r
98 \r
99 : jit-2r> ( -- )\r
100     4 rs-reg 0 LWZ\r
101     5 rs-reg -4 LWZ\r
102     rs-reg dup 8 SUBI\r
103     ds-reg dup 8 ADDI\r
104     4 ds-reg 0 STW\r
105     5 ds-reg -4 STW ;\r
106 \r
107 : jit-3r> ( -- )\r
108     4 rs-reg 0 LWZ\r
109     5 rs-reg -4 LWZ\r
110     6 rs-reg -8 LWZ\r
111     rs-reg dup 12 SUBI\r
112     ds-reg dup 12 ADDI\r
113     4 ds-reg 0 STW\r
114     5 ds-reg -4 STW\r
115     6 ds-reg -8 STW ;\r
116 \r
117 [\r
118     jit->r\r
119     0 BL rc-relative-ppc-3 rt-xt jit-rel\r
120     jit-r>\r
121 ] jit-dip jit-define\r
122 \r
123 [\r
124     jit-2>r\r
125     0 BL rc-relative-ppc-3 rt-xt jit-rel\r
126     jit-2r>\r
127 ] jit-2dip jit-define\r
128 \r
129 [\r
130     jit-3>r\r
131     0 BL rc-relative-ppc-3 rt-xt jit-rel\r
132     jit-3r>\r
133 ] jit-3dip jit-define\r
134 \r
135 : prepare-(execute) ( -- operand )\r
136     3 ds-reg 0 LWZ\r
137     ds-reg dup 4 SUBI\r
138     4 3 word-xt-offset LWZ\r
139     4 ;\r
140 \r
141 [ prepare-(execute) MTCTR BCTR ] jit-execute-jump jit-define\r
142 \r
143 [ prepare-(execute) MTLR BLRL ] jit-execute-call jit-define\r
144 \r
145 [\r
146     0 1 lr-save stack-frame + LWZ\r
147     1 1 stack-frame ADDI\r
148     0 MTLR\r
149 ] jit-epilog jit-define\r
150 \r
151 [ BLR ] jit-return jit-define\r
152 \r
153 ! ! ! Polymorphic inline caches\r
154 \r
155 ! Load a value from a stack position\r
156 [\r
157     4 ds-reg 0 LWZ rc-absolute-ppc-2 rt-untagged jit-rel\r
158 ] pic-load jit-define\r
159 \r
160 ! Tag\r
161 : load-tag ( -- )\r
162     4 4 tag-mask get ANDI\r
163     4 4 tag-bits get SLWI ;\r
164 \r
165 [ load-tag ] pic-tag jit-define\r
166 \r
167 ! Hi-tag\r
168 [\r
169     3 4 MR\r
170     load-tag\r
171     0 4 object tag-number tag-fixnum CMPI\r
172     2 BNE\r
173     4 3 object tag-number neg LWZ\r
174 ] pic-hi-tag jit-define\r
175 \r
176 ! Tuple\r
177 [\r
178     3 4 MR\r
179     load-tag\r
180     0 4 tuple tag-number tag-fixnum CMPI\r
181     2 BNE\r
182     4 3 tuple tag-number neg bootstrap-cell + LWZ\r
183 ] pic-tuple jit-define\r
184 \r
185 ! Hi-tag and tuple\r
186 [\r
187     3 4 MR\r
188     load-tag\r
189     ! If bits 2 and 3 are set, the tag is either 6 (object) or 7 (tuple)\r
190     0 4 BIN: 110 tag-fixnum CMPI\r
191     5 BLT\r
192     ! Untag r3\r
193     3 3 0 0 31 tag-bits get - RLWINM\r
194     ! Set r4 to 0 for objects, and bootstrap-cell for tuples\r
195     4 4 1 tag-fixnum ANDI\r
196     4 4 1 SRAWI\r
197     ! Load header cell or tuple layout cell\r
198     4 4 3 LWZX\r
199 ] pic-hi-tag-tuple jit-define\r
200 \r
201 [\r
202     0 4 0 CMPI rc-absolute-ppc-2 rt-immediate jit-rel\r
203 ] pic-check-tag jit-define\r
204 \r
205 [\r
206     0 5 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
207     4 0 5 CMP\r
208 ] pic-check jit-define\r
209 \r
210 [ 2 BNE 0 B rc-relative-ppc-3 rt-xt jit-rel ] pic-hit jit-define\r
211 \r
212 ! ! ! Megamorphic caches\r
213 \r
214 [\r
215     ! cache = ...\r
216     0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
217     ! key = class\r
218     5 4 MR\r
219     ! key &= cache.length - 1\r
220     5 5 mega-cache-size get 1- bootstrap-cell * ANDI\r
221     ! cache += array-start-offset\r
222     3 3 array-start-offset ADDI\r
223     ! cache += key\r
224     3 3 5 ADD\r
225     ! if(get(cache) == class)\r
226     6 3 0 LWZ\r
227     6 0 4 CMP\r
228     5 BNE\r
229     ! megamorphic_cache_hits++\r
230     0 4 LOAD32 rc-absolute-ppc-2/2 rt-megamorphic-cache-hits jit-rel\r
231     5 4 0 LWZ\r
232     5 5 1 ADDI\r
233     5 4 0 STW\r
234     ! ... goto get(cache + bootstrap-cell)\r
235     3 3 4 LWZ\r
236     3 3 word-xt-offset LWZ\r
237     3 MTCTR\r
238     BCTR\r
239     ! fall-through on miss\r
240 ] mega-lookup jit-define\r
241 \r
242 ! ! ! Sub-primitives\r
243 \r
244 ! Quotations and words\r
245 [\r
246     3 ds-reg 0 LWZ\r
247     ds-reg dup 4 SUBI\r
248     4 3 quot-xt-offset LWZ\r
249     4 MTCTR\r
250     BCTR\r
251 ] \ (call) define-sub-primitive\r
252 \r
253 ! Objects\r
254 [\r
255     3 ds-reg 0 LWZ\r
256     3 3 tag-mask get ANDI\r
257     3 3 tag-bits get SLWI\r
258     3 ds-reg 0 STW\r
259 ] \ tag define-sub-primitive\r
260 \r
261 [\r
262     3 ds-reg 0 LWZ\r
263     4 ds-reg -4 LWZU\r
264     3 3 1 SRAWI\r
265     4 4 0 0 31 tag-bits get - RLWINM\r
266     4 3 3 LWZX\r
267     3 ds-reg 0 STW\r
268 ] \ slot define-sub-primitive\r
269 \r
270 ! Shufflers\r
271 [\r
272     ds-reg dup 4 SUBI\r
273 ] \ drop define-sub-primitive\r
274 \r
275 [\r
276     ds-reg dup 8 SUBI\r
277 ] \ 2drop define-sub-primitive\r
278 \r
279 [\r
280     ds-reg dup 12 SUBI\r
281 ] \ 3drop define-sub-primitive\r
282 \r
283 [\r
284     3 ds-reg 0 LWZ\r
285     3 ds-reg 4 STWU\r
286 ] \ dup define-sub-primitive\r
287 \r
288 [\r
289     3 ds-reg 0 LWZ\r
290     4 ds-reg -4 LWZ\r
291     ds-reg dup 8 ADDI\r
292     3 ds-reg 0 STW\r
293     4 ds-reg -4 STW\r
294 ] \ 2dup define-sub-primitive\r
295 \r
296 [\r
297     3 ds-reg 0 LWZ\r
298     4 ds-reg -4 LWZ\r
299     5 ds-reg -8 LWZ\r
300     ds-reg dup 12 ADDI\r
301     3 ds-reg 0 STW\r
302     4 ds-reg -4 STW\r
303     5 ds-reg -8 STW\r
304 ] \ 3dup define-sub-primitive\r
305 \r
306 [\r
307     3 ds-reg 0 LWZ\r
308     ds-reg dup 4 SUBI\r
309     3 ds-reg 0 STW\r
310 ] \ nip define-sub-primitive\r
311 \r
312 [\r
313     3 ds-reg 0 LWZ\r
314     ds-reg dup 8 SUBI\r
315     3 ds-reg 0 STW\r
316 ] \ 2nip define-sub-primitive\r
317 \r
318 [\r
319     3 ds-reg -4 LWZ\r
320     3 ds-reg 4 STWU\r
321 ] \ over define-sub-primitive\r
322 \r
323 [\r
324     3 ds-reg -8 LWZ\r
325     3 ds-reg 4 STWU\r
326 ] \ pick define-sub-primitive\r
327 \r
328 [\r
329     3 ds-reg 0 LWZ\r
330     4 ds-reg -4 LWZ\r
331     4 ds-reg 0 STW\r
332     3 ds-reg 4 STWU\r
333 ] \ dupd define-sub-primitive\r
334 \r
335 [\r
336     3 ds-reg 0 LWZ\r
337     4 ds-reg -4 LWZ\r
338     3 ds-reg 4 STWU\r
339     4 ds-reg -4 STW\r
340     3 ds-reg -8 STW\r
341 ] \ tuck define-sub-primitive\r
342 \r
343 [\r
344     3 ds-reg 0 LWZ\r
345     4 ds-reg -4 LWZ\r
346     3 ds-reg -4 STW\r
347     4 ds-reg 0 STW\r
348 ] \ swap define-sub-primitive\r
349 \r
350 [\r
351     3 ds-reg -4 LWZ\r
352     4 ds-reg -8 LWZ\r
353     3 ds-reg -8 STW\r
354     4 ds-reg -4 STW\r
355 ] \ swapd define-sub-primitive\r
356 \r
357 [\r
358     3 ds-reg 0 LWZ\r
359     4 ds-reg -4 LWZ\r
360     5 ds-reg -8 LWZ\r
361     4 ds-reg -8 STW\r
362     3 ds-reg -4 STW\r
363     5 ds-reg 0 STW\r
364 ] \ rot define-sub-primitive\r
365 \r
366 [\r
367     3 ds-reg 0 LWZ\r
368     4 ds-reg -4 LWZ\r
369     5 ds-reg -8 LWZ\r
370     3 ds-reg -8 STW\r
371     5 ds-reg -4 STW\r
372     4 ds-reg 0 STW\r
373 ] \ -rot define-sub-primitive\r
374 \r
375 [ jit->r ] \ load-local define-sub-primitive\r
376 \r
377 ! Comparisons\r
378 : jit-compare ( insn -- )\r
379     0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
380     4 ds-reg 0 LWZ\r
381     5 ds-reg -4 LWZU\r
382     5 0 4 CMP\r
383     2 swap execute( offset -- ) ! magic number\r
384     \ f tag-number 3 LI\r
385     3 ds-reg 0 STW ;\r
386 \r
387 : define-jit-compare ( insn word -- )\r
388     [ [ jit-compare ] curry ] dip define-sub-primitive ;\r
389 \r
390 \ BEQ \ eq? define-jit-compare\r
391 \ BGE \ fixnum>= define-jit-compare\r
392 \ BLE \ fixnum<= define-jit-compare\r
393 \ BGT \ fixnum> define-jit-compare\r
394 \ BLT \ fixnum< define-jit-compare\r
395 \r
396 ! Math\r
397 [\r
398     3 ds-reg 0 LWZ\r
399     ds-reg ds-reg 4 SUBI\r
400     4 ds-reg 0 LWZ\r
401     3 3 4 OR\r
402     3 3 tag-mask get ANDI\r
403     \ f tag-number 4 LI\r
404     0 3 0 CMPI\r
405     2 BNE\r
406     1 tag-fixnum 4 LI\r
407     4 ds-reg 0 STW\r
408 ] \ both-fixnums? define-sub-primitive\r
409 \r
410 : jit-math ( insn -- )\r
411     3 ds-reg 0 LWZ\r
412     4 ds-reg -4 LWZU\r
413     [ 5 3 4 ] dip execute( dst src1 src2 -- )\r
414     5 ds-reg 0 STW ;\r
415 \r
416 [ \ ADD jit-math ] \ fixnum+fast define-sub-primitive\r
417 \r
418 [ \ SUBF jit-math ] \ fixnum-fast define-sub-primitive\r
419 \r
420 [\r
421     3 ds-reg 0 LWZ\r
422     4 ds-reg -4 LWZU\r
423     4 4 tag-bits get SRAWI\r
424     5 3 4 MULLW\r
425     5 ds-reg 0 STW\r
426 ] \ fixnum*fast define-sub-primitive\r
427 \r
428 [ \ AND jit-math ] \ fixnum-bitand define-sub-primitive\r
429 \r
430 [ \ OR jit-math ] \ fixnum-bitor define-sub-primitive\r
431 \r
432 [ \ XOR jit-math ] \ fixnum-bitxor define-sub-primitive\r
433 \r
434 [\r
435     3 ds-reg 0 LWZ\r
436     3 3 NOT\r
437     3 3 tag-mask get XORI\r
438     3 ds-reg 0 STW\r
439 ] \ fixnum-bitnot define-sub-primitive\r
440 \r
441 [\r
442     3 ds-reg 0 LWZ\r
443     3 3 tag-bits get SRAWI\r
444     ds-reg ds-reg 4 SUBI\r
445     4 ds-reg 0 LWZ\r
446     5 4 3 SLW\r
447     6 3 NEG\r
448     7 4 6 SRAW\r
449     7 7 0 0 31 tag-bits get - RLWINM\r
450     0 3 0 CMPI\r
451     2 BGT\r
452     5 7 MR\r
453     5 ds-reg 0 STW\r
454 ] \ fixnum-shift-fast define-sub-primitive\r
455 \r
456 [\r
457     3 ds-reg 0 LWZ\r
458     ds-reg ds-reg 4 SUBI\r
459     4 ds-reg 0 LWZ\r
460     5 4 3 DIVW\r
461     6 5 3 MULLW\r
462     7 6 4 SUBF\r
463     7 ds-reg 0 STW\r
464 ] \ fixnum-mod define-sub-primitive\r
465 \r
466 [\r
467     3 ds-reg 0 LWZ\r
468     ds-reg ds-reg 4 SUBI\r
469     4 ds-reg 0 LWZ\r
470     5 4 3 DIVW\r
471     5 5 tag-bits get SLWI\r
472     5 ds-reg 0 STW\r
473 ] \ fixnum/i-fast define-sub-primitive\r
474 \r
475 [\r
476     3 ds-reg 0 LWZ\r
477     4 ds-reg -4 LWZ\r
478     5 4 3 DIVW\r
479     6 5 3 MULLW\r
480     7 6 4 SUBF\r
481     5 5 tag-bits get SLWI\r
482     5 ds-reg -4 STW\r
483     7 ds-reg 0 STW\r
484 ] \ fixnum/mod-fast define-sub-primitive\r
485 \r
486 [\r
487     3 ds-reg 0 LWZ\r
488     3 3 1 SRAWI\r
489     rs-reg 3 3 LWZX\r
490     3 ds-reg 0 STW\r
491 ] \ get-local define-sub-primitive\r
492 \r
493 [\r
494     3 ds-reg 0 LWZ\r
495     ds-reg ds-reg 4 SUBI\r
496     3 3 1 SRAWI\r
497     rs-reg 3 rs-reg SUBF\r
498 ] \ drop-locals define-sub-primitive\r
499 \r
500 [ "bootstrap.ppc" forget-vocab ] with-compilation-unit\r