From d518bed6b7b59dc489de4ffda9818513f2815b81 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Fri, 25 Sep 2009 18:50:44 -0500 Subject: [PATCH] math.vectors: change vlshift and vrshift to mask the shift count by HEX: ff, to make them behave consistently with their SIMD counterparts --- basis/math/vectors/vectors-tests.factor | 14 ++++++++++++-- basis/math/vectors/vectors.factor | 4 ++-- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/basis/math/vectors/vectors-tests.factor b/basis/math/vectors/vectors-tests.factor index 5296831889..712c5e4c60 100644 --- a/basis/math/vectors/vectors-tests.factor +++ b/basis/math/vectors/vectors-tests.factor @@ -1,5 +1,7 @@ IN: math.vectors.tests -USING: math.vectors tools.test kernel ; +USING: math.vectors tools.test kernel specialized-arrays compiler +kernel.private ; +SPECIALIZED-ARRAY: int [ { 1 2 3 } ] [ 1/2 { 2 4 6 } n*v ] unit-test [ { 1 2 3 } ] [ { 2 4 6 } 1/2 v*n ] unit-test @@ -21,4 +23,12 @@ USING: math.vectors tools.test kernel ; [ { 0 3 2 5 4 } ] [ { 1 2 3 4 5 } { 1 1 1 1 1 } v+- ] unit-test -[ 1 ] [ { C{ 0 1 } } dup v. ] unit-test \ No newline at end of file +[ 1 ] [ { C{ 0 1 } } dup v. ] unit-test + +! Make sure vector shifts behave the same as hardware SIMD vector shifts +[ int-array{ 0 0 0 0 } ] [ int-array{ 10 20 30 40 } -1 vlshift ] unit-test + +[ int-array{ 0 0 0 0 } ] [ + int-array{ 10 20 30 40 } + [ { int-array } declare -1 vlshift ] compile-call +] unit-test \ No newline at end of file diff --git a/basis/math/vectors/vectors.factor b/basis/math/vectors/vectors.factor index a40506f980..1bd202f2ad 100644 --- a/basis/math/vectors/vectors.factor +++ b/basis/math/vectors/vectors.factor @@ -61,8 +61,8 @@ PRIVATE> : vbitor ( u v -- w ) over '[ _ [ bitor ] fp-bitwise-op ] 2map ; : vbitxor ( u v -- w ) over '[ _ [ bitxor ] fp-bitwise-op ] 2map ; -: vlshift ( u n -- w ) '[ _ shift ] map ; -: vrshift ( u n -- w ) neg '[ _ shift ] map ; +: vlshift ( u n -- w ) HEX: ff bitand '[ _ shift ] map ; +: vrshift ( u n -- w ) HEX: ff bitand neg '[ _ shift ] map ; : vfloor ( u -- v ) [ floor ] map ; : vceiling ( u -- v ) [ ceiling ] map ;