system cpu.ppc.assembler compiler.codegen.fixup compiler.units\r
compiler.constants math math.private layouts words\r
vocabs slots.private locals.backend ;\r
+FROM: cpu.ppc.assembler => B ;\r
IN: bootstrap.ppc\r
\r
4 \ cell set\r
big-endian on\r
\r
-CONSTANT: ds-reg 29\r
-CONSTANT: rs-reg 30\r
+CONSTANT: ds-reg 13\r
+CONSTANT: rs-reg 14\r
\r
: factor-area-size ( -- n ) 4 bootstrap-cells ;\r
\r
: xt-save ( -- n ) stack-frame 2 bootstrap-cells - ;\r
\r
[\r
- 0 6 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
- 11 6 profile-count-offset LWZ\r
+ 0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
+ 11 3 profile-count-offset LWZ\r
11 11 1 tag-fixnum ADDI\r
- 11 6 profile-count-offset STW\r
- 11 6 word-code-offset LWZ\r
+ 11 3 profile-count-offset STW\r
+ 11 3 word-code-offset LWZ\r
11 11 compiled-header-size ADDI\r
11 MTCTR\r
BCTR\r
] jit-profiling jit-define\r
\r
[\r
- 0 6 LOAD32 rc-absolute-ppc-2/2 rt-this jit-rel\r
+ 0 3 LOAD32 rc-absolute-ppc-2/2 rt-this jit-rel\r
0 MFLR\r
1 1 stack-frame SUBI\r
- 6 1 xt-save STW\r
- stack-frame 6 LI\r
- 6 1 next-save STW\r
+ 3 1 xt-save STW\r
+ stack-frame 3 LI\r
+ 3 1 next-save STW\r
0 1 lr-save stack-frame + STW\r
] jit-prolog jit-define\r
\r
[\r
- 0 6 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
- 6 ds-reg 4 STWU\r
+ 0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
+ 3 ds-reg 4 STWU\r
] jit-push-immediate jit-define\r
\r
[\r
- 0 6 LOAD32 rc-absolute-ppc-2/2 rt-stack-chain jit-rel\r
- 7 6 0 LWZ\r
- 1 7 0 STW\r
-] jit-save-stack jit-define\r
-\r
-[\r
- 0 6 LOAD32 rc-absolute-ppc-2/2 rt-primitive jit-rel\r
- 6 MTCTR\r
+ 0 3 LOAD32 rc-absolute-ppc-2/2 rt-stack-chain jit-rel\r
+ 4 3 0 LWZ\r
+ 1 4 0 STW\r
+ 0 3 LOAD32 rc-absolute-ppc-2/2 rt-primitive jit-rel\r
+ 3 MTCTR\r
BCTR\r
] jit-primitive jit-define\r
\r
-[ 0 BL rc-relative-ppc-3 rt-xt-direct jit-rel ] jit-word-call jit-define\r
+[ 0 BL rc-relative-ppc-3 rt-xt-pic jit-rel ] jit-word-call jit-define\r
+\r
+[\r
+ 0 6 LOAD32 rc-absolute-ppc-2/2 rt-here jit-rel\r
+ 0 B rc-relative-ppc-3 rt-xt-pic-tail jit-rel\r
+] jit-word-jump jit-define\r
\r
-[ 0 B rc-relative-ppc-3 rt-xt jit-rel ] jit-word-jump jit-define\r
+[ 0 B rc-relative-ppc-3 rt-xt jit-rel ] jit-word-special jit-define\r
\r
[\r
3 ds-reg 0 LWZ\r
0 3 \ f tag-number CMPI\r
2 BEQ\r
0 B rc-relative-ppc-3 rt-xt jit-rel\r
-] jit-if-1 jit-define\r
-\r
-[\r
0 B rc-relative-ppc-3 rt-xt jit-rel\r
-] jit-if-2 jit-define\r
+] jit-if jit-define\r
\r
: jit->r ( -- )\r
4 ds-reg 0 LWZ\r
jit-3r>\r
] jit-3dip jit-define\r
\r
+: prepare-(execute) ( -- operand )\r
+ 3 ds-reg 0 LWZ\r
+ ds-reg dup 4 SUBI\r
+ 4 3 word-xt-offset LWZ\r
+ 4 ;\r
+\r
+[ prepare-(execute) MTCTR BCTR ] jit-execute-jump jit-define\r
+\r
+[ prepare-(execute) MTLR BLRL ] jit-execute-call jit-define\r
+\r
[\r
0 1 lr-save stack-frame + LWZ\r
1 1 stack-frame ADDI\r
\r
[ BLR ] jit-return jit-define\r
\r
-! Sub-primitives\r
+! ! ! Polymorphic inline caches\r
\r
-! Quotations and words\r
+! Don't touch r6 here; it's used to pass the tail call site\r
+! address for tail PICs\r
+\r
+! Load a value from a stack position\r
[\r
- 3 ds-reg 0 LWZ\r
- ds-reg dup 4 SUBI\r
- 4 3 quot-xt-offset LWZ\r
- 4 MTCTR\r
+ 4 ds-reg 0 LWZ rc-absolute-ppc-2 rt-untagged jit-rel\r
+] pic-load jit-define\r
+\r
+! Tag\r
+: load-tag ( -- )\r
+ 4 4 tag-mask get ANDI\r
+ 4 4 tag-bits get SLWI ;\r
+\r
+[ load-tag ] pic-tag jit-define\r
+\r
+! Hi-tag\r
+[\r
+ 3 4 MR\r
+ load-tag\r
+ 0 4 object tag-number tag-fixnum CMPI\r
+ 2 BNE\r
+ 4 3 object tag-number neg LWZ\r
+] pic-hi-tag jit-define\r
+\r
+! Tuple\r
+[\r
+ 3 4 MR\r
+ load-tag\r
+ 0 4 tuple tag-number tag-fixnum CMPI\r
+ 2 BNE\r
+ 4 3 tuple tag-number neg bootstrap-cell + LWZ\r
+] pic-tuple jit-define\r
+\r
+! Hi-tag and tuple\r
+[\r
+ 3 4 MR\r
+ load-tag\r
+ ! If bits 2 and 3 are set, the tag is either 6 (object) or 7 (tuple)\r
+ 0 4 BIN: 110 tag-fixnum CMPI\r
+ 5 BLT\r
+ ! Untag r3\r
+ 3 3 0 0 31 tag-bits get - RLWINM\r
+ ! Set r4 to 0 for objects, and bootstrap-cell for tuples\r
+ 4 4 1 tag-fixnum ANDI\r
+ 4 4 1 SRAWI\r
+ ! Load header cell or tuple layout cell\r
+ 4 4 3 LWZX\r
+] pic-hi-tag-tuple jit-define\r
+\r
+[\r
+ 0 4 0 CMPI rc-absolute-ppc-2 rt-immediate jit-rel\r
+] pic-check-tag jit-define\r
+\r
+[\r
+ 0 5 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
+ 4 0 5 CMP\r
+] pic-check jit-define\r
+\r
+[ 2 BNE 0 B rc-relative-ppc-3 rt-xt jit-rel ] pic-hit jit-define\r
+\r
+! ! ! Megamorphic caches\r
+\r
+[\r
+ ! cache = ...\r
+ 0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
+ ! key = class\r
+ 5 4 MR\r
+ ! key &= cache.length - 1\r
+ 5 5 mega-cache-size get 1 - bootstrap-cell * ANDI\r
+ ! cache += array-start-offset\r
+ 3 3 array-start-offset ADDI\r
+ ! cache += key\r
+ 3 3 5 ADD\r
+ ! if(get(cache) == class)\r
+ 6 3 0 LWZ\r
+ 6 0 4 CMP\r
+ 10 BNE\r
+ ! megamorphic_cache_hits++\r
+ 0 4 LOAD32 rc-absolute-ppc-2/2 rt-megamorphic-cache-hits jit-rel\r
+ 5 4 0 LWZ\r
+ 5 5 1 ADDI\r
+ 5 4 0 STW\r
+ ! ... goto get(cache + bootstrap-cell)\r
+ 3 3 4 LWZ\r
+ 3 3 word-xt-offset LWZ\r
+ 3 MTCTR\r
BCTR\r
-] \ (call) define-sub-primitive\r
+ ! fall-through on miss\r
+] mega-lookup jit-define\r
\r
+! ! ! Sub-primitives\r
+\r
+! Quotations and words\r
[\r
3 ds-reg 0 LWZ\r
ds-reg dup 4 SUBI\r
- 4 3 word-xt-offset LWZ\r
+ 4 3 quot-xt-offset LWZ\r
4 MTCTR\r
BCTR\r
-] \ (execute) define-sub-primitive\r
+] \ (call) define-sub-primitive\r
\r
! Objects\r
[\r