From cb36111a3cbb5262cafac3c5c9a75db4e5e5cd4b Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Tue, 20 Oct 2009 18:45:35 -0500 Subject: [PATCH] generate better fallback code for vmin/vmax intrinsics --- basis/compiler/cfg/intrinsics/intrinsics.factor | 4 ++-- basis/compiler/cfg/intrinsics/simd/simd.factor | 13 +++++++++++++ .../math/vectors/simd/intrinsics/intrinsics.factor | 4 ++-- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/basis/compiler/cfg/intrinsics/intrinsics.factor b/basis/compiler/cfg/intrinsics/intrinsics.factor index 3b6674efee..2af810ba49 100644 --- a/basis/compiler/cfg/intrinsics/intrinsics.factor +++ b/basis/compiler/cfg/intrinsics/intrinsics.factor @@ -163,8 +163,8 @@ IN: compiler.cfg.intrinsics { 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 ] } - { math.vectors.simd.intrinsics:(simd-vmin) [ [ ^^min-vector ] emit-binary-vector-op ] } - { math.vectors.simd.intrinsics:(simd-vmax) [ [ ^^max-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-vmin) [ [ generate-min-vector ] emit-binary-vector-op ] } + { math.vectors.simd.intrinsics:(simd-vmax) [ [ generate-max-vector ] emit-binary-vector-op ] } { math.vectors.simd.intrinsics:(simd-v.) [ [ ^^dot-vector ] emit-binary-vector-op ] } { math.vectors.simd.intrinsics:(simd-vabs) [ [ generate-abs-vector ] emit-unary-vector-op ] } { math.vectors.simd.intrinsics:(simd-vsqrt) [ [ ^^sqrt-vector ] emit-unary-vector-op ] } diff --git a/basis/compiler/cfg/intrinsics/simd/simd.factor b/basis/compiler/cfg/intrinsics/simd/simd.factor index 73f880a102..0e1beae5e0 100644 --- a/basis/compiler/cfg/intrinsics/simd/simd.factor +++ b/basis/compiler/cfg/intrinsics/simd/simd.factor @@ -265,3 +265,16 @@ MACRO: if-literals-match ( quots -- ) ] } cond ; +: generate-min-vector ( src1 src2 rep -- dst ) + dup %min-vector-reps member? + [ ^^min-vector ] [ + [ cc< generate-compare-vector ] + [ generate-blend-vector ] 3bi + ] if ; + +: generate-max-vector ( src1 src2 rep -- dst ) + dup %max-vector-reps member? + [ ^^max-vector ] [ + [ cc> generate-compare-vector ] + [ generate-blend-vector ] 3bi + ] if ; diff --git a/basis/math/vectors/simd/intrinsics/intrinsics.factor b/basis/math/vectors/simd/intrinsics/intrinsics.factor index 1bd5834f2c..761ca30375 100644 --- a/basis/math/vectors/simd/intrinsics/intrinsics.factor +++ b/basis/math/vectors/simd/intrinsics/intrinsics.factor @@ -163,8 +163,8 @@ M: vector-rep supported-simd-op? { \ (simd-v*) [ %mul-vector-reps ] } { \ (simd-vs*) [ %saturated-mul-vector-reps ] } { \ (simd-v/) [ %div-vector-reps ] } - { \ (simd-vmin) [ %min-vector-reps ] } - { \ (simd-vmax) [ %max-vector-reps ] } + { \ (simd-vmin) [ %min-vector-reps cc< %compare-vector-reps union ] } + { \ (simd-vmax) [ %max-vector-reps cc> %compare-vector-reps union ] } { \ (simd-v.) [ %dot-vector-reps ] } { \ (simd-vsqrt) [ %sqrt-vector-reps ] } { \ (simd-sum) [ %horizontal-add-vector-reps ] }