]> gitweb.factorcode.org Git - factor.git/blobdiff - basis/compiler/tree/propagation/simd/simd.factor
factor: trim using lists
[factor.git] / basis / compiler / tree / propagation / simd / simd.factor
index 909ab931da033b22407d64f52f0e87a3960655c3..193d77308d45e920440278f3a5f40b0e42445844 100644 (file)
@@ -1,9 +1,10 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs byte-arrays combinators compiler.cfg.builder
-continuations fry sequences compiler.tree.propagation.info
-cpu.architecture kernel words make math math.intervals
-math.vectors.simd.intrinsics namespaces ;
+USING: accessors byte-arrays combinators compiler.cfg.builder
+compiler.tree.propagation.info compiler.tree.propagation.nodes
+continuations cpu.architecture kernel layouts math
+math.intervals math.vectors.simd.intrinsics namespaces sequences
+words ;
 IN: compiler.tree.propagation.simd
 
 CONSTANT: vector>vector-intrinsics
@@ -63,12 +64,13 @@ CONSTANT: vector>vector-intrinsics
 
 CONSTANT: vector-other-intrinsics
     {
-        (simd-v.)
+        (simd-vdot)
         (simd-vsad)
         (simd-sum)
         (simd-vany?)
         (simd-vall?)
         (simd-vnone?)
+        (simd-vgetmask)
         (simd-select)
         set-alien-vector
     }
@@ -83,14 +85,18 @@ vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop
         literal>> scalar-rep-of {
             { float-rep [ float ] }
             { double-rep [ float ] }
-            [ drop integer ]
+            { longlong-scalar-rep [ integer ] }
+            { ulonglong-scalar-rep [ integer ] }
+            { int-scalar-rep [ cell 8 = [ fixnum ] [ integer ] if ] }
+            { uint-scalar-rep [ cell 8 = [ fixnum ] [ integer ] if ] }
+            [ drop fixnum ]
         } case
     ] [ drop real ] if
     <class-info> ;
 
 \ (simd-sum) [ nip scalar-output-class ] "outputs" set-word-prop
 
-\ (simd-v.) [ 2nip scalar-output-class ] "outputs" set-word-prop
+\ (simd-vdot) [ 2nip scalar-output-class ] "outputs" set-word-prop
 
 {
     (simd-vany?)
@@ -104,8 +110,10 @@ vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop
     real [0,inf] <class/interval-info> value-info-intersect
 ] "outputs" set-word-prop
 
+\ (simd-vgetmask) { fixnum } "default-output-classes" set-word-prop
+
 : clone-with-value-infos ( node -- node' )
-    clone dup in-d>> [ dup value-info ] H{ } map>assoc >>info ;
+    clone dup in-d>> extract-value-info >>info ;
 
 : try-intrinsic ( node intrinsic-quot -- ? )
     '[
@@ -116,7 +124,7 @@ vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop
 
 : inline-unless-intrinsic ( word -- )
     dup '[
-        _ swap over "intrinsic" word-prop
+        _ tuck "intrinsic" word-prop
         "always-inline-simd-intrinsics" get not swap and
         ! word node intrinsic
         [ try-intrinsic [ drop f ] [ def>> ] if ]