]> gitweb.factorcode.org Git - factor.git/commitdiff
Change how we do if-intrinsics
authorslava <slava@factorcode.org>
Thu, 9 Nov 2006 02:04:46 +0000 (02:04 +0000)
committerslava <slava@factorcode.org>
Thu, 9 Nov 2006 02:04:46 +0000 (02:04 +0000)
TODO.FACTOR.txt
library/compiler/generator/generator.factor
library/compiler/generator/templates.factor
library/compiler/pentium4/intrinsics.factor
library/compiler/ppc/intrinsics.factor
library/compiler/x86/intrinsics.factor

index 642260345ad2c7eff4324e920c620006a3adf79c..86519d6f0400add1fee47bc439ab110c6af8b600 100644 (file)
@@ -15,6 +15,7 @@
 - fdasfsdfsa :help -- weird
 - %allot-bignum-signed-2 still has issues on ppc
 - fix %allot-bignum-signed-1/2 on x86
+- see if 0 0 >= is optimized
 
 + ui:
 
index 0c014008658bedc02a3fcb6e80233164e0d834e3..f50a81c99bd922d6cdc27b75d53a1de46e86d4ee 100644 (file)
@@ -56,14 +56,16 @@ UNION: #terminal
         relocation-table get
         literal-table get
         word-table get
-    ] V{ } make
-    code-format add-compiled-block save-xt ;
-! 
+    ] V{ } make code-format add-compiled-block save-xt ;
+
 GENERIC: generate-node ( node -- )
 
 : generate-nodes ( node -- )
     [ node@ generate-node ] iterate-nodes end-basic-block ;
 
+: generate-branch ( node -- )
+    [ generate-nodes ] keep-templates ;
+
 : generate ( word node -- )
     [ [ generate-nodes ] with-node-iterator ] generate-1 ;
 
@@ -85,44 +87,57 @@ M: #label generate-node
 
 : generate-if ( node label -- next )
     <label> [
-        >r >r node-children first2 generate-nodes
-        r> r> end-false-branch resolve-label generate-nodes
+        >r >r node-children first2 generate-branch
+        r> r> end-false-branch resolve-label
+        generate-branch
+        init-templates
     ] keep resolve-label iterate-next ;
 
 M: #if generate-node
-    [
-        end-basic-block
-        <label> dup %jump-t
-    ] H{
-        { +input+ { { f "flag" } } }
-    } with-template generate-if ;
+    [ <label> dup %jump-t ]
+    H{ { +input+ { { f "flag" } } } }
+    with-template
+    generate-if ;
 
 ! #call
 : [with-template] ( quot template -- quot )
-    2array >quotation [ with-template ] append ;
+    \ with-template 3array >quotation ;
 
 : define-intrinsic ( word quot template -- )
     [with-template] "intrinsic" set-word-prop ;
 
-: define-if-intrinsic ( word quot template -- )
+: define-if>branch-intrinsic ( word quot inputs -- )
+    +input+ associate
     [with-template] "if-intrinsic" set-word-prop ;
 
-: if>boolean-intrinsic ( label -- )
+: if>boolean-intrinsic ( quot -- )
+    "true" define-label
     "end" define-label
-    f 0 <int-vreg> load-literal
+    "true" get swap call
+    f "if-scratch" get load-literal
     "end" get %jump-label
-    resolve-label
-    t 0 <int-vreg> load-literal
+    "true" resolve-label
+    t "if-scratch" get load-literal
     "end" resolve-label
-    0 <int-vreg> phantom-d get phantom-push
-    compute-free-vregs ;
+    "if-scratch" get phantom-d get phantom-push
+    compute-free-vregs ; inline
+
+: define-if>boolean-intrinsic ( word quot inputs -- )
+    +input+ associate
+    { { f "if-scratch" } } +scratch+ associate
+    hash-union
+    >r [ if>boolean-intrinsic ] curry r>
+    [with-template] "intrinsic" set-word-prop ;
+
+: define-if-intrinsic ( word quot inputs -- )
+    3dup define-if>branch-intrinsic define-if>boolean-intrinsic ;
 
 : do-if-intrinsic ( node -- next )
-    [ <label> dup ] keep if-intrinsic call
-    >r node-successor dup #if? [
-        r> generate-if node-successor
+    dup node-successor dup #if? [
+        <label> [ rot if-intrinsic call ] keep
+        generate-if node-successor
     ] [
-        drop r> if>boolean-intrinsic iterate-next
+        drop intrinsic call iterate-next
     ] if ;
 
 M: #call generate-node
@@ -148,7 +163,7 @@ M: #call-label generate-node
 
 : dispatch-body ( label/node -- )
     <label> swap [
-        first2 resolve-label generate-nodes end-basic-block
+        first2 resolve-label generate-nodes
         dup %jump-label
     ] each resolve-label ;
 
index df2d780f7cac5e4d75963bb8503ed69276df3ef3..74b360e7732d188621884c03d2b2d77d04f5ae36 100644 (file)
@@ -95,10 +95,6 @@ SYMBOL: phantom-r
 
 : phantoms ( -- phantom phantom ) phantom-d get phantom-r get ;
 
-: init-templates ( -- )
-    <phantom-datastack> phantom-d set
-    <phantom-callstack> phantom-r set ;
-
 : finalize-heights ( -- )
     phantoms [ finalize-height ] 2apply ;
 
@@ -149,6 +145,19 @@ SYMBOL: phantom-r
     [ 2dup (compute-free-vregs) ] map>hash \ free-vregs set
     drop ;
 
+: init-templates ( -- )
+    <phantom-datastack> phantom-d set
+    <phantom-callstack> phantom-r set
+    compute-free-vregs ;
+
+: keep-templates ( quot -- )
+    [
+        phantom-d [ clone ] change
+        phantom-r [ clone ] change
+        compute-free-vregs
+        call
+    ] with-scope ; inline
+
 : additional-vregs ( seq seq -- n )
     2array phantoms 2array [ [ length ] map ] 2apply v-
     [ 0 max ] map sum ;
index 1d4a2a9ba61aab5e263d36437348aaed2e7882be..cc8b2d6db17b2b0d763db8f66d4092d4f6c5d292 100644 (file)
@@ -13,7 +13,7 @@ M: float-regs (%replace) drop swap %allot-float ;
 
 ! Floats
 : define-float-op ( word op -- )
-    [ [ "x" operand "y" operand ] % , ] [ ] make H{
+    [ "x" operand "y" operand ] swap add H{
         { +input+ { { float "x" } { float "y" } } }
         { +output+ { "x" } }
     } define-intrinsic ;
@@ -28,11 +28,8 @@ M: float-regs (%replace) drop swap %allot-float ;
 ] each
 
 : define-float-jump ( word op -- )
-    [
-        [ end-basic-block "x" operand "y" operand UCOMISD ] % ,
-    ] [ ] make H{
-        { +input+ { { float "x" } { float "y" } } }
-    } define-if-intrinsic ;
+    [ "x" operand "y" operand UCOMISD ] swap add
+    { { float "x" } { float "y" } } define-if-intrinsic ;
 
 {
     { float< JB }
index d4f757f52e6a217de8946a3995e90e052b94d0b7..e69b124770f4686373b6426a3ebd76af6b315a71 100644 (file)
@@ -106,10 +106,8 @@ math-internals namespaces sequences words ;
 } define-intrinsic
 
 : define-fixnum-jump ( word op -- )
-    [
-        [ end-basic-block "x" operand 0 "y" operand CMP ] % ,
-     ] [ ] make H{ { +input+ { { f "x" } { f "y" } } } }
-    define-if-intrinsic ;
+    [ "x" operand 0 "y" operand CMP ] swap add
+    { { f "x" } { f "y" } } define-if-intrinsic ;
 
 {
     { fixnum< BLT }
@@ -270,10 +268,8 @@ math-internals namespaces sequences words ;
 ] each
 
 : define-float-jump ( word op -- )
-    [
-        [ end-basic-block "x" operand 0 "y" operand FCMPU ] % ,
-     ] [ ] make H{ { +input+ { { float "x" } { float "y" } } } }
-    define-if-intrinsic ;
+    [ "x" operand 0 "y" operand FCMPU ] swap add
+    { { float "x" } { float "y" } } define-if-intrinsic ;
 
 {
     { float< BLT }
index 9fabf4f7fd4d54172a2a2d17303ddfdc02194726..3fd6a502cb92db679fd60208052da7f775454241 100644 (file)
@@ -233,8 +233,8 @@ IN: compiler
 } define-intrinsic
 
 : define-fixnum-jump ( word op -- )
-    [ end-basic-block "x" operand "y" operand CMP ] swap add
-    H{ { +input+ { { f "x" } { f "y" } } } } define-if-intrinsic ;
+    [ "x" operand "y" operand CMP ] swap add
+    { { f "x" } { f "y" } } define-if-intrinsic ;
 
 {
     { fixnum< JL }