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
15 : factor-area-size ( -- n ) 4 bootstrap-cells ;
\r
17 : stack-frame ( -- n )
\r
18 factor-area-size c-area-size + 4 bootstrap-cells align ;
\r
20 : next-save ( -- n ) stack-frame bootstrap-cell - ;
\r
21 : xt-save ( -- n ) stack-frame 2 bootstrap-cells - ;
\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
32 ] jit-profiling jit-define
\r
35 0 6 LOAD32 rc-absolute-ppc-2/2 rt-this jit-rel
\r
37 1 1 stack-frame SUBI
\r
41 0 1 lr-save stack-frame + STW
\r
42 ] jit-prolog jit-define
\r
45 0 6 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel
\r
47 ] jit-push-immediate jit-define
\r
50 0 6 LOAD32 rc-absolute-ppc-2/2 rt-stack-chain jit-rel
\r
53 ] jit-save-stack jit-define
\r
56 0 6 LOAD32 rc-absolute-ppc-2/2 rt-primitive jit-rel
\r
59 ] jit-primitive jit-define
\r
61 [ 0 BL rc-relative-ppc-3 rt-xt-direct jit-rel ] jit-word-call jit-define
\r
63 [ 0 B rc-relative-ppc-3 rt-xt jit-rel ] jit-word-jump jit-define
\r
68 0 3 \ f tag-number CMPI
\r
70 0 B rc-relative-ppc-3 rt-xt jit-rel
\r
71 ] jit-if-1 jit-define
\r
74 0 B rc-relative-ppc-3 rt-xt jit-rel
\r
75 ] jit-if-2 jit-define
\r
77 : jit-jump-quot ( -- )
\r
78 4 3 quot-xt-offset LWZ
\r
83 0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel
\r
87 3 3 array-start-offset LWZ
\r
90 ] jit-dispatch jit-define
\r
140 0 BL rc-relative-ppc-3 rt-xt jit-rel
\r
142 ] jit-dip jit-define
\r
146 0 BL rc-relative-ppc-3 rt-xt jit-rel
\r
148 ] jit-2dip jit-define
\r
152 0 BL rc-relative-ppc-3 rt-xt jit-rel
\r
154 ] jit-3dip jit-define
\r
157 0 1 lr-save stack-frame + LWZ
\r
158 1 1 stack-frame ADDI
\r
160 ] jit-epilog jit-define
\r
162 [ BLR ] jit-return jit-define
\r
166 ! Quotations and words
\r
171 ] \ (call) define-sub-primitive
\r
176 4 3 word-xt-offset LWZ
\r
179 ] \ (execute) define-sub-primitive
\r
184 3 3 tag-mask get ANDI
\r
185 3 3 tag-bits get SLWI
\r
187 ] \ tag define-sub-primitive
\r
193 4 4 0 0 31 tag-bits get - RLWINM
\r
196 ] \ slot define-sub-primitive
\r
201 ] \ drop define-sub-primitive
\r
205 ] \ 2drop define-sub-primitive
\r
209 ] \ 3drop define-sub-primitive
\r
214 ] \ dup define-sub-primitive
\r
222 ] \ 2dup define-sub-primitive
\r
232 ] \ 3dup define-sub-primitive
\r
238 ] \ nip define-sub-primitive
\r
244 ] \ 2nip define-sub-primitive
\r
249 ] \ over define-sub-primitive
\r
254 ] \ pick define-sub-primitive
\r
261 ] \ dupd define-sub-primitive
\r
269 ] \ tuck define-sub-primitive
\r
276 ] \ swap define-sub-primitive
\r
283 ] \ swapd define-sub-primitive
\r
292 ] \ rot define-sub-primitive
\r
301 ] \ -rot define-sub-primitive
\r
303 [ jit->r ] \ load-local define-sub-primitive
\r
306 : jit-compare ( insn -- )
\r
307 0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel
\r
311 2 swap execute( offset -- ) ! magic number
\r
312 \ f tag-number 3 LI
\r
315 : define-jit-compare ( insn word -- )
\r
316 [ [ jit-compare ] curry ] dip define-sub-primitive ;
\r
318 \ BEQ \ eq? define-jit-compare
\r
319 \ BGE \ fixnum>= define-jit-compare
\r
320 \ BLE \ fixnum<= define-jit-compare
\r
321 \ BGT \ fixnum> define-jit-compare
\r
322 \ BLT \ fixnum< define-jit-compare
\r
327 ds-reg ds-reg 4 SUBI
\r
330 3 3 tag-mask get ANDI
\r
331 \ f tag-number 4 LI
\r
336 ] \ both-fixnums? define-sub-primitive
\r
338 : jit-math ( insn -- )
\r
341 [ 5 3 4 ] dip execute( dst src1 src2 -- )
\r
344 [ \ ADD jit-math ] \ fixnum+fast define-sub-primitive
\r
346 [ \ SUBF jit-math ] \ fixnum-fast define-sub-primitive
\r
351 4 4 tag-bits get SRAWI
\r
354 ] \ fixnum*fast define-sub-primitive
\r
356 [ \ AND jit-math ] \ fixnum-bitand define-sub-primitive
\r
358 [ \ OR jit-math ] \ fixnum-bitor define-sub-primitive
\r
360 [ \ XOR jit-math ] \ fixnum-bitxor define-sub-primitive
\r
365 3 3 tag-mask get XORI
\r
367 ] \ fixnum-bitnot define-sub-primitive
\r
371 3 3 tag-bits get SRAWI
\r
372 ds-reg ds-reg 4 SUBI
\r
377 7 7 0 0 31 tag-bits get - RLWINM
\r
382 ] \ fixnum-shift-fast define-sub-primitive
\r
386 ds-reg ds-reg 4 SUBI
\r
392 ] \ fixnum-mod define-sub-primitive
\r
396 ds-reg ds-reg 4 SUBI
\r
399 5 5 tag-bits get SLWI
\r
401 ] \ fixnum/i-fast define-sub-primitive
\r
409 5 5 tag-bits get SLWI
\r
412 ] \ fixnum/mod-fast define-sub-primitive
\r
419 ] \ get-local define-sub-primitive
\r
423 ds-reg ds-reg 4 SUBI
\r
425 rs-reg 3 rs-reg SUBF
\r
426 ] \ drop-locals define-sub-primitive
\r
428 [ "bootstrap.ppc" forget-vocab ] with-compilation-unit
\r