From 1ad9dc14b4cf9491695ad1bfe4c3c7f20c1738a3 Mon Sep 17 00:00:00 2001 From: Joe Groff Date: Sat, 5 Dec 2009 17:17:16 -0800 Subject: [PATCH] fix simd tests --- basis/compiler/cfg/intrinsics/simd/simd.factor | 5 ++++- basis/cpu/x86/x86.factor | 6 ++---- .../vectors/simd/intrinsics/intrinsics.factor | 16 ++++++++++------ basis/math/vectors/simd/simd-tests.factor | 2 +- basis/math/vectors/simd/simd.factor | 2 +- 5 files changed, 18 insertions(+), 13 deletions(-) diff --git a/basis/compiler/cfg/intrinsics/simd/simd.factor b/basis/compiler/cfg/intrinsics/simd/simd.factor index 170b9e37b7..c75e890c27 100644 --- a/basis/compiler/cfg/intrinsics/simd/simd.factor +++ b/basis/compiler/cfg/intrinsics/simd/simd.factor @@ -392,7 +392,10 @@ PREDICATE: fixnum-vector-rep < int-vector-rep : emit-simd-vsad ( node -- ) { - [ [ ^^sad-vector ] [ widen-vector-rep ^^vector>scalar ] bi ] + [ + [ ^^sad-vector dup { 2 3 0 1 } int-4-rep ^^shuffle-vector-imm int-4-rep ^^add-vector ] + [ widen-vector-rep ^^vector>scalar ] bi + ] } emit-vv-vector-op ; : emit-simd-vsqrt ( node -- ) diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index b48215f216..36711f7122 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -1124,12 +1124,11 @@ M: x86 %mul-horizontal-add-vector ( dst src1 src2 rep -- ) { char-16-rep [ PMADDUBSW ] } { uchar-16-rep [ PMADDUBSW ] } { short-8-rep [ PMADDWD ] } - { ushort-8-rep [ PMADDWD ] } } case ; M: x86 %mul-horizontal-add-vector-reps { - { sse2? { short-8-rep ushort-8-rep } } + { sse2? { short-8-rep } } { ssse3? { char-16-rep uchar-16-rep } } } available-reps ; @@ -1213,13 +1212,12 @@ M: x86 %dot-vector-reps M: x86 %sad-vector [ two-operand ] keep { - { char-16-rep [ PSADBW ] } { uchar-16-rep [ PSADBW ] } } case ; M: x86 %sad-vector-reps { - { sse2? { char-16-rep uchar-16-rep } } + { sse2? { uchar-16-rep } } } available-reps ; M: x86 %horizontal-add-vector ( dst src1 src2 rep -- ) diff --git a/basis/math/vectors/simd/intrinsics/intrinsics.factor b/basis/math/vectors/simd/intrinsics/intrinsics.factor index 0dc13240ff..658d9b270c 100644 --- a/basis/math/vectors/simd/intrinsics/intrinsics.factor +++ b/basis/math/vectors/simd/intrinsics/intrinsics.factor @@ -145,24 +145,28 @@ PRIVATE> : (simd-v*high) ( a b rep -- c ) dup rep-component-type heap-size -8 * '[ * _ shift ] components-2map ; :: (simd-v*hs+) ( a b rep -- c ) - rep widen-vector-rep signed-rep :> wide-rep + rep { char-16-rep uchar-16-rep } member-eq? + [ uchar-16-rep char-16-rep ] + [ rep rep ] if :> ( a-rep b-rep ) + b-rep widen-vector-rep signed-rep :> wide-rep wide-rep rep-component-type :> wide-type - a rep >rep-array 2 :> a' - b rep >rep-array 2 :> b' + a a-rep >rep-array 2 :> a' + b b-rep >rep-array 2 :> b' a' b' [ [ [ first ] bi@ * ] [ [ second ] bi@ * ] 2bi + wide-type c-type-clamp - ] wide-rep 2map-as ; + ] wide-rep 2map-as underlying>> ; : (simd-v/) ( a b rep -- c ) [ / ] components-2map ; -: (simd-vavg) ( a b rep -- c ) [ + 2 / ] components-2map ; +: (simd-vavg) ( a b rep -- c ) + [ + dup integer? [ 1 + -1 shift ] [ 0.5 * ] if ] components-2map ; : (simd-vmin) ( a b rep -- c ) [ min ] components-2map ; : (simd-vmax) ( a b rep -- c ) [ max ] components-2map ; : (simd-v.) ( a b rep -- n ) [ 2>rep-array [ [ first ] bi@ * ] 2keep ] keep 1 swap rep-length [a,b) [ '[ _ swap nth-unsafe ] bi@ * + ] with with each ; : (simd-vsqrt) ( a rep -- c ) [ fsqrt ] components-map ; -: (simd-vsad) ( a b rep -- n ) 2>rep-array [ - abs ] [ + ] 2map-reduce ; +: (simd-vsad) ( a b rep -- c ) 2>rep-array [ - abs ] [ + ] 2map-reduce ; : (simd-sum) ( a rep -- n ) [ + ] components-reduce ; : (simd-vabs) ( a rep -- c ) [ abs ] components-map ; : (simd-vbitand) ( a b rep -- c ) [ bitand ] bitwise-components-2map ; diff --git a/basis/math/vectors/simd/simd-tests.factor b/basis/math/vectors/simd/simd-tests.factor index 89bc0f7109..aaa5507864 100644 --- a/basis/math/vectors/simd/simd-tests.factor +++ b/basis/math/vectors/simd/simd-tests.factor @@ -201,7 +201,7 @@ CONSTANT: vector-words { vsqrt n/v v/n v/ normalize } unique assoc-diff ; : remove-integer-words ( alist -- alist' ) - { vlshift vrshift v*high } unique assoc-diff ; + { vlshift vrshift v*high v*hs+ } unique assoc-diff ; : boolean-ops ( -- words ) { vand vandn vor vxor vnot } ; diff --git a/basis/math/vectors/simd/simd.factor b/basis/math/vectors/simd/simd.factor index 9f3e848fc3..997fec32fd 100644 --- a/basis/math/vectors/simd/simd.factor +++ b/basis/math/vectors/simd/simd.factor @@ -273,7 +273,7 @@ M: simd-128 vshuffle ( u perm -- v ) vshuffle-bytes ; inline M: uchar-16 v*hs+ - uchar-16-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op ushort-8-cast ; inline + uchar-16-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op short-8-cast ; inline M: ushort-8 v*hs+ ushort-8-rep [ (simd-v*hs+) ] [ call-next-method ] vv->v-op uint-4-cast ; inline M: uint-4 v*hs+