math.vectors, math.vectors.simd: add user-facing vshuffle2 word
parent
465a1673eb
commit
2744816209
|
@ -1,6 +1,6 @@
|
|||
USING: accessors arrays classes compiler.test compiler.tree.debugger
|
||||
effects fry io kernel kernel.private math math.functions
|
||||
math.private math.vectors math.vectors.simd
|
||||
math.private math.vectors math.vectors.simd math.ranges
|
||||
math.vectors.simd.private prettyprint random sequences system
|
||||
tools.test vocabs assocs compiler.cfg.debugger words
|
||||
locals combinators cpu.architecture namespaces byte-arrays alien
|
||||
|
@ -376,6 +376,38 @@ simd-classes&reps [
|
|||
[ dup '[ _ random ] replicate 1array ]
|
||||
} case ;
|
||||
|
||||
: 2shuffles-for ( n -- shuffles )
|
||||
{
|
||||
{ 2 [
|
||||
{
|
||||
{ 0 1 }
|
||||
{ 0 3 }
|
||||
{ 2 3 }
|
||||
{ 2 0 }
|
||||
}
|
||||
] }
|
||||
{ 4 [
|
||||
{
|
||||
{ 0 1 2 3 }
|
||||
{ 4 1 2 3 }
|
||||
{ 0 5 2 3 }
|
||||
{ 0 1 6 3 }
|
||||
{ 0 1 2 7 }
|
||||
{ 4 5 2 3 }
|
||||
{ 0 1 6 7 }
|
||||
{ 4 5 6 7 }
|
||||
{ 0 5 2 7 }
|
||||
}
|
||||
] }
|
||||
{ 8 [
|
||||
4 2shuffles-for
|
||||
4 2shuffles-for
|
||||
[ [ 8 + ] map ] map
|
||||
[ append ] 2map
|
||||
] }
|
||||
[ dup 2 * '[ _ random ] replicate 1array ]
|
||||
} case ;
|
||||
|
||||
simd-classes [
|
||||
[ [ { } ] ] dip
|
||||
[ new length shuffles-for ] keep
|
||||
|
@ -385,6 +417,19 @@ simd-classes [
|
|||
] unit-test
|
||||
] each
|
||||
|
||||
simd-classes [
|
||||
[ [ { } ] ] dip
|
||||
[ new length 2shuffles-for ] keep
|
||||
'[
|
||||
_ [ [
|
||||
_ new
|
||||
[ [ length iota ] keep like ]
|
||||
[ [ length dup dup + [a,b) ] keep like ] bi [ ] 2sequence
|
||||
] dip '[ _ vshuffle2-elements ] ]
|
||||
[ = ] check-optimizer
|
||||
] unit-test
|
||||
] each
|
||||
|
||||
"== Checking variable shuffles" print
|
||||
|
||||
: random-shift-vector ( class -- vec )
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
USING: accessors alien arrays byte-arrays classes combinators
|
||||
cpu.architecture effects fry functors generalizations generic
|
||||
generic.parser kernel lexer literals macros math math.functions
|
||||
generic.parser kernel lexer literals locals macros math math.functions
|
||||
math.vectors math.vectors.private math.vectors.simd.intrinsics
|
||||
namespaces parser prettyprint.custom quotations sequences
|
||||
sequences.private vocabs vocabs.loader words ;
|
||||
|
@ -85,13 +85,19 @@ DEFER: simd-construct-op
|
|||
|
||||
: (vv->v-op) ( a b rep quot: ( (a) (b) rep -- (c) ) -- c )
|
||||
[ [ simd-unbox ] [ underlying>> ] bi* ] 2dip 3curry make-underlying ; inline
|
||||
|
||||
: (vv->n-op) ( a b rep quot: ( (a) (b) rep -- n ) -- n )
|
||||
[ [ underlying>> ] bi@ ] 2dip 3curry call ; inline
|
||||
: (vvn->v-op) ( a b n rep quot: ( (a) (b) n rep -- (c) ) -- c )
|
||||
[ [ simd-unbox ] [ underlying>> ] bi* ] 3dip 2curry 2curry make-underlying ; inline
|
||||
|
||||
: vv->v-op ( a b rep quot: ( (a) (b) rep -- (c) ) fallback-quot -- c )
|
||||
[ '[ _ (vv->v-op) ] ] [ '[ drop @ ] ] bi* if-both-vectors-match ; inline
|
||||
|
||||
:: vvn->v-op ( a b n rep quot: ( (a) (b) n rep -- (c) ) fallback-quot -- c )
|
||||
a b rep
|
||||
[ n swap quot (vvn->v-op) ]
|
||||
[ drop n fallback-quot call ] if-both-vectors-match ; inline
|
||||
|
||||
: vv'->v-op ( a b rep quot: ( (a) (b) rep -- (c) ) fallback-quot -- c )
|
||||
[ '[ _ (vv->v-op) ] ] [ '[ drop @ ] ] bi* if-both-vectors ; inline
|
||||
|
||||
|
@ -185,6 +191,8 @@ M: simd-128 hrshift
|
|||
over simd-rep [ (simd-hrshift) ] [ call-next-method ] vn->v-op ; inline
|
||||
M: simd-128 vshuffle-elements
|
||||
over simd-rep [ (simd-vshuffle-elements) ] [ call-next-method ] vn->v-op ; inline
|
||||
M: simd-128 vshuffle2-elements
|
||||
over simd-rep [ (simd-vshuffle2-elements) ] [ call-next-method ] vvn->v-op ; inline
|
||||
M: simd-128 vshuffle-bytes
|
||||
dup simd-rep [ (simd-vshuffle-bytes) ] [ call-next-method ] vv'->v-op ; inline
|
||||
M: simd-128 (vmerge-head)
|
||||
|
|
|
@ -116,6 +116,10 @@ M: object vshuffle-elements
|
|||
over length 0 pad-tail
|
||||
swap [ '[ _ nth ] ] keep map-as ; inline
|
||||
|
||||
GENERIC# vshuffle2-elements 1 ( u v perm -- w )
|
||||
M: object vshuffle2-elements
|
||||
[ append ] dip vshuffle-elements ; inline
|
||||
|
||||
GENERIC# vshuffle-bytes 1 ( u perm -- v )
|
||||
|
||||
GENERIC: vshuffle ( u perm -- v )
|
||||
|
|
Loading…
Reference in New Issue