implement vneg as an intrinsic in terms of load -0, subtract
parent
39f22a4c71
commit
01f5d392be
|
@ -159,6 +159,7 @@ IN: compiler.cfg.intrinsics
|
||||||
{ math.vectors.simd.intrinsics:(simd-v+-) [ [ ^^add-sub-vector ] emit-binary-vector-op ] }
|
{ math.vectors.simd.intrinsics:(simd-v+-) [ [ ^^add-sub-vector ] emit-binary-vector-op ] }
|
||||||
{ math.vectors.simd.intrinsics:(simd-v-) [ [ ^^sub-vector ] emit-binary-vector-op ] }
|
{ math.vectors.simd.intrinsics:(simd-v-) [ [ ^^sub-vector ] emit-binary-vector-op ] }
|
||||||
{ math.vectors.simd.intrinsics:(simd-vs-) [ [ ^^saturated-sub-vector ] emit-binary-vector-op ] }
|
{ math.vectors.simd.intrinsics:(simd-vs-) [ [ ^^saturated-sub-vector ] emit-binary-vector-op ] }
|
||||||
|
{ math.vectors.simd.intrinsics:(simd-vneg) [ [ generate-neg-vector ] emit-unary-vector-op ] }
|
||||||
{ math.vectors.simd.intrinsics:(simd-v*) [ [ ^^mul-vector ] emit-binary-vector-op ] }
|
{ math.vectors.simd.intrinsics:(simd-v*) [ [ ^^mul-vector ] emit-binary-vector-op ] }
|
||||||
{ math.vectors.simd.intrinsics:(simd-vs*) [ [ ^^saturated-mul-vector ] emit-binary-vector-op ] }
|
{ math.vectors.simd.intrinsics:(simd-vs*) [ [ ^^saturated-mul-vector ] emit-binary-vector-op ] }
|
||||||
{ math.vectors.simd.intrinsics:(simd-v/) [ [ ^^div-vector ] emit-binary-vector-op ] }
|
{ math.vectors.simd.intrinsics:(simd-v/) [ [ ^^div-vector ] emit-binary-vector-op ] }
|
||||||
|
|
|
@ -7,7 +7,10 @@ compiler.tree.propagation.info compiler.cfg.builder.blocks
|
||||||
compiler.cfg.comparisons
|
compiler.cfg.comparisons
|
||||||
compiler.cfg.stacks compiler.cfg.stacks.local compiler.cfg.hats
|
compiler.cfg.stacks compiler.cfg.stacks.local compiler.cfg.hats
|
||||||
compiler.cfg.instructions compiler.cfg.registers
|
compiler.cfg.instructions compiler.cfg.registers
|
||||||
compiler.cfg.intrinsics.alien ;
|
compiler.cfg.intrinsics.alien
|
||||||
|
specialized-arrays ;
|
||||||
|
FROM: alien.c-types => float double ;
|
||||||
|
SPECIALIZED-ARRAYS: float double ;
|
||||||
IN: compiler.cfg.intrinsics.simd
|
IN: compiler.cfg.intrinsics.simd
|
||||||
|
|
||||||
MACRO: check-elements ( quots -- )
|
MACRO: check-elements ( quots -- )
|
||||||
|
@ -177,3 +180,10 @@ MACRO: if-literals-match ( quots -- )
|
||||||
]
|
]
|
||||||
} cond ;
|
} cond ;
|
||||||
|
|
||||||
|
:: generate-neg-vector ( src rep -- dst )
|
||||||
|
rep {
|
||||||
|
{ float-4-rep [ float-array{ -0.0 -0.0 -0.0 -0.0 } underlying>> ^^load-constant ] }
|
||||||
|
{ double-2-rep [ double-array{ -0.0 -0.0 } underlying>> ^^load-constant ] }
|
||||||
|
[ drop rep ^^zero-vector ]
|
||||||
|
} case
|
||||||
|
src rep ^^sub-vector ;
|
||||||
|
|
|
@ -8,6 +8,7 @@ IN: compiler.tree.propagation.simd
|
||||||
{
|
{
|
||||||
(simd-v+)
|
(simd-v+)
|
||||||
(simd-v-)
|
(simd-v-)
|
||||||
|
(simd-vneg)
|
||||||
(simd-v+-)
|
(simd-v+-)
|
||||||
(simd-v*)
|
(simd-v*)
|
||||||
(simd-v/)
|
(simd-v/)
|
||||||
|
|
|
@ -109,7 +109,6 @@ ERROR: bad-schema op schema ;
|
||||||
! Some SIMD operations are defined in terms of others.
|
! Some SIMD operations are defined in terms of others.
|
||||||
{
|
{
|
||||||
{ vbroadcast [ swap nth ctor execute ] }
|
{ vbroadcast [ swap nth ctor execute ] }
|
||||||
{ vneg [ [ dup vbitxor ] keep v- ] }
|
|
||||||
{ n+v [ [ ctor execute ] dip v+ ] }
|
{ n+v [ [ ctor execute ] dip v+ ] }
|
||||||
{ v+n [ ctor execute v+ ] }
|
{ v+n [ ctor execute v+ ] }
|
||||||
{ n-v [ [ ctor execute ] dip v- ] }
|
{ n-v [ [ ctor execute ] dip v- ] }
|
||||||
|
|
|
@ -40,6 +40,7 @@ SYNTAX: SIMD-CONVERSION-OP:
|
||||||
|
|
||||||
SIMD-OP: v+
|
SIMD-OP: v+
|
||||||
SIMD-OP: v-
|
SIMD-OP: v-
|
||||||
|
SIMD-OP: vneg
|
||||||
SIMD-OP: v+-
|
SIMD-OP: v+-
|
||||||
SIMD-OP: vs+
|
SIMD-OP: vs+
|
||||||
SIMD-OP: vs-
|
SIMD-OP: vs-
|
||||||
|
@ -148,6 +149,7 @@ M: vector-rep supported-simd-op?
|
||||||
{ \ (simd-v+-) [ %add-sub-vector-reps ] }
|
{ \ (simd-v+-) [ %add-sub-vector-reps ] }
|
||||||
{ \ (simd-v-) [ %sub-vector-reps ] }
|
{ \ (simd-v-) [ %sub-vector-reps ] }
|
||||||
{ \ (simd-vs-) [ %saturated-sub-vector-reps ] }
|
{ \ (simd-vs-) [ %saturated-sub-vector-reps ] }
|
||||||
|
{ \ (simd-vneg) [ %sub-vector-reps ] }
|
||||||
{ \ (simd-v*) [ %mul-vector-reps ] }
|
{ \ (simd-v*) [ %mul-vector-reps ] }
|
||||||
{ \ (simd-vs*) [ %saturated-mul-vector-reps ] }
|
{ \ (simd-vs*) [ %saturated-mul-vector-reps ] }
|
||||||
{ \ (simd-v/) [ %div-vector-reps ] }
|
{ \ (simd-v/) [ %div-vector-reps ] }
|
||||||
|
|
|
@ -69,6 +69,7 @@ H{
|
||||||
{ v+- { +vector+ +vector+ -> +vector+ } }
|
{ v+- { +vector+ +vector+ -> +vector+ } }
|
||||||
{ v+n { +vector+ +scalar+ -> +vector+ } }
|
{ v+n { +vector+ +scalar+ -> +vector+ } }
|
||||||
{ v- { +vector+ +vector+ -> +vector+ } }
|
{ v- { +vector+ +vector+ -> +vector+ } }
|
||||||
|
{ vneg { +vector+ -> +vector+ } }
|
||||||
{ vs- { +vector+ +vector+ -> +vector+ } }
|
{ vs- { +vector+ +vector+ -> +vector+ } }
|
||||||
{ v-n { +vector+ +scalar+ -> +vector+ } }
|
{ v-n { +vector+ +scalar+ -> +vector+ } }
|
||||||
{ v. { +vector+ +vector+ -> +scalar+ } }
|
{ v. { +vector+ +vector+ -> +scalar+ } }
|
||||||
|
|
Loading…
Reference in New Issue