]> gitweb.factorcode.org Git - factor.git/commitdiff
compiler: tweak generated code
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 4 Sep 2009 08:01:18 +0000 (03:01 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Fri, 4 Sep 2009 08:01:18 +0000 (03:01 -0500)
basis/compiler/cfg/def-use/def-use.factor
basis/compiler/cfg/instructions/syntax/syntax.factor
basis/compiler/cfg/representations/preferred/preferred.factor
basis/compiler/cfg/value-numbering/expressions/expressions.factor
basis/compiler/codegen/codegen.factor

index 559160408dbf04c27b589ac29458684cdb0e28fa..825ff71b9be76aff6c7aa397a7e2bf62ff44f2ea 100644 (file)
@@ -1,9 +1,10 @@
 ! Copyright (C) 2008, 2009 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs classes combinators compiler.units fry
-generalizations generic kernel locals namespaces quotations
-sequences sets slots words compiler.cfg.instructions
-compiler.cfg.instructions.syntax compiler.cfg.rpo ;
+USING: accessors assocs arrays classes combinators
+compiler.units fry generalizations generic kernel locals
+namespaces quotations sequences sets slots words
+compiler.cfg.instructions compiler.cfg.instructions.syntax
+compiler.cfg.rpo ;
 IN: compiler.cfg.def-use
 
 GENERIC: defs-vreg ( insn -- vreg/f )
@@ -15,10 +16,12 @@ M: ##phi uses-vregs inputs>> values ;
 <PRIVATE
 
 : slot-array-quot ( slots -- quot )
-    [ [ drop f ] ] [
-        [ reader-word 1quotation ] map
-        dup length '[ _ cleave _ narray ]
-    ] if-empty ;
+    [ reader-word 1quotation ] map dup length {
+        { 0 [ drop [ drop f ] ] }
+        { 1 [ first [ 1array ] compose ] }
+        { 2 [ first2 '[ _ _ bi 2array ] ] }
+        [ '[ _ cleave _ narray ] ]
+    } case ;
 
 : define-defs-vreg-method ( insn -- )
     [ \ defs-vreg create-method ]
index 53d124ea9d6d7d654f9565f4d8ddf379051ee927..cc1d0df21c477a978c680b227b7042f0fb0b55bc 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: classes.tuple classes.tuple.parser kernel words
 make fry sequences parser accessors effects namespaces
-combinators splitting classes.parser lexer ;
+combinators splitting classes.parser lexer quotations ;
 IN: compiler.cfg.instructions.syntax
 
 SYMBOLS: def use temp literal constant ;
@@ -67,7 +67,8 @@ TUPLE: insn-slot-spec type name rep ;
     [ name>> ] map "insn#" suffix define-tuple-class ;
 
 : define-insn-ctor ( class specs -- )
-    [ dup '[ f _ boa , ] ] dip [ name>> ] map f <effect> define-declared ;
+    [ dup '[ _ ] [ f ] [ boa , ] surround ] dip
+    [ name>> ] map f <effect> define-declared ;
 
 : define-insn ( class superclass specs -- )
     parse-insn-slot-specs {
index 54da7bdf693a3e6e14a7da13e827b023c560eb09..389b78c33362d4f6880ba5359d5c70f7d6ad5a20 100644 (file)
@@ -17,7 +17,7 @@ GENERIC: uses-vreg-reps ( insn -- reps )
     {
         { f [ [ rep>> ] ] }
         { scalar-rep [ [ rep>> scalar-rep-of ] ] }
-        [ '[ _ nip ] ]
+        [ [ drop ] swap suffix ]
     } case ;
 
 : define-defs-vreg-rep-method ( insn -- )
@@ -26,7 +26,16 @@ GENERIC: uses-vreg-reps ( insn -- reps )
     bi define ;
 
 : reps-getter-quot ( reps -- quot )
-    [ rep>> rep-getter-quot ] map dup length '[ _ cleave _ narray ] ;
+    dup [ rep>> { f scalar-rep } memq? not ] all? [
+        [ rep>> ] map [ drop ] swap suffix
+    ] [
+        [ rep>> rep-getter-quot ] map dup length {
+            { 0 [ drop [ drop f ] ] }
+            { 1 [ first [ 1array ] compose ] }
+            { 2 [ first2 '[ _ _ bi 2array ] ] }
+            [ '[ _ cleave _ narray ] ]
+        } case
+    ] if ;
 
 : define-uses-vreg-reps-method ( insn -- )
     [ \ uses-vreg-reps create-method ]
index f869f64fb104a6c71dfcdf7866db5952b6f4a1ac..03aa28d70a3a0997c3da24e0f85ea0fd0dd8cfd7 100644 (file)
@@ -64,7 +64,7 @@ M: ##load-reference >expr obj>> <reference> ;
                 { constant [ [ constant>vn ] ] }
             } case
         ] bi append
-    ] map swap '[ _ cleave _ boa ] ;
+    ] map cleave>quot swap suffix \ boa suffix ;
 
 : define->expr-method ( insn expr slot-specs -- )
     [ 2drop \ >expr create-method-in ] [ >expr-quot nip ] 3bi define ;
index 36f5a0c49b4601efd29e7424f206a9958f8fc18e..3587d627062203c7f93e7c7ccc0c1b96b7255a20 100755 (executable)
@@ -100,9 +100,8 @@ M: _spill-area-size generate-insn drop ;
 : codegen-method-body ( class word -- quot )
     [
         "insn-slots" word-prop
-        [ insn-slot-quot ] map
-    ] dip
-    '[ _ cleave _ execute ] ;
+        [ insn-slot-quot ] map cleave>quot
+    ] dip suffix ;
 
 SYNTAX: CODEGEN:
     scan-word [ \ generate-insn create-method-in ] keep scan-word