122 lines
3.9 KiB
Factor
Executable File
122 lines
3.9 KiB
Factor
Executable File
! Copyright (C) 2007 Slava Pestov.
|
|
! See http://factorcode.org/license.txt for BSD license.
|
|
USING: bootstrap.image.private kernel namespaces system
|
|
cpu.ppc.assembler math layouts words vocabs ;
|
|
IN: bootstrap.ppc
|
|
|
|
4 \ cell set
|
|
big-endian on
|
|
|
|
4 jit-code-format set
|
|
|
|
: ds-reg 14 ;
|
|
|
|
: word-reg 3 ;
|
|
: quot-reg 3 ;
|
|
: scan-reg 5 ;
|
|
: temp-reg 6 ;
|
|
: xt-reg 11 ;
|
|
|
|
: factor-area-size 4 bootstrap-cells ;
|
|
|
|
: stack-frame
|
|
factor-area-size c-area-size + 4 bootstrap-cells align ;
|
|
|
|
: next-save stack-frame bootstrap-cell - ;
|
|
: xt-save stack-frame 2 bootstrap-cells - ;
|
|
: array-save stack-frame 3 bootstrap-cells - ;
|
|
: scan-save stack-frame 4 bootstrap-cells - ;
|
|
|
|
[
|
|
temp-reg quot-reg quot-array@ LWZ ! load array
|
|
scan-reg temp-reg scan@ ADDI ! initialize scan pointer
|
|
] { } make jit-setup set
|
|
|
|
[
|
|
0 MFLR
|
|
1 1 stack-frame neg ADDI
|
|
xt-reg 1 xt-save STW ! save XT
|
|
stack-frame xt-reg LI
|
|
xt-reg 1 next-save STW ! save frame size
|
|
temp-reg 1 array-save STW ! save array
|
|
0 1 lr-save stack-frame + STW ! save return address
|
|
] { } make jit-prolog set
|
|
|
|
[
|
|
temp-reg scan-reg 4 LWZU ! load literal and advance
|
|
temp-reg ds-reg 4 STWU ! push literal
|
|
] { } make jit-push-literal set
|
|
|
|
[
|
|
temp-reg scan-reg 4 LWZU ! load wrapper and advance
|
|
temp-reg dup wrapper@ LWZ ! load wrapped object
|
|
temp-reg ds-reg 4 STWU ! push wrapped object
|
|
] { } make jit-push-wrapper set
|
|
|
|
[
|
|
4 1 MR ! pass stack pointer to primitive
|
|
] { } make jit-word-primitive-jump set
|
|
|
|
[
|
|
4 1 MR ! pass stack pointer to primitive
|
|
] { } make jit-word-primitive-call set
|
|
|
|
: load-xt ( -- )
|
|
word-reg scan-reg 4 LWZU ! load word and advance
|
|
xt-reg word-reg word-xt@ LWZ ;
|
|
|
|
: jit-call
|
|
scan-reg 1 scan-save STW ! save scan pointer
|
|
xt-reg MTLR ! pass XT to callee
|
|
BLRL ! call
|
|
scan-reg 1 scan-save LWZ ! restore scan pointer
|
|
;
|
|
|
|
: jit-jump
|
|
xt-reg MTCTR BCTR ;
|
|
|
|
[ load-xt jit-call ] { } make jit-word-call set
|
|
|
|
[ load-xt jit-jump ] { } make jit-word-jump set
|
|
|
|
: load-branch
|
|
temp-reg ds-reg 0 LWZ ! load boolean
|
|
0 temp-reg \ f tag-number CMPI ! compare it with f
|
|
quot-reg scan-reg MR ! point quot-reg at false branch
|
|
2 BNE ! skip next insn if its not f
|
|
quot-reg dup 4 ADDI ! point quot-reg at true branch
|
|
quot-reg dup 4 LWZ ! load the branch
|
|
ds-reg dup 4 SUBI ! pop boolean
|
|
scan-reg dup 12 ADDI ! advance scan pointer
|
|
xt-reg quot-reg quot-xt@ LWZ ! load quotation-xt
|
|
;
|
|
|
|
[
|
|
load-branch jit-jump
|
|
] { } make jit-if-jump set
|
|
|
|
[
|
|
load-branch jit-call
|
|
] { } make jit-if-call set
|
|
|
|
[
|
|
temp-reg ds-reg 0 LWZ ! load index
|
|
temp-reg dup 1 SRAWI ! turn it into an array offset
|
|
ds-reg dup 4 SUBI ! pop index
|
|
scan-reg dup 4 LWZ ! load array
|
|
temp-reg dup scan-reg ADD ! compute quotation location
|
|
quot-reg temp-reg array-start LWZ ! load quotation
|
|
xt-reg quot-reg quot-xt@ LWZ ! load quotation-xt
|
|
jit-jump ! execute quotation
|
|
] { } make jit-dispatch set
|
|
|
|
[
|
|
0 1 lr-save stack-frame + LWZ ! load return address
|
|
1 1 stack-frame ADDI ! pop stack frame
|
|
0 MTLR ! get ready to return
|
|
] { } make jit-epilog set
|
|
|
|
[ BLR ] { } make jit-return set
|
|
|
|
"bootstrap.ppc" forget-vocab
|