]> gitweb.factorcode.org Git - factor.git/commitdiff
fix buggy simd intrinsics
authorJoe Groff <arcata@gmail.com>
Thu, 26 Nov 2009 21:28:40 +0000 (13:28 -0800)
committerJoe Groff <arcata@gmail.com>
Thu, 26 Nov 2009 21:28:40 +0000 (13:28 -0800)
basis/alien/c-types/c-types.factor
basis/compiler/cfg/intrinsics/simd/simd.factor
basis/compiler/tree/propagation/simd/simd.factor
basis/math/vectors/simd/intrinsics/intrinsics.factor
basis/math/vectors/simd/simd-tests.factor

index 027fe046b62aa9d82b05c0104f481b09d737dcf7..0ee2373b4133f920b9a76f72e414eacf45f4932e 100755 (executable)
@@ -553,4 +553,6 @@ M: double-2-rep rep-component-type drop double ;
         { [ dup { uchar ushort uint ulong ulonglong } member-eq? ] [ unsigned-interval ] }
     } cond ; foldable
 
-: c-type-clamp ( value c-type -- value' ) c-type-interval clamp ; inline
+: c-type-clamp ( value c-type -- value' )
+    dup { float double } member-eq?
+    [ drop ] [ c-type-interval clamp ] if ; inline
index 845902c2e6791d7f543ae6a4c46d6ddff3524d67..a64c6575562fdbe40012fa1d3973680a41b3d3b5 100644 (file)
@@ -247,7 +247,7 @@ IN: compiler.cfg.intrinsics.simd
     ] [ ^^vector>scalar ] bi ;
 
 : ^sum-vector ( src rep -- dst )
-    signed-rep {
+    {
         { float-vector-rep [ ^(sum-vector) ] }
         { int-vector-rep [| src rep |
             src rep ^unpack-vector-head :> head
@@ -290,8 +290,8 @@ IN: compiler.cfg.intrinsics.simd
 
 : emit-simd-vneg ( node -- )
     {
-        { float-vector-rep [ [ ^load-neg-zero-vector ] [ ^^sub-vector ] bi ] }
-        { int-vector-rep   [ [ ^^zero-vector         ] [ ^^sub-vector ] bi ] }
+        { float-vector-rep [ [ ^load-neg-zero-vector swap ] [ ^^sub-vector ] bi ] }
+        { int-vector-rep   [ [ ^^zero-vector         swap ] [ ^^sub-vector ] bi ] }
     } emit-v-vector-op ;
 
 : emit-simd-v+- ( node -- )
index 6002b15c1c2907a1a9103e00c3f4109a59400c83..9aab173d7ceada7f95b4912a992ee52e28439ff0 100644 (file)
@@ -3,7 +3,7 @@
 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 ;
+math.vectors.simd.intrinsics namespaces ;
 IN: compiler.tree.propagation.simd
 
 CONSTANT: vector>vector-intrinsics
@@ -112,9 +112,10 @@ vector>vector-intrinsics [ { byte-array } "default-output-classes" set-word-prop
 : inline-unless-intrinsic ( word -- )
     dup '[
         _ swap over "intrinsic" word-prop
+        "always-inline-simd-intrinsics" get not swap and
         ! word node intrinsic
         [ try-intrinsic [ drop f ] [ def>> ] if ]
-        [ def>> ] if*
+        [ drop def>> ] if*
     ]
     "custom-inlining" set-word-prop ;
 
index 30db6d5e135814745c9bfdadf6e5bbebdee2df57..eb0e7b1dc8f21228b108d931eeea8b2bb87d733a 100644 (file)
@@ -126,7 +126,7 @@ PRIVATE>
 :: (simd-v+-)              ( a b rep -- c ) 
     a b rep 2>rep-array :> ( a' b' )
     rep <rep-array> :> c'
-    0  rep length 1 -  2 <range> [| n |
+    0  rep rep-length 1 -  2 <range> [| n |
         n     a' nth-unsafe n     b' nth-unsafe -
         n     c' set-nth-unsafe
 
@@ -151,12 +151,12 @@ PRIVATE>
 : (simd-sum)               ( a   rep -- n ) [ + ] components-reduce ;
 : (simd-vabs)              ( a   rep -- c ) [ abs ] components-map ;
 : (simd-vbitand)           ( a b rep -- c ) [ bitand ] bitwise-components-2map ;
-: (simd-vbitandn)          ( a b rep -- c ) [ [ not ] dip bitand ] bitwise-components-2map ;
+: (simd-vbitandn)          ( a b rep -- c ) [ [ bitnot ] dip bitand ] bitwise-components-2map ;
 : (simd-vbitor)            ( a b rep -- c ) [ bitor ] bitwise-components-2map ;
 : (simd-vbitxor)           ( a b rep -- c ) [ bitxor ] bitwise-components-2map ;
 : (simd-vbitnot)           ( a   rep -- c ) [ bitnot ] bitwise-components-map ;
 : (simd-vand)              ( a b rep -- c ) [ bitand ] bitwise-components-2map ;
-: (simd-vandn)             ( a b rep -- c ) [ [ not ] dip bitand ] bitwise-components-2map ;
+: (simd-vandn)             ( a b rep -- c ) [ [ bitnot ] dip bitand ] bitwise-components-2map ;
 : (simd-vor)               ( a b rep -- c ) [ bitor ] bitwise-components-2map ;
 : (simd-vxor)              ( a b rep -- c ) [ bitxor ] bitwise-components-2map ;
 : (simd-vnot)              ( a   rep -- c ) [ bitnot ] bitwise-components-map ;
index b5905893454d8af3e50ebd77f836408769a4bac2..98ed68a906447811f46f6b243c314887b1e8fcce 100644 (file)
@@ -120,7 +120,7 @@ CONSTANT: vector-words
     simd-classes [ [ name>> "-boa" append ] [ vocabulary>> ] bi lookup ] map ;
 
 : check-optimizer ( seq quot eq-quot -- failures )
-    '[
+    dup '[
         @
         [ dup [ class ] { } map-as ] dip '[ _ declare @ ]
         {
@@ -128,8 +128,9 @@ CONSTANT: vector-words
             [ "print-checks" get [ [ . ] bi@ ] [ 2drop ] if ]
             [ [ [ call ] dip call ] call( quot quot -- result ) ]
             [ [ [ call ] dip compile-call ] call( quot quot -- result ) ]
+            [ [ t "always-inline-simd-intrinsics" [ [ call ] dip compile-call ] with-variable ] call( quot quot -- result ) ]
         } 2cleave
-        @ not
+        [ drop @ ] [ nip @ ] 3bi and not
     ] filter ; inline
 
 "== Checking -new constructors" print