]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/compiler/cfg/value-numbering/simd/simd.factor
factor: trim using lists
[factor.git] / basis / compiler / cfg / value-numbering / simd / simd.factor
index 84acc95859b76cc21452162a2f47588a6b09ab40..2502e03cfab4a408a650634b150887c05bffaace 100644 (file)
@@ -1,32 +1,25 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators combinators.short-circuit arrays
-fry kernel layouts math namespaces sequences cpu.architecture
-math.bitwise math.order classes generalizations
-combinators.smart locals make alien.c-types io.binary grouping
-math.vectors.simd.intrinsics
-compiler.cfg
-compiler.cfg.registers
-compiler.cfg.utilities
-compiler.cfg.comparisons
-compiler.cfg.instructions
+USING: accessors alien.c-types combinators
+combinators.short-circuit compiler.cfg.instructions
+compiler.cfg.utilities compiler.cfg.value-numbering.graph
 compiler.cfg.value-numbering.math
-compiler.cfg.value-numbering.graph
-compiler.cfg.value-numbering.rewrite ;
+compiler.cfg.value-numbering.rewrite cpu.architecture
+endian generalizations grouping kernel make math sequences ;
 IN: compiler.cfg.value-numbering.simd
 
 ! Some lame constant folding for SIMD intrinsics. Eventually this
 ! should be redone completely.
 
 : useless-shuffle-vector-imm? ( insn -- ? )
-    [ shuffle>> ] [ rep>> rep-length iota ] bi sequence= ;
+    [ shuffle>> ] [ rep>> rep-length <iota> ] bi sequence= ;
 
 : compose-shuffle-vector-imm ( outer inner -- insn' )
     2dup [ rep>> ] bi@ eq? [
         [ [ dst>> ] [ src>> ] bi* ]
         [ [ shuffle>> ] bi@ nths ]
         [ drop rep>> ]
-        2tri ##shuffle-vector-imm new-insn
+        2tri ##shuffle-vector-imm new-insn
     ] [ 2drop f ] if ;
 
 : (fold-shuffle-vector-imm) ( shuffle bytes -- bytes' )
@@ -34,7 +27,7 @@ IN: compiler.cfg.value-numbering.simd
 
 : fold-shuffle-vector-imm ( outer inner -- insn' )
     [ [ dst>> ] [ shuffle>> ] bi ] [ obj>> ] bi*
-    (fold-shuffle-vector-imm) ##load-reference new-insn ;
+    (fold-shuffle-vector-imm) ##load-reference new-insn ;
 
 M: ##shuffle-vector-imm rewrite
     dup src>> vreg>insn {
@@ -53,7 +46,7 @@ M: ##shuffle-vector-imm rewrite
 
 : (fold-scalar>vector) ( insn bytes -- insn' )
     [ [ dst>> ] [ rep>> rep-length ] bi ] dip <repetition> concat
-    ##load-reference new-insn ;
+    ##load-reference new-insn ;
 
 : fold-scalar>vector ( outer inner -- insn' )
     over rep>> scalar-value (fold-scalar>vector) ;
@@ -68,7 +61,7 @@ M: ##scalar>vector rewrite
 :: fold-gather-vector-2 ( insn src1 src2 -- insn )
     insn dst>>
     src1 src2 [ insn rep>> scalar-value ] bi@ append
-    ##load-reference new-insn ;
+    ##load-reference new-insn ;
 
 : rewrite-gather-vector-2 ( insn -- insn/f )
     dup [ src1>> vreg>insn ] [ src2>> vreg>insn ] bi {
@@ -84,15 +77,15 @@ M: ##gather-int-vector-2 rewrite rewrite-gather-vector-2 ;
     insn dst>>
     [
         src1 src2 src3 src4
-        [ insn rep>> scalar-value ] 4 napply
-    ] B{ } append-outputs-as
-    ##load-reference new-insn ;
+        [ insn rep>> scalar-value ] 4 napply
+    ] B{ } make
+    ##load-reference new-insn ;
 
 : rewrite-gather-vector-4 ( insn -- insn/f )
     dup { [ src1>> ] [ src2>> ] [ src3>> ] [ src4>> ] } cleave [ vreg>insn ] 4 napply
     {
-        { [ 4 ndup [ literal-insn? ] 4 napply and and and ] [ fold-gather-vector-4 ] }
-        [ 5 ndrop f ]
+        { [ 4dup [ literal-insn? ] 4 napply and and and ] [ fold-gather-vector-4 ] }
+        [ 5drop f ]
     } cond ;
 
 M: ##gather-vector-4 rewrite rewrite-gather-vector-4 ;
@@ -101,7 +94,7 @@ M: ##gather-int-vector-4 rewrite rewrite-gather-vector-4 ;
 
 : fold-shuffle-vector ( insn src1 src2 -- insn )
     [ dst>> ] [ obj>> ] [ obj>> ] tri*
-    swap nths ##load-reference new-insn ;
+    swap nths ##load-reference new-insn ;
 
 M: ##shuffle-vector rewrite
     dup [ src>> vreg>insn ] [ shuffle>> vreg>insn ] bi
@@ -112,7 +105,7 @@ M: ##shuffle-vector rewrite
 
 M: ##xor-vector rewrite
     dup diagonal?
-    [ [ dst>> ] [ rep>> ] bi ##zero-vector new-insn ] [ drop f ] if ;
+    [ [ dst>> ] [ rep>> ] bi ##zero-vector new-insn ] [ drop f ] if ;
 
 : vector-not? ( insn -- ? )
     {
@@ -131,7 +124,7 @@ M: ##not-vector vector-not-src
 M: ##xor-vector vector-not-src
     dup src1>> vreg>insn ##fill-vector? [ src2>> ] [ src1>> ] if ;
 
-M: ##and-vector rewrite 
+M: ##and-vector rewrite
     {
         { [ dup src1>> vreg>insn vector-not? ] [
             {
@@ -139,7 +132,7 @@ M: ##and-vector rewrite
                 [ src1>> vreg>insn vector-not-src ]
                 [ src2>> ]
                 [ rep>> ]
-            } cleave ##andn-vector new-insn
+            } cleave ##andn-vector new-insn
         ] }
         { [ dup src2>> vreg>insn vector-not? ] [
             {
@@ -147,7 +140,7 @@ M: ##and-vector rewrite
                 [ src2>> vreg>insn vector-not-src ]
                 [ src1>> ]
                 [ rep>> ]
-            } cleave ##andn-vector new-insn
+            } cleave ##andn-vector new-insn
         ] }
         [ drop f ]
     } cond ;
@@ -159,5 +152,5 @@ M: ##andn-vector rewrite
             [ src1>> vreg>insn vector-not-src ]
             [ src2>> ]
             [ rep>> ]
-        } cleave ##and-vector new-insn
+        } cleave ##and-vector new-insn
     ] [ drop f ] if ;