math.vectors, math.vectors.simd: add user-facing vshuffle2 word

db4
Joe Groff 2010-05-14 02:47:05 -07:00
parent 465a1673eb
commit 2744816209
3 changed files with 60 additions and 3 deletions

View File

@ -1,6 +1,6 @@
USING: accessors arrays classes compiler.test compiler.tree.debugger USING: accessors arrays classes compiler.test compiler.tree.debugger
effects fry io kernel kernel.private math math.functions 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 math.vectors.simd.private prettyprint random sequences system
tools.test vocabs assocs compiler.cfg.debugger words tools.test vocabs assocs compiler.cfg.debugger words
locals combinators cpu.architecture namespaces byte-arrays alien locals combinators cpu.architecture namespaces byte-arrays alien
@ -376,6 +376,38 @@ simd-classes&reps [
[ dup '[ _ random ] replicate 1array ] [ dup '[ _ random ] replicate 1array ]
} case ; } 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 [ simd-classes [
[ [ { } ] ] dip [ [ { } ] ] dip
[ new length shuffles-for ] keep [ new length shuffles-for ] keep
@ -385,6 +417,19 @@ simd-classes [
] unit-test ] unit-test
] each ] 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 "== Checking variable shuffles" print
: random-shift-vector ( class -- vec ) : random-shift-vector ( class -- vec )

View File

@ -1,6 +1,6 @@
USING: accessors alien arrays byte-arrays classes combinators USING: accessors alien arrays byte-arrays classes combinators
cpu.architecture effects fry functors generalizations generic 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 math.vectors math.vectors.private math.vectors.simd.intrinsics
namespaces parser prettyprint.custom quotations sequences namespaces parser prettyprint.custom quotations sequences
sequences.private vocabs vocabs.loader words ; 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 ) : (vv->v-op) ( a b rep quot: ( (a) (b) rep -- (c) ) -- c )
[ [ simd-unbox ] [ underlying>> ] bi* ] 2dip 3curry make-underlying ; inline [ [ simd-unbox ] [ underlying>> ] bi* ] 2dip 3curry make-underlying ; inline
: (vv->n-op) ( a b rep quot: ( (a) (b) rep -- n ) -- n ) : (vv->n-op) ( a b rep quot: ( (a) (b) rep -- n ) -- n )
[ [ underlying>> ] bi@ ] 2dip 3curry call ; inline [ [ 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 ( a b rep quot: ( (a) (b) rep -- (c) ) fallback-quot -- c )
[ '[ _ (vv->v-op) ] ] [ '[ drop @ ] ] bi* if-both-vectors-match ; inline [ '[ _ (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 ( a b rep quot: ( (a) (b) rep -- (c) ) fallback-quot -- c )
[ '[ _ (vv->v-op) ] ] [ '[ drop @ ] ] bi* if-both-vectors ; inline [ '[ _ (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 over simd-rep [ (simd-hrshift) ] [ call-next-method ] vn->v-op ; inline
M: simd-128 vshuffle-elements M: simd-128 vshuffle-elements
over simd-rep [ (simd-vshuffle-elements) ] [ call-next-method ] vn->v-op ; inline 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 M: simd-128 vshuffle-bytes
dup simd-rep [ (simd-vshuffle-bytes) ] [ call-next-method ] vv'->v-op ; inline dup simd-rep [ (simd-vshuffle-bytes) ] [ call-next-method ] vv'->v-op ; inline
M: simd-128 (vmerge-head) M: simd-128 (vmerge-head)

View File

@ -116,6 +116,10 @@ M: object vshuffle-elements
over length 0 pad-tail over length 0 pad-tail
swap [ '[ _ nth ] ] keep map-as ; inline 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-bytes 1 ( u perm -- v )
GENERIC: vshuffle ( u perm -- v ) GENERIC: vshuffle ( u perm -- v )