From 01f5d392bed9b4801d93fe89c48e050ff3e3ed16 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Fri, 9 Oct 2009 13:16:39 -0500 Subject: [PATCH] implement vneg as an intrinsic in terms of load -0, subtract --- basis/compiler/cfg/intrinsics/intrinsics.factor | 1 + basis/compiler/cfg/intrinsics/simd/simd.factor | 12 +++++++++++- basis/compiler/tree/propagation/simd/simd.factor | 1 + basis/math/vectors/simd/functor/functor.factor | 1 - basis/math/vectors/simd/intrinsics/intrinsics.factor | 2 ++ .../vectors/specialization/specialization.factor | 1 + 6 files changed, 16 insertions(+), 2 deletions(-) diff --git a/basis/compiler/cfg/intrinsics/intrinsics.factor b/basis/compiler/cfg/intrinsics/intrinsics.factor index 2dcd6d4b45..a27c8e81dd 100644 --- a/basis/compiler/cfg/intrinsics/intrinsics.factor +++ b/basis/compiler/cfg/intrinsics/intrinsics.factor @@ -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-) [ [ ^^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-vs*) [ [ ^^saturated-mul-vector ] emit-binary-vector-op ] } { math.vectors.simd.intrinsics:(simd-v/) [ [ ^^div-vector ] emit-binary-vector-op ] } diff --git a/basis/compiler/cfg/intrinsics/simd/simd.factor b/basis/compiler/cfg/intrinsics/simd/simd.factor index 9986588e3e..7e8f388ce8 100644 --- a/basis/compiler/cfg/intrinsics/simd/simd.factor +++ b/basis/compiler/cfg/intrinsics/simd/simd.factor @@ -7,7 +7,10 @@ compiler.tree.propagation.info compiler.cfg.builder.blocks compiler.cfg.comparisons compiler.cfg.stacks compiler.cfg.stacks.local compiler.cfg.hats 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 MACRO: check-elements ( quots -- ) @@ -177,3 +180,10 @@ MACRO: if-literals-match ( quots -- ) ] } 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 ; diff --git a/basis/compiler/tree/propagation/simd/simd.factor b/basis/compiler/tree/propagation/simd/simd.factor index 4e9734693b..7bda0fed30 100644 --- a/basis/compiler/tree/propagation/simd/simd.factor +++ b/basis/compiler/tree/propagation/simd/simd.factor @@ -8,6 +8,7 @@ IN: compiler.tree.propagation.simd { (simd-v+) (simd-v-) + (simd-vneg) (simd-v+-) (simd-v*) (simd-v/) diff --git a/basis/math/vectors/simd/functor/functor.factor b/basis/math/vectors/simd/functor/functor.factor index 15e37bbcd9..7f28f644e1 100644 --- a/basis/math/vectors/simd/functor/functor.factor +++ b/basis/math/vectors/simd/functor/functor.factor @@ -109,7 +109,6 @@ ERROR: bad-schema op schema ; ! Some SIMD operations are defined in terms of others. { { vbroadcast [ swap nth ctor execute ] } - { vneg [ [ dup vbitxor ] keep v- ] } { n+v [ [ ctor execute ] dip v+ ] } { v+n [ ctor execute v+ ] } { n-v [ [ ctor execute ] dip v- ] } diff --git a/basis/math/vectors/simd/intrinsics/intrinsics.factor b/basis/math/vectors/simd/intrinsics/intrinsics.factor index 0efb0c2417..94307729a8 100644 --- a/basis/math/vectors/simd/intrinsics/intrinsics.factor +++ b/basis/math/vectors/simd/intrinsics/intrinsics.factor @@ -40,6 +40,7 @@ SYNTAX: SIMD-CONVERSION-OP: SIMD-OP: v+ SIMD-OP: v- +SIMD-OP: vneg SIMD-OP: v+- SIMD-OP: vs+ SIMD-OP: vs- @@ -148,6 +149,7 @@ M: vector-rep supported-simd-op? { \ (simd-v+-) [ %add-sub-vector-reps ] } { \ (simd-v-) [ %sub-vector-reps ] } { \ (simd-vs-) [ %saturated-sub-vector-reps ] } + { \ (simd-vneg) [ %sub-vector-reps ] } { \ (simd-v*) [ %mul-vector-reps ] } { \ (simd-vs*) [ %saturated-mul-vector-reps ] } { \ (simd-v/) [ %div-vector-reps ] } diff --git a/basis/math/vectors/specialization/specialization.factor b/basis/math/vectors/specialization/specialization.factor index be959a2a2e..28c3ee82c3 100644 --- a/basis/math/vectors/specialization/specialization.factor +++ b/basis/math/vectors/specialization/specialization.factor @@ -69,6 +69,7 @@ H{ { v+- { +vector+ +vector+ -> +vector+ } } { v+n { +vector+ +scalar+ -> +vector+ } } { v- { +vector+ +vector+ -> +vector+ } } + { vneg { +vector+ -> +vector+ } } { vs- { +vector+ +vector+ -> +vector+ } } { v-n { +vector+ +scalar+ -> +vector+ } } { v. { +vector+ +vector+ -> +scalar+ } }