implement vand, vor, vandn, and vxor as bitwise intrinsics for simd types
parent
435cd02200
commit
aa3392e50f
|
@ -171,6 +171,10 @@ IN: compiler.cfg.intrinsics
|
|||
{ math.vectors.simd.intrinsics:(simd-vbitandn) [ [ ^^andn-vector ] emit-binary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-vbitor) [ [ ^^or-vector ] emit-binary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-vbitxor) [ [ ^^xor-vector ] emit-binary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-vand) [ [ ^^and-vector ] emit-binary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-vandn) [ [ ^^andn-vector ] emit-binary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-vor) [ [ ^^or-vector ] emit-binary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-vxor) [ [ ^^xor-vector ] emit-binary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-v=) [ [ cc= ^^compare-vector ] emit-binary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-vany?) [ [ vcc-any ^^test-vector ] emit-unary-vector-op ] }
|
||||
{ math.vectors.simd.intrinsics:(simd-vall?) [ [ vcc-all ^^test-vector ] emit-unary-vector-op ] }
|
||||
|
|
|
@ -20,6 +20,10 @@ IN: compiler.tree.propagation.simd
|
|||
(simd-vbitandn)
|
||||
(simd-vbitor)
|
||||
(simd-vbitxor)
|
||||
(simd-vand)
|
||||
(simd-vandn)
|
||||
(simd-vor)
|
||||
(simd-vxor)
|
||||
(simd-vlshift)
|
||||
(simd-vrshift)
|
||||
(simd-hlshift)
|
||||
|
|
|
@ -44,6 +44,10 @@ SIMD-OP: vbitand
|
|||
SIMD-OP: vbitandn
|
||||
SIMD-OP: vbitor
|
||||
SIMD-OP: vbitxor
|
||||
SIMD-OP: vand
|
||||
SIMD-OP: vandn
|
||||
SIMD-OP: vor
|
||||
SIMD-OP: vxor
|
||||
SIMD-OP: vlshift
|
||||
SIMD-OP: vrshift
|
||||
SIMD-OP: hlshift
|
||||
|
@ -125,6 +129,10 @@ M: vector-rep supported-simd-op?
|
|||
{ \ (simd-vbitandn) [ %andn-vector-reps ] }
|
||||
{ \ (simd-vbitor) [ %or-vector-reps ] }
|
||||
{ \ (simd-vbitxor) [ %xor-vector-reps ] }
|
||||
{ \ (simd-vand) [ %and-vector-reps ] }
|
||||
{ \ (simd-vandn) [ %andn-vector-reps ] }
|
||||
{ \ (simd-vor) [ %or-vector-reps ] }
|
||||
{ \ (simd-vxor) [ %xor-vector-reps ] }
|
||||
{ \ (simd-vlshift) [ %shl-vector-reps ] }
|
||||
{ \ (simd-vrshift) [ %shr-vector-reps ] }
|
||||
{ \ (simd-hlshift) [ %horizontal-shl-vector-reps ] }
|
||||
|
|
|
@ -159,6 +159,12 @@ CONSTANT: simd-classes
|
|||
: remove-integer-words ( alist -- alist' )
|
||||
{ vlshift vrshift } unique assoc-diff ;
|
||||
|
||||
: boolean-ops ( -- words )
|
||||
{ vand vandn vor vxor } ;
|
||||
|
||||
: remove-boolean-words ( alist -- alist' )
|
||||
boolean-ops unique assoc-diff ;
|
||||
|
||||
: remove-special-words ( alist -- alist' )
|
||||
! These have their own tests later
|
||||
{
|
||||
|
@ -169,6 +175,7 @@ CONSTANT: simd-classes
|
|||
: ops-to-check ( elt-class -- alist )
|
||||
[ vector-words >alist ] dip
|
||||
float = [ remove-integer-words ] [ remove-float-words ] if
|
||||
remove-boolean-words
|
||||
remove-special-words ;
|
||||
|
||||
: check-vector-ops ( class elt-class compare-quot -- )
|
||||
|
@ -211,6 +218,30 @@ simd-classes&reps [
|
|||
[ [ { } ] ] dip first3 '[ _ _ _ check-vector-ops ] unit-test
|
||||
] each
|
||||
|
||||
"== Checking boolean operations" print
|
||||
|
||||
: random-boolean-vector ( class -- vec )
|
||||
new [ drop 2 random zero? ] map ;
|
||||
|
||||
:: check-boolean-op ( word inputs class elt-class -- inputs quot )
|
||||
inputs [
|
||||
{
|
||||
{ +vector+ [ class random-boolean-vector ] }
|
||||
{ +scalar+ [ 1000 random elt-class float = [ >float ] when ] }
|
||||
} case
|
||||
] [ ] map-as
|
||||
word '[ _ execute ] ;
|
||||
|
||||
: check-boolean-ops ( class elt-class compare-quot -- )
|
||||
[
|
||||
[ boolean-ops [ dup word-schema ] { } map>assoc ] 2dip
|
||||
'[ first2 inputs _ _ check-boolean-op ]
|
||||
] dip check-optimizer ; inline
|
||||
|
||||
simd-classes&reps [
|
||||
[ [ { } ] ] dip first3 '[ _ _ _ check-boolean-ops ] unit-test
|
||||
] each
|
||||
|
||||
"== Checking shifts and permutations" print
|
||||
|
||||
[ int-4{ 256 512 1024 2048 } ]
|
||||
|
|
|
@ -86,6 +86,10 @@ H{
|
|||
{ vbitandn { +vector+ +vector+ -> +vector+ } }
|
||||
{ vbitor { +vector+ +vector+ -> +vector+ } }
|
||||
{ vbitxor { +vector+ +vector+ -> +vector+ } }
|
||||
{ vand { +vector+ +vector+ -> +vector+ } }
|
||||
{ vandn { +vector+ +vector+ -> +vector+ } }
|
||||
{ vor { +vector+ +vector+ -> +vector+ } }
|
||||
{ vxor { +vector+ +vector+ -> +vector+ } }
|
||||
{ vlshift { +vector+ +scalar+ -> +vector+ } }
|
||||
{ vrshift { +vector+ +scalar+ -> +vector+ } }
|
||||
{ hlshift { +vector+ +literal+ -> +vector+ } }
|
||||
|
|
|
@ -329,6 +329,10 @@ HELP: vand
|
|||
{ $values { "u" "a sequence of booleans" } { "v" "a sequence of booleans" } { "w" "a sequence of booleans" } }
|
||||
{ $description "Takes the logical AND of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } "." } ;
|
||||
|
||||
HELP: vandn
|
||||
{ $values { "u" "a sequence of booleans" } { "v" "a sequence of booleans" } { "w" "a sequence of booleans" } }
|
||||
{ $description "Takes the logical AND-NOT of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } ", where " { $snippet "x AND-NOT y" } " is defined as " { $snippet "NOT(x) AND y" } "." } ;
|
||||
|
||||
HELP: vor
|
||||
{ $values { "u" "a sequence of booleans" } { "v" "a sequence of booleans" } { "w" "a sequence of booleans" } }
|
||||
{ $description "Takes the logical OR of each corresponding element of " { $snippet "u" } " and " { $snippet "v" } "." } ;
|
||||
|
|
|
@ -7,6 +7,7 @@ QUALIFIED-WITH: alien.c-types c
|
|||
IN: math.vectors
|
||||
|
||||
GENERIC: element-type ( obj -- c-type )
|
||||
M: object element-type drop f ; inline
|
||||
|
||||
: vneg ( u -- v ) [ neg ] map ;
|
||||
|
||||
|
@ -63,6 +64,9 @@ PRIVATE>
|
|||
[ drop call ]
|
||||
} case ; inline
|
||||
|
||||
: element>bool ( x seq -- ? )
|
||||
element-type [ zero? not ] when ; inline
|
||||
|
||||
: bitandn ( x y -- z ) [ bitnot ] dip bitand ; inline
|
||||
|
||||
GENERIC: new-underlying ( underlying seq -- seq' )
|
||||
|
@ -87,10 +91,11 @@ PRIVATE>
|
|||
: hlshift ( u n -- w ) '[ _ <byte-array> prepend 16 head ] change-underlying ;
|
||||
: hrshift ( u n -- w ) '[ _ <byte-array> append 16 tail* ] change-underlying ;
|
||||
|
||||
: vand ( u v -- w ) [ and ] 2map ;
|
||||
: vor ( u v -- w ) [ or ] 2map ;
|
||||
: vxor ( u v -- w ) [ xor ] 2map ;
|
||||
: vnot ( u -- w ) [ not ] map ;
|
||||
: vand ( u v -- w ) over '[ [ _ element>bool ] bi@ and ] 2map ;
|
||||
: vandn ( u v -- w ) over '[ [ _ element>bool ] bi@ [ not ] dip and ] 2map ;
|
||||
: vor ( u v -- w ) over '[ [ _ element>bool ] bi@ or ] 2map ;
|
||||
: vxor ( u v -- w ) over '[ [ _ element>bool ] bi@ xor ] 2map ;
|
||||
: vnot ( u -- w ) dup '[ _ element>bool not ] map ;
|
||||
|
||||
: vall? ( v -- ? ) [ ] all? ;
|
||||
: vany? ( v -- ? ) [ ] any? ;
|
||||
|
@ -104,7 +109,7 @@ PRIVATE>
|
|||
: v= ( u v -- w ) [ = ] 2map ;
|
||||
|
||||
: v? ( mask true false -- w )
|
||||
[ vbitand ] [ vbitandn ] bi-curry* bi vbitor ; inline
|
||||
[ vand ] [ vandn ] bi-curry* bi vor ; inline
|
||||
|
||||
: vfloor ( u -- v ) [ floor ] map ;
|
||||
: vceiling ( u -- v ) [ ceiling ] map ;
|
||||
|
|
Loading…
Reference in New Issue