]> gitweb.factorcode.org Git - factor.git/commitdiff
starting to update compiler for powerpc
authorSlava Pestov <slava@factorcode.org>
Tue, 24 May 2005 05:26:45 +0000 (05:26 +0000)
committerSlava Pestov <slava@factorcode.org>
Tue, 24 May 2005 05:26:45 +0000 (05:26 +0000)
library/bootstrap/boot-stage2.factor
library/compiler/ppc/alien.factor
library/compiler/ppc/assembler.factor
library/compiler/ppc/generator.factor
library/compiler/ppc/stack.factor
library/compiler/x86/fixnum.factor
library/compiler/x86/generator.factor

index e5a89419e742694f5cbd38ecdaa2c61641275df6..ec79d33ed1620cff6f477f544aeb31c1dd93a3bf 100644 (file)
@@ -66,8 +66,8 @@ cpu "x86" = [
 \r
 cpu "ppc" = [\r
     "/library/compiler/ppc/assembler.factor"\r
-    "/library/compiler/ppc/stack.factor"\r
     "/library/compiler/ppc/generator.factor"\r
+    "/library/compiler/ppc/stack.factor"\r
     "/library/compiler/ppc/alien.factor"\r
 ] pull-in\r
 \r
index de49b67138d99b9d7068d55ff77a93a0c1057614..97bc3a1354c8a77255f34f5a29064cf9b7da8442 100644 (file)
@@ -1,33 +1,27 @@
 ! Copyright (C) 2005 Slava Pestov.
 ! See http://factor.sf.net/license.txt for BSD license.
 IN: assembler
-USING: alien compiler inference kernel kernel-internals lists
-math memory namespaces words ;
+USING: alien compiler compiler-backend inference kernel
+kernel-internals lists math memory namespaces words ;
 
-\ alien-invoke [
-    uncons load-library 2dup 1 rel-dlsym dlsym compile-call-far
-] "generator" set-word-prop
+M: %alien-invoke generate-node ( vop -- )
+    uncons load-library 2dup 1 rel-dlsym dlsym compile-call-far ;
 
 : stack-size 8 + 16 align ;
 : stack@ 3 + cell * ;
 
-#parameters [
-    dup 0 = [ drop ] [ stack-size 1 1 rot SUBI ] ifte
-] "generator" set-word-prop
+M: %parameters generate-node ( vop -- )
+    dup 0 = [ drop ] [ stack-size 1 1 rot SUBI ] ifte ;
 
-#unbox [
+M: %unbox generate-node ( vop -- )
     uncons f 2dup 1 rel-dlsym dlsym compile-call-far
-    3 1 rot stack@ STW
-] "generator" set-word-prop
+    3 1 rot stack@ STW ;
 
-#parameter [
-    dup 3 + 1 rot stack@ LWZ
-] "generator" set-word-prop
+M: %parameter generate-node ( vop -- )
+    dup 3 + 1 rot stack@ LWZ ;
 
-#box [
-    f 2dup 1 rel-dlsym dlsym compile-call-far
-] "generator" set-word-prop
+M: %box generate-node ( vop -- )
+    f 2dup 1 rel-dlsym dlsym compile-call-far ;
 
-#cleanup [
-    dup 0 = [ drop ] [ stack-size 1 1 rot ADDI ] ifte
-] "generator" set-word-prop
+M: %cleanup generate-node ( vop -- )
+    dup 0 = [ drop ] [ stack-size 1 1 rot ADDI ] ifte ;
index d7254537a78a554c8877fcfae136f3122c341be0..4dab533b8dfeba39b97968cd36d13c58e04a5f75 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2005 Slava Pestov.
 ! See http://factor.sf.net/license.txt for BSD license.
 IN: assembler
-USING: errors kernel math memory words ;
+USING: compiler errors kernel math memory words ;
 
 ! See the Motorola or IBM documentation for details. The opcode
 ! names are standard, and the operand order is the same as in
@@ -45,9 +45,19 @@ USING: errors kernel math memory words ;
 : SUBI neg ADDI ;
 : ORI d-form 24 insn ;
 : SRAWI 824 0 x-form 31 insn ;
-: BL 0 1 i-form 18 insn ;
-: B 0 0 i-form 18 insn ;
-: BC 0 0 b-form 16 insn ;
+
+GENERIC: BL
+M: integer BL 0 1 i-form 18 insn ;
+M: word BL 0 BL relative-24 ;
+
+GENERIC: B
+M: integer B 0 0 i-form 18 insn ;
+M: word B 0 B relative-24 ;
+
+GENERIC: BC
+M: integer BC 0 0 b-form 16 insn ;
+M: word BC >r 0 BC r> relative-14 ;
+
 : BEQ 12 2 rot BC ;
 : BNE 4 2 rot BC ;
 : BCLR 0 8 0 0 b-form 19 insn ;
index d1ac535a88d3025baa5360eb5a9aa4734e8c39ea..b23c278b0c183d61f81c3fdb5969416b8066424c 100644 (file)
@@ -1,17 +1,27 @@
 ! Copyright (C) 2005 Slava Pestov.
 ! See http://factor.sf.net/license.txt for BSD license.
-IN: assembler
-USING: compiler inference kernel kernel-internals lists math
-words ;
+IN: compiler-backend
+USING: assembler compiler inference kernel kernel-internals
+lists math memory words ;
+
+! PowerPC register assignments
+! r14 data stack
+! r15 call stack
+! r16 callframe
+! r17 executing
+! r18-r30 vregs
+
+GENERIC: v>operand
+M: integer v>operand tag-bits shift ;
+M: vreg v>operand vreg-n 18 + ;
 
 ! At the start of each word that calls a subroutine, we store
 ! the link register in r0, then push r0 on the C stack.
-#prologue [
+M: %prologue generate-node ( vop -- )
     drop
     1 1 -16 STWU
     0 MFLR
-    0 1 20 STW
-] "generator" set-word-prop
+    0 1 20 STW ;
 
 ! At the end of each word that calls a subroutine, we store
 ! the previous link register value in r0 by popping it off the
@@ -22,20 +32,6 @@ words ;
     1 1 16 ADDI
     0 MTLR ;
 
-\ slot [
-    PEEK-DS
-    2unlist type-tag >r cell * r> - >r 18 18 r> LWZ
-    REPL-DS
-] "generator" set-word-prop
-
-#return-to [
-    0 18 LOAD32  absolute-16/16
-    1 1 -16 STWU
-    18 1 20 STW
-] "generator" set-word-prop
-
-#return [ drop compile-epilogue BLR ] "generator" set-word-prop
-
 ! Far calls are made to addresses already known when the
 ! IR node is being generated. No forward reference far
 ! calls are possible.
@@ -48,16 +44,21 @@ words ;
     dup primitive? [
         dup 1 rel-primitive word-xt compile-call-far
     ] [
-        0 BL relative-24
+        BL
     ] ifte ;
 
-#call-label [
-    ! Hack: length of instruction sequence that follows
+: compile-call-label ( word -- )
+    #! Hack: length of instruction sequence that follows
     0 1 rel-address  compiled-offset 20 + 18 LOAD32
     1 1 -16 STWU
     18 1 20 STW
-    0 B relative-24
-] "generator" set-word-prop
+    B ;
+
+M: %call-label generate-node ( vop -- )
+    vop-label compile-call-label ;
+
+M: %call generate-node ( vop -- )
+    vop-label dup postpone-word compile-call-label ;
 
 : compile-jump-far ( word -- )
     19 LOAD32
@@ -68,29 +69,39 @@ words ;
     dup primitive? [
         dup 1 rel-primitive word-xt compile-jump-far
     ] [
-        0 B relative-24
+        B
     ] ifte ;
 
-#jump [
-    dup postpone-word  compile-epilogue  compile-jump-label
-] "generator" set-word-prop
+M: %jump generate-node ( vop -- )
+    vop-label dup postpone-word  compile-epilogue
+    compile-jump-label ;
+
+M: %jump-label generate-node ( vop -- )
+    vop-label compile-jump-label ;
 
-: compile-jump-t ( label -- )
-    POP-DS
-    0 18 3 CMPI
-    0 BNE  relative-14 ;
+: conditional ( vop -- label )
+    dup vop-in-1 v>operand 0 swap f address CMPI vop-label ;
 
-: compile-jump-f ( label -- )
-    POP-DS
-    0 18 3 CMPI
-    0 BEQ  relative-14 ;
+M: %jump-f generate-node ( vop -- )
+    conditional BEQ ;
 
-\ dispatch [
+M: %jump-t generate-node ( vop -- )
+    conditional BNE ;
+
+M: %return-to generate-node ( vop -- )
+    vop-label 0 18 LOAD32  absolute-16/16
+    1 1 -16 STWU
+    18 1 20 STW ;
+
+M: %return generate-node ( vop -- )
+    drop compile-epilogue BLR ;
+
+M: %dispatch generate-node ( vop -- )
     ! Compile a piece of code that jumps to an offset in a
     ! jump table indexed by the fixnum at the top of the stack.
     ! The jump table must immediately follow this macro.
     drop
-    POP-DS
+   ! POP-DS
     18 18 1 SRAWI
     ! The value 24 is a magic number. It is the length of the
     ! instruction sequence that follows to be generated.
@@ -98,5 +109,10 @@ words ;
     18 18 19 ADD
     18 18 0 LWZ
     18 MTLR
-    BLR
-] "generator" set-word-prop
+    BLR ;
+
+! \ slot [
+!     PEEK-DS
+!     2unlist type-tag >r cell * r> - >r 18 18 r> LWZ
+!     REPL-DS
+! ] "generator" set-word-prop
index f2cb7490835cf05593fa6e6cdd40737a58d91214..61d411419241fbfbae1279cb1d9a62b12a6371c1 100644 (file)
@@ -1,51 +1,35 @@
 ! Copyright (C) 2005 Slava Pestov.
 ! See http://factor.sf.net/license.txt for BSD license.
-IN: assembler
-USING: compiler errors kernel math memory words ;
-
-! Pushing and popping the data stack.
-: PEEK-DS 18 14 0 LWZ ;
-: POP-DS PEEK-DS 14 14 4 SUBI ;
-: PUSH-DS 18 14 4 STWU ;
-: REPL-DS 18 14 0 STW ;
-
-! Pushing and popping the return stack.
-: PEEK-CS 18 15 0 LWZ ;
-: POP-CS PEEK-CS 15 15 4 SUBI ;
-: PUSH-CS 18 15 4 STWU ;
-
-: indirect-literal ( obj -- )
-    intern-literal 19 LOAD
-    18 19 0 LWZ ;
-
-#push-immediate [
-     address 18 LOAD PUSH-DS
-] "generator" set-word-prop
-
-#push-indirect [
-    indirect-literal  PUSH-DS
-] "generator" set-word-prop
-
-#replace-immediate [
-     address 18 LOAD REPL-DS
-] "generator" set-word-prop
-
-#replace-indirect [
-    indirect-literal  REPL-DS
-] "generator" set-word-prop
-
-\ drop [ drop  14 14 4 SUBI ] "generator" set-word-prop
-\ dup [ drop  PEEK-DS PUSH-DS ] "generator" set-word-prop
-\ over [ drop  18 14 -4 LWZ  PUSH-DS ] "generator" set-word-prop
-\ pick [ drop  18 14 -8 LWZ  PUSH-DS ] "generator" set-word-prop
-
-\ swap [
-    drop
-    18 14 -4 LWZ
-    19 14 0 LWZ
-    19 14 -4 STW
-    18 14 0 STW
-] "generator" set-word-prop
-
-\ >r [ drop  POP-DS PUSH-CS ] "generator" set-word-prop
-\ r> [ drop  POP-CS PUSH-DS ] "generator" set-word-prop
+IN: compiler-backend
+USING: assembler compiler errors kernel math memory words ;
+
+: ds-op cell * neg 14 swap ;
+: cs-op cell * neg 15 swap ;
+
+M: %immediate generate-node ( vop -- )
+    dup vop-in-1 address swap vop-out-1 v>operand LOAD32 ;
+
+M: %indirect generate-node ( vop -- )
+    dup vop-out-1 v>operand swap vop-in-1 intern-literal
+    over LOAD dup 0 LWZ ;
+
+M: %peek-d generate-node ( vop -- )
+    dup vop-out-1 v>operand swap vop-in-1 ds-op LWZ ;
+
+M: %replace-d generate-node ( vop -- )
+    dup vop-in-2 v>operand swap vop-in-1 ds-op STW ;
+
+M: %inc-d generate-node ( vop -- )
+    14 14 rot vop-in-1 cell * ADDI ;
+
+M: %inc-r generate-node ( vop -- )
+    15 15 rot vop-in-1 cell * ADDI ;
+
+M: %dec-r generate-node ( vop -- )
+    15 15 rot vop-in-1 cell * SUBI ;
+
+M: %peek-r generate-node ( vop -- )
+    dup vop-out-1 v>operand swap vop-in-1 cs-op LWZ ;
+
+M: %replace-r generate-node ( vop -- )
+    dup vop-in-2 v>operand swap vop-in-2 cs-op STW ;
index 4029ca916b0391c3d256ec17e41d01d049e011e2..cac4a4086f20d6d0b5b378abd22b5f80ad582cc9 100644 (file)
@@ -157,7 +157,7 @@ M: %fixnum-sgn generate-node
     ! give it a fixnum tag.
     vop-out-1 v>operand tag-bits SHL ;
 
-: conditional ( dest cond -- )
+: load-boolean ( dest cond -- )
     #! Compile this after a conditional jump to store f or t
     #! in dest depending on the jump being taken or not.
     <label> "true" set
@@ -173,19 +173,19 @@ M: %fixnum-sgn generate-node
     dup vop-out-1 v>operand dup rot vop-in-1 v>operand CMP ;
 
 M: %fixnum< generate-node ( vop -- )
-    fixnum-compare  \ JL  conditional ;
+    fixnum-compare  \ JL  load-boolean ;
 
 M: %fixnum<= generate-node ( vop -- )
-    fixnum-compare  \ JLE  conditional ;
+    fixnum-compare  \ JLE  load-boolean ;
 
 M: %fixnum> generate-node ( vop -- )
-    fixnum-compare  \ JG  conditional ;
+    fixnum-compare  \ JG  load-boolean ;
 
 M: %fixnum>= generate-node ( vop -- )
-    fixnum-compare  \ JGE  conditional ;
+    fixnum-compare  \ JGE  load-boolean ;
 
 M: %eq? generate-node ( vop -- )
-    fixnum-compare  \ JE  conditional ;
+    fixnum-compare  \ JE  load-boolean ;
 
 : fixnum-branch ( vop -- label )
     dup vop-in-2 v>operand over vop-in-1 v>operand CMP
index 140839387e7baeab937da085b6fdf31517d20f0a..49ebd2f4d0777a3c866af7e92c332f095018c419 100644 (file)
@@ -20,20 +20,23 @@ M: %prologue generate-node drop ;
 M: %call generate-node ( vop -- )
     vop-label dup postpone-word CALL ;
 
-M: %jump-label generate-node ( vop -- )
-    vop-label JMP ;
-
 M: %call-label generate-node ( vop -- )
     vop-label CALL ;
 
 M: %jump generate-node ( vop -- )
     vop-label dup postpone-word JMP ;
 
+M: %jump-label generate-node ( vop -- )
+    vop-label JMP ;
+
+: conditional ( vop -- label )
+    dup vop-in-1 v>operand f address CMP vop-label ;
+
 M: %jump-f generate-node ( vop -- )
-    dup vop-in-1 v>operand f address CMP vop-label JE ;
+    conditional JE ;
 
 M: %jump-t generate-node ( vop -- )
-    dup vop-in-1 v>operand f address CMP vop-label JNE ;
+    conditional JNE ;
 
 M: %return-to generate-node ( vop -- )
     0 PUSH vop-label absolute ;