make vshuffle-bytes intrinsic for any shuffle mask type
parent
b427eb3f9a
commit
b411f1701a
|
@ -280,6 +280,7 @@ simd new
|
||||||
} >>special-wrappers
|
} >>special-wrappers
|
||||||
{
|
{
|
||||||
{ { +vector+ +vector+ -> +vector+ } A-vv->v-op }
|
{ { +vector+ +vector+ -> +vector+ } A-vv->v-op }
|
||||||
|
{ { +vector+ +any-vector+ -> +vector+ } A-vv->v-op }
|
||||||
{ { +vector+ +scalar+ -> +vector+ } A-vn->v-op }
|
{ { +vector+ +scalar+ -> +vector+ } A-vn->v-op }
|
||||||
{ { +vector+ +literal+ -> +vector+ } A-vn->v-op }
|
{ { +vector+ +literal+ -> +vector+ } A-vn->v-op }
|
||||||
{ { +vector+ +vector+ -> +scalar+ } A-vv->n-op }
|
{ { +vector+ +vector+ -> +scalar+ } A-vv->n-op }
|
||||||
|
|
|
@ -7,12 +7,20 @@ namespaces assocs fry splitting classes.algebra generalizations
|
||||||
locals compiler.tree.propagation.info ;
|
locals compiler.tree.propagation.info ;
|
||||||
IN: math.vectors.specialization
|
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 )
|
: signature-for-schema ( array-type elt-type schema -- signature )
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
{ +vector+ [ drop ] }
|
{ +vector+ [ drop ] }
|
||||||
|
{ +any-vector+ [ drop parent-vector-class ] }
|
||||||
{ +scalar+ [ nip ] }
|
{ +scalar+ [ nip ] }
|
||||||
{ +boolean+ [ 2drop boolean ] }
|
{ +boolean+ [ 2drop boolean ] }
|
||||||
{ +nonnegative+ [ nip ] }
|
{ +nonnegative+ [ nip ] }
|
||||||
|
@ -32,6 +40,7 @@ SYMBOLS: -> +vector+ +scalar+ +boolean+ +nonnegative+ +literal+ ;
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
{ +vector+ [ drop <class-info> ] }
|
{ +vector+ [ drop <class-info> ] }
|
||||||
|
{ +any-vector+ [ drop parent-vector-class <class-info> ] }
|
||||||
{ +scalar+ [ nip <class-info> ] }
|
{ +scalar+ [ nip <class-info> ] }
|
||||||
{ +boolean+ [ 2drop boolean <class-info> ] }
|
{ +boolean+ [ 2drop boolean <class-info> ] }
|
||||||
{
|
{
|
||||||
|
@ -101,7 +110,7 @@ H{
|
||||||
{ hlshift { +vector+ +literal+ -> +vector+ } }
|
{ hlshift { +vector+ +literal+ -> +vector+ } }
|
||||||
{ hrshift { +vector+ +literal+ -> +vector+ } }
|
{ hrshift { +vector+ +literal+ -> +vector+ } }
|
||||||
{ vshuffle-elements { +vector+ +literal+ -> +vector+ } }
|
{ vshuffle-elements { +vector+ +literal+ -> +vector+ } }
|
||||||
{ vshuffle-bytes { +vector+ +vector+ -> +vector+ } }
|
{ vshuffle-bytes { +vector+ +any-vector+ -> +vector+ } }
|
||||||
{ vbroadcast { +vector+ +literal+ -> +vector+ } }
|
{ vbroadcast { +vector+ +literal+ -> +vector+ } }
|
||||||
{ (vmerge-head) { +vector+ +vector+ -> +vector+ } }
|
{ (vmerge-head) { +vector+ +vector+ -> +vector+ } }
|
||||||
{ (vmerge-tail) { +vector+ +vector+ -> +vector+ } }
|
{ (vmerge-tail) { +vector+ +vector+ -> +vector+ } }
|
||||||
|
|
|
@ -92,7 +92,7 @@ PRIVATE>
|
||||||
|
|
||||||
: vshuffle-bytes ( u perm -- v )
|
: vshuffle-bytes ( u perm -- v )
|
||||||
underlying>> [
|
underlying>> [
|
||||||
swap [ '[ _ nth ] ] keep map-as
|
swap [ '[ 15 bitand _ nth ] ] keep map-as
|
||||||
] curry change-underlying ;
|
] curry change-underlying ;
|
||||||
|
|
||||||
GENERIC: vshuffle ( u perm -- v )
|
GENERIC: vshuffle ( u perm -- v )
|
||||||
|
|
|
@ -30,7 +30,7 @@ TUPLE: sfmt
|
||||||
|
|
||||||
: endian-shuffle ( v -- w )
|
: endian-shuffle ( v -- w )
|
||||||
little-endian? [
|
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
|
] unless ; inline
|
||||||
|
|
||||||
: hlshift* ( v n -- w )
|
: hlshift* ( v n -- w )
|
||||||
|
|
Loading…
Reference in New Issue