]> gitweb.factorcode.org Git - factor.git/commitdiff
make vshuffle-bytes intrinsic for any shuffle mask type
authorJoe Groff <arcata@gmail.com>
Mon, 19 Oct 2009 17:25:55 +0000 (12:25 -0500)
committerJoe Groff <arcata@gmail.com>
Mon, 19 Oct 2009 17:25:55 +0000 (12:25 -0500)
basis/math/vectors/simd/functor/functor.factor
basis/math/vectors/specialization/specialization.factor
basis/math/vectors/vectors.factor
basis/random/sfmt/sfmt.factor

index fdb742a7217130544df55d0b7b5528fe2156520f..480981d165a23589c06a1f67028b30520bfe3fe2 100644 (file)
@@ -280,6 +280,7 @@ simd new
     } >>special-wrappers
     {
         { { +vector+ +vector+ -> +vector+ } A-vv->v-op }
+        { { +vector+ +any-vector+ -> +vector+ } A-vv->v-op }
         { { +vector+ +scalar+ -> +vector+ } A-vn->v-op }
         { { +vector+ +literal+ -> +vector+ } A-vn->v-op }
         { { +vector+ +vector+ -> +scalar+ } A-vv->n-op }
index 62ebecff368e6c70b9abbae2c038386030cef11f..3ff286d50884bcf80b295908ecb88c9257498a79 100644 (file)
@@ -7,12 +7,20 @@ namespaces assocs fry splitting classes.algebra generalizations
 locals compiler.tree.propagation.info ;
 IN: math.vectors.specialization
 
-SYMBOLS: -> +vector+ +scalar+ +boolean+ +nonnegative+ +literal+ ;
+SYMBOLS: -> +vector+ +any-vector+ +scalar+ +boolean+ +nonnegative+ +literal+ ;
+
+: parent-vector-class ( type -- type' )
+    {
+        { [ dup simd-128 class<= ] [ drop simd-128 ] }
+        { [ dup simd-256 class<= ] [ drop simd-256 ] }
+        [ "Not a vector class" throw ]
+    } cond ;
 
 : signature-for-schema ( array-type elt-type schema -- signature )
     [
         {
             { +vector+ [ drop ] }
+            { +any-vector+ [ drop parent-vector-class ] }
             { +scalar+ [ nip ] }
             { +boolean+ [ 2drop boolean ] }
             { +nonnegative+ [ nip ] }
@@ -32,6 +40,7 @@ SYMBOLS: -> +vector+ +scalar+ +boolean+ +nonnegative+ +literal+ ;
     [
         {
             { +vector+ [ drop <class-info> ] }
+            { +any-vector+ [ drop parent-vector-class <class-info> ] }
             { +scalar+ [ nip <class-info> ] }
             { +boolean+ [ 2drop boolean <class-info> ] }
             {
@@ -101,7 +110,7 @@ H{
     { hlshift { +vector+ +literal+ -> +vector+ } }
     { hrshift { +vector+ +literal+ -> +vector+ } }
     { vshuffle-elements { +vector+ +literal+ -> +vector+ } }
-    { vshuffle-bytes    { +vector+ +vector+  -> +vector+ } }
+    { vshuffle-bytes    { +vector+ +any-vector+  -> +vector+ } }
     { vbroadcast { +vector+ +literal+ -> +vector+ } }
     { (vmerge-head) { +vector+ +vector+ -> +vector+ } }
     { (vmerge-tail) { +vector+ +vector+ -> +vector+ } }
index 0a984ba2e721de1c8505ebb17fcd955fd84dc3c7..2426e4814b17779ccef0067107e7ae33eb1c6dc7 100644 (file)
@@ -92,7 +92,7 @@ PRIVATE>
 
 : vshuffle-bytes ( u perm -- v )
     underlying>> [
-        swap [ '[ _ nth ] ] keep map-as
+        swap [ '[ 15 bitand _ nth ] ] keep map-as
     ] curry change-underlying ;
 
 GENERIC: vshuffle ( u perm -- v )
index eb78d7e8121266b68c32f78a49535c932e7ebf41..55606217c9219405a1088273bb12d115632863c5 100644 (file)
@@ -30,7 +30,7 @@ TUPLE: sfmt
 
 : endian-shuffle ( v -- w )
     little-endian? [
-        B{ 3 2 1 0 7 6 5 4 11 10 9 8 15 14 13 12 } uint-4 boa vshuffle
+        uchar-16{ 3 2 1 0 7 6 5 4 11 10 9 8 15 14 13 12 } vshuffle
     ] unless ; inline
 
 : hlshift* ( v n -- w )