From a50c0a6624c2cb11e3d46e2b5538d924e67e310a Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 12 Nov 2011 16:53:07 -0800 Subject: [PATCH] math.vectors.simd: make vcount work for all ints --- basis/math/vectors/simd/simd.factor | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/basis/math/vectors/simd/simd.factor b/basis/math/vectors/simd/simd.factor index df54fc8346..a277c651a3 100644 --- a/basis/math/vectors/simd/simd.factor +++ b/basis/math/vectors/simd/simd.factor @@ -110,6 +110,21 @@ DEFER: simd-construct-op : vv->x-op ( a b rep quot: ( (a) (b) rep -- obj ) fallback-quot -- obj ) [ '[ _ (vv->x-op) ] ] [ '[ drop @ ] ] bi* if-both-vectors-match ; inline +: mask>count ( n rep -- n' ) + [ bit-count ] dip { + { float-4-rep [ ] } + { double-2-rep [ ] } + { uchar-16-rep [ ] } + { char-16-rep [ ] } + { ushort-8-rep [ -1 shift ] } + { short-8-rep [ -1 shift ] } + { ushort-8-rep [ -1 shift ] } + { int-4-rep [ -2 shift ] } + { uint-4-rep [ -2 shift ] } + { longlong-2-rep [ -3 shift ] } + { ulonglong-2-rep [ -3 shift ] } + } case ; inline + PRIVATE> >> @@ -222,7 +237,9 @@ M: simd-128 vany? M: simd-128 vall? dup simd-rep [ (simd-vall?) ] [ call-next-method ] v->x-op ; inline M: simd-128 vcount - dup simd-rep [ (simd-vgetmask) assert-positive ] [ call-next-method ] v->x-op bit-count ; inline + dup simd-rep + [ [ (simd-vgetmask) assert-positive ] [ call-next-method ] v->x-op ] + [ mask>count ] bi ; inline M: simd-128 vnone? dup simd-rep [ (simd-vnone?) ] [ call-next-method ] v->x-op ; inline