]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/cpu/ppc/bootstrap.factor
Delete empty unit tests files, remove 1- and 1+, reorder IN: lines in a lot of places...
[factor.git] / basis / cpu / ppc / bootstrap.factor
index b27f3aee72b0f7940405ce65572943d501af3ce4..c63372fa3f8d36358ccb838409637197929c0351 100644 (file)
@@ -2,17 +2,16 @@
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: bootstrap.image.private kernel kernel.private namespaces\r
 system cpu.ppc.assembler compiler.codegen.fixup compiler.units\r
-compiler.constants math math.private layouts words words.private\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
-4 jit-code-format set\r
-\r
-: ds-reg 29 ;\r
-: rs-reg 30 ;\r
+CONSTANT: ds-reg 13\r
+CONSTANT: rs-reg 14\r
 \r
 : factor-area-size ( -- n ) 4 bootstrap-cells ;\r
 \r
@@ -23,73 +22,57 @@ big-endian on
 : xt-save ( -- n ) stack-frame 2 bootstrap-cells - ;\r
 \r
 [\r
-    0 6 LOAD32\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
-] rc-absolute-ppc-2/2 rt-immediate 1 jit-profiling jit-define\r
+] jit-profiling jit-define\r
 \r
 [\r
-    0 6 LOAD32\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
-] rc-absolute-ppc-2/2 rt-label 1 jit-prolog jit-define\r
-\r
-[\r
-    0 6 LOAD32\r
-    6 ds-reg 4 STWU\r
-] rc-absolute-ppc-2/2 rt-immediate 1 jit-push-immediate jit-define\r
+] jit-prolog jit-define\r
 \r
 [\r
-    0 6 LOAD32\r
-    7 6 0 LWZ\r
-    1 7 0 STW\r
-] rc-absolute-ppc-2/2 rt-stack-chain 1 jit-save-stack jit-define\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\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
-] rc-absolute-ppc-2/2 rt-primitive 1 jit-primitive jit-define\r
+] jit-primitive jit-define\r
+\r
+[ 0 BL rc-relative-ppc-3 rt-xt-pic jit-rel ] jit-word-call jit-define\r
 \r
-[ 0 BL ] rc-relative-ppc-3 rt-xt 0 jit-word-call jit-define\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 0 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
     ds-reg dup 4 SUBI\r
     0 3 \ f tag-number CMPI\r
     2 BEQ\r
-    0 B\r
-] rc-relative-ppc-3 rt-xt 4 jit-if-1 jit-define\r
-\r
-[\r
-    0 B\r
-] rc-relative-ppc-3 rt-xt 0 jit-if-2 jit-define\r
-\r
-: jit-jump-quot ( -- )\r
-    4 3 quot-xt-offset LWZ\r
-    4 MTCTR\r
-    BCTR ;\r
-\r
-[\r
-    0 3 LOAD32\r
-    6 ds-reg 0 LWZ\r
-    6 6 1 SRAWI\r
-    3 3 6 ADD\r
-    3 3 array-start-offset LWZ\r
-    ds-reg dup 4 SUBI\r
-    jit-jump-quot\r
-] rc-absolute-ppc-2/2 rt-immediate 1 jit-dispatch jit-define\r
+    0 B rc-relative-ppc-3 rt-xt jit-rel\r
+    0 B rc-relative-ppc-3 rt-xt jit-rel\r
+] jit-if jit-define\r
 \r
 : jit->r ( -- )\r
     4 ds-reg 0 LWZ\r
@@ -139,46 +122,142 @@ big-endian on
 \r
 [\r
     jit->r\r
-    0 BL\r
+    0 BL rc-relative-ppc-3 rt-xt jit-rel\r
     jit-r>\r
-] rc-relative-ppc-3 rt-xt 3 jit-dip jit-define\r
+] jit-dip jit-define\r
 \r
 [\r
     jit-2>r\r
-    0 BL\r
+    0 BL rc-relative-ppc-3 rt-xt jit-rel\r
     jit-2r>\r
-] rc-relative-ppc-3 rt-xt 6 jit-2dip jit-define\r
+] jit-2dip jit-define\r
 \r
 [\r
     jit-3>r\r
-    0 BL\r
+    0 BL rc-relative-ppc-3 rt-xt jit-rel\r
     jit-3r>\r
-] rc-relative-ppc-3 rt-xt 8 jit-3dip jit-define\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
     0 MTLR\r
-] f f f jit-epilog jit-define\r
+] jit-epilog jit-define\r
 \r
-[ BLR ] f f f jit-return jit-define\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
-    jit-jump-quot\r
-] f f f \ (call) define-sub-primitive\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
+    ! 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
-] f f f \ (execute) define-sub-primitive\r
+] \ (call) define-sub-primitive\r
 \r
 ! Objects\r
 [\r
@@ -186,7 +265,7 @@ big-endian on
     3 3 tag-mask get ANDI\r
     3 3 tag-bits get SLWI\r
     3 ds-reg 0 STW\r
-] f f f \ tag define-sub-primitive\r
+] \ tag define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -195,25 +274,25 @@ big-endian on
     4 4 0 0 31 tag-bits get - RLWINM\r
     4 3 3 LWZX\r
     3 ds-reg 0 STW\r
-] f f f \ slot define-sub-primitive\r
+] \ slot define-sub-primitive\r
 \r
 ! Shufflers\r
 [\r
     ds-reg dup 4 SUBI\r
-] f f f \ drop define-sub-primitive\r
+] \ drop define-sub-primitive\r
 \r
 [\r
     ds-reg dup 8 SUBI\r
-] f f f \ 2drop define-sub-primitive\r
+] \ 2drop define-sub-primitive\r
 \r
 [\r
     ds-reg dup 12 SUBI\r
-] f f f \ 3drop define-sub-primitive\r
+] \ 3drop define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
     3 ds-reg 4 STWU\r
-] f f f \ dup define-sub-primitive\r
+] \ dup define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -221,7 +300,7 @@ big-endian on
     ds-reg dup 8 ADDI\r
     3 ds-reg 0 STW\r
     4 ds-reg -4 STW\r
-] f f f \ 2dup define-sub-primitive\r
+] \ 2dup define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -231,36 +310,36 @@ big-endian on
     3 ds-reg 0 STW\r
     4 ds-reg -4 STW\r
     5 ds-reg -8 STW\r
-] f f f \ 3dup define-sub-primitive\r
+] \ 3dup define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
     ds-reg dup 4 SUBI\r
     3 ds-reg 0 STW\r
-] f f f \ nip define-sub-primitive\r
+] \ nip define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
     ds-reg dup 8 SUBI\r
     3 ds-reg 0 STW\r
-] f f f \ 2nip define-sub-primitive\r
+] \ 2nip define-sub-primitive\r
 \r
 [\r
     3 ds-reg -4 LWZ\r
     3 ds-reg 4 STWU\r
-] f f f \ over define-sub-primitive\r
+] \ over define-sub-primitive\r
 \r
 [\r
     3 ds-reg -8 LWZ\r
     3 ds-reg 4 STWU\r
-] f f f \ pick define-sub-primitive\r
+] \ pick define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
     4 ds-reg -4 LWZ\r
     4 ds-reg 0 STW\r
     3 ds-reg 4 STWU\r
-] f f f \ dupd define-sub-primitive\r
+] \ dupd define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -268,21 +347,21 @@ big-endian on
     3 ds-reg 4 STWU\r
     4 ds-reg -4 STW\r
     3 ds-reg -8 STW\r
-] f f f \ tuck define-sub-primitive\r
+] \ tuck define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
     4 ds-reg -4 LWZ\r
     3 ds-reg -4 STW\r
     4 ds-reg 0 STW\r
-] f f f \ swap define-sub-primitive\r
+] \ swap define-sub-primitive\r
 \r
 [\r
     3 ds-reg -4 LWZ\r
     4 ds-reg -8 LWZ\r
     3 ds-reg -8 STW\r
     4 ds-reg -4 STW\r
-] f f f \ swapd define-sub-primitive\r
+] \ swapd define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -291,7 +370,7 @@ big-endian on
     4 ds-reg -8 STW\r
     3 ds-reg -4 STW\r
     5 ds-reg 0 STW\r
-] f f f \ rot define-sub-primitive\r
+] \ rot define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -300,23 +379,22 @@ big-endian on
     3 ds-reg -8 STW\r
     5 ds-reg -4 STW\r
     4 ds-reg 0 STW\r
-] f f f \ -rot define-sub-primitive\r
+] \ -rot define-sub-primitive\r
 \r
-[ jit->r ] f f f \ load-local define-sub-primitive\r
+[ jit->r ] \ load-local define-sub-primitive\r
 \r
 ! Comparisons\r
 : jit-compare ( insn -- )\r
-    0 3 LOAD32\r
+    0 3 LOAD32 rc-absolute-ppc-2/2 rt-immediate jit-rel\r
     4 ds-reg 0 LWZ\r
     5 ds-reg -4 LWZU\r
     5 0 4 CMP\r
-    2 swap execute ! magic number\r
+    2 swap execute( offset -- ) ! magic number\r
     \ f tag-number 3 LI\r
     3 ds-reg 0 STW ;\r
 \r
 : define-jit-compare ( insn word -- )\r
-    [ [ jit-compare ] curry rc-absolute-ppc-2/2 rt-immediate 1 ] dip\r
-    define-sub-primitive ;\r
+    [ [ jit-compare ] curry ] dip define-sub-primitive ;\r
 \r
 \ BEQ \ eq? define-jit-compare\r
 \ BGE \ fixnum>= define-jit-compare\r
@@ -336,17 +414,17 @@ big-endian on
     2 BNE\r
     1 tag-fixnum 4 LI\r
     4 ds-reg 0 STW\r
-] f f f \ both-fixnums? define-sub-primitive\r
+] \ both-fixnums? define-sub-primitive\r
 \r
 : jit-math ( insn -- )\r
     3 ds-reg 0 LWZ\r
     4 ds-reg -4 LWZU\r
-    [ 5 3 4 ] dip execute\r
+    [ 5 3 4 ] dip execute( dst src1 src2 -- )\r
     5 ds-reg 0 STW ;\r
 \r
-[ \ ADD jit-math ] f f f \ fixnum+fast define-sub-primitive\r
+[ \ ADD jit-math ] \ fixnum+fast define-sub-primitive\r
 \r
-[ \ SUBF jit-math ] f f f \ fixnum-fast define-sub-primitive\r
+[ \ SUBF jit-math ] \ fixnum-fast define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -354,20 +432,20 @@ big-endian on
     4 4 tag-bits get SRAWI\r
     5 3 4 MULLW\r
     5 ds-reg 0 STW\r
-] f f f \ fixnum*fast define-sub-primitive\r
+] \ fixnum*fast define-sub-primitive\r
 \r
-[ \ AND jit-math ] f f f \ fixnum-bitand define-sub-primitive\r
+[ \ AND jit-math ] \ fixnum-bitand define-sub-primitive\r
 \r
-[ \ OR jit-math ] f f f \ fixnum-bitor define-sub-primitive\r
+[ \ OR jit-math ] \ fixnum-bitor define-sub-primitive\r
 \r
-[ \ XOR jit-math ] f f f \ fixnum-bitxor define-sub-primitive\r
+[ \ XOR jit-math ] \ fixnum-bitxor define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
     3 3 NOT\r
     3 3 tag-mask get XORI\r
     3 ds-reg 0 STW\r
-] f f f \ fixnum-bitnot define-sub-primitive\r
+] \ fixnum-bitnot define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -382,7 +460,7 @@ big-endian on
     2 BGT\r
     5 7 MR\r
     5 ds-reg 0 STW\r
-] f f f \ fixnum-shift-fast define-sub-primitive\r
+] \ fixnum-shift-fast define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -392,7 +470,7 @@ big-endian on
     6 5 3 MULLW\r
     7 6 4 SUBF\r
     7 ds-reg 0 STW\r
-] f f f \ fixnum-mod define-sub-primitive\r
+] \ fixnum-mod define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -401,7 +479,7 @@ big-endian on
     5 4 3 DIVW\r
     5 5 tag-bits get SLWI\r
     5 ds-reg 0 STW\r
-] f f f \ fixnum/i-fast define-sub-primitive\r
+] \ fixnum/i-fast define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
@@ -412,20 +490,20 @@ big-endian on
     5 5 tag-bits get SLWI\r
     5 ds-reg -4 STW\r
     7 ds-reg 0 STW\r
-] f f f \ fixnum/mod-fast define-sub-primitive\r
+] \ fixnum/mod-fast define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
     3 3 1 SRAWI\r
     rs-reg 3 3 LWZX\r
     3 ds-reg 0 STW\r
-] f f f \ get-local define-sub-primitive\r
+] \ get-local define-sub-primitive\r
 \r
 [\r
     3 ds-reg 0 LWZ\r
     ds-reg ds-reg 4 SUBI\r
     3 3 1 SRAWI\r
     rs-reg 3 rs-reg SUBF\r
-] f f f \ drop-locals define-sub-primitive\r
+] \ drop-locals define-sub-primitive\r
 \r
 [ "bootstrap.ppc" forget-vocab ] with-compilation-unit\r