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.generator.fixup compiler.units
\r
5 compiler.constants math math.private layouts words words.private
\r
6 vocabs slots.private ;
\r
12 4 jit-code-format set
\r
17 : factor-area-size ( -- n ) 4 bootstrap-cells ;
\r
19 : stack-frame ( -- n )
\r
20 factor-area-size c-area-size + 4 bootstrap-cells align ;
\r
22 : next-save ( -- n ) stack-frame bootstrap-cell - ;
\r
23 : xt-save ( -- n ) stack-frame 2 bootstrap-cells - ;
\r
28 11 6 profile-count-offset LWZ
\r
29 11 11 1 tag-fixnum ADDI
\r
30 11 6 profile-count-offset STW
\r
31 11 6 word-code-offset LWZ
\r
32 11 11 compiled-header-size ADDI
\r
35 ] rc-absolute-ppc-2/2 rt-literal 1 jit-profiling jit-define
\r
40 1 1 stack-frame SUBI
\r
44 0 1 lr-save stack-frame + STW
\r
45 ] rc-absolute-ppc-2/2 rt-label 1 jit-prolog jit-define
\r
51 ] rc-absolute-ppc-2/2 rt-literal 1 jit-push-literal jit-define
\r
56 ] rc-absolute-ppc-2/2 rt-immediate 1 jit-push-immediate jit-define
\r
63 ] rc-absolute-ppc-2/2 rt-primitive 1 jit-primitive jit-define
\r
65 [ 0 BL ] rc-relative-ppc-3 rt-xt 0 jit-word-call jit-define
\r
67 [ 0 B ] rc-relative-ppc-3 rt-xt 0 jit-word-jump jit-define
\r
69 : jit-call-quot ( -- )
\r
70 4 3 quot-xt-offset LWZ
\r
77 0 6 \ f tag-number CMPI
\r
83 ] rc-absolute-ppc-2/2 rt-literal 1 jit-if-jump jit-define
\r
91 3 3 array-start-offset LWZ
\r
94 ] rc-absolute-ppc-2/2 rt-literal 1 jit-dispatch jit-define
\r
97 0 1 lr-save stack-frame + LWZ
\r
98 1 1 stack-frame ADDI
\r
100 ] f f f jit-epilog jit-define
\r
102 [ BLR ] f f f jit-return jit-define
\r
106 ! Quotations and words
\r
111 ] f f f \ (call) define-sub-primitive
\r
116 4 3 word-xt-offset LWZ
\r
119 ] f f f \ (execute) define-sub-primitive
\r
124 3 3 tag-mask get ANDI
\r
125 3 3 tag-bits get SLWI
\r
127 ] f f f \ tag define-sub-primitive
\r
133 4 4 0 0 31 tag-bits get - RLWINM
\r
136 ] f f f \ slot define-sub-primitive
\r
141 ] f f f \ drop define-sub-primitive
\r
145 ] f f f \ 2drop define-sub-primitive
\r
149 ] f f f \ 3drop define-sub-primitive
\r
154 ] f f f \ dup define-sub-primitive
\r
162 ] f f f \ 2dup define-sub-primitive
\r
172 ] f f f \ 3dup define-sub-primitive
\r
178 ] f f f \ nip define-sub-primitive
\r
184 ] f f f \ 2nip define-sub-primitive
\r
189 ] f f f \ over define-sub-primitive
\r
194 ] f f f \ pick define-sub-primitive
\r
201 ] f f f \ dupd define-sub-primitive
\r
209 ] f f f \ tuck define-sub-primitive
\r
216 ] f f f \ swap define-sub-primitive
\r
223 ] f f f \ swapd define-sub-primitive
\r
232 ] f f f \ rot define-sub-primitive
\r
241 ] f f f \ -rot define-sub-primitive
\r
247 ] f f f \ >r define-sub-primitive
\r
253 ] f f f \ r> define-sub-primitive
\r
256 : jit-compare ( insn -- )
\r
262 2 swap execute ! magic number
\r
263 \ f tag-number 3 LI
\r
266 : define-jit-compare ( insn word -- )
\r
267 [ [ jit-compare ] curry rc-absolute-ppc-2/2 rt-literal 1 ] dip
\r
268 define-sub-primitive ;
\r
270 \ BEQ \ eq? define-jit-compare
\r
271 \ BGE \ fixnum>= define-jit-compare
\r
272 \ BLE \ fixnum<= define-jit-compare
\r
273 \ BGT \ fixnum> define-jit-compare
\r
274 \ BLT \ fixnum< define-jit-compare
\r
277 : jit-math ( insn -- )
\r
280 [ 5 3 4 ] dip execute
\r
283 [ \ ADD jit-math ] f f f \ fixnum+fast define-sub-primitive
\r
285 [ \ SUBF jit-math ] f f f \ fixnum-fast define-sub-primitive
\r
290 4 4 tag-bits get SRAWI
\r
293 ] f f f \ fixnum*fast define-sub-primitive
\r
295 [ \ AND jit-math ] f f f \ fixnum-bitand define-sub-primitive
\r
297 [ \ OR jit-math ] f f f \ fixnum-bitor define-sub-primitive
\r
299 [ \ XOR jit-math ] f f f \ fixnum-bitxor define-sub-primitive
\r
304 3 3 tag-mask get XORI
\r
306 ] f f f \ fixnum-bitnot define-sub-primitive
\r
308 [ "bootstrap.ppc" forget-vocab ] with-compilation-unit
\r