From b075a3dfcf5aaa72c086d7896ab0c975f42d04c2 Mon Sep 17 00:00:00 2001 From: eschnett Date: Sat, 20 Aug 2011 00:30:29 +0000 Subject: Make more C++ compilers understand the signbit function Several C++ compilers cannot handle std::signbit; use a work-around instead. Correct a namespace problem when using the same identifier Vectors_SGN for different precisions (real*4 and real*8). Correct kifpos implementation incorrectly on several architectures. git-svn-id: https://svn.cct.lsu.edu/repos/numrel/LSUThorns/Vectors/trunk@29 105869f7-3296-0410-a4ea-f4349344b45a --- src/test.cc | 11 +++++++++-- src/vectors-4-Altivec.h | 4 ++-- src/vectors-4-SSE.h | 12 ++++++------ src/vectors-4-default.h | 6 +++--- src/vectors-8-DoubleHummer.h | 2 +- src/vectors-8-SSE2.h | 8 ++++---- src/vectors-8-VSX.h | 4 ++-- src/vectors-8-default.h | 6 +++--- 8 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/test.cc b/src/test.cc index b99865d..0be9aed 100644 --- a/src/test.cc +++ b/src/test.cc @@ -2,9 +2,16 @@ #include "cctk_Arguments.h" #include "cctk_Parameters.h" #include "vectors.h" + #include #include +inline int my_signbit (CCTK_REAL const x) +{ + using namespace std; + return signbit(x); +} + #define SCALARTEST(testname, vecexpr, scalarexpr) \ do { \ if (verbose) \ @@ -163,9 +170,9 @@ void Vectors_Test(CCTK_ARGUMENTS) VECTEST("ksqrt", ksqrt(av), sqrt(a[i]) ); VECTEST("kifpos positive", - kifpos(av, bv, cv), std::signbit(a[i]) ? c[i] : b[i]); + kifpos(av, bv, cv), my_signbit(a[i]) ? c[i] : b[i]); VECTEST("kifpos negative", - kifpos(bv, bv, cv), std::signbit(b[i]) ? c[i] : b[i]); + kifpos(bv, bv, cv), my_signbit(b[i]) ? c[i] : b[i]); VECTEST("kifpos 0", kifpos(vec_set1(0.),bv,cv), b[i]); VECTEST("kifpos -0", kifpos(vec_set1(-0.),bv,cv), c[i]); diff --git a/src/vectors-4-Altivec.h b/src/vectors-4-Altivec.h index d6f5b89..a55c683 100644 --- a/src/vectors-4-Altivec.h +++ b/src/vectors-4-Altivec.h @@ -161,5 +161,5 @@ #define k4pow(x,a) K4REPL2(pow,x,a) #define k4sqrt(x) K4REPL(sqrt,x) -#define k4ifpos(x,y,z) \ - vec_sel(vec_sra(vec_convert((x), &(vector int*)0, 31), (y), (z)) +#define k4ifpos(x,y,z) \ + (vec_sel((y), (z), vec_sra(vec_convert((x), &(vector int*)0), 31))) diff --git a/src/vectors-4-SSE.h b/src/vectors-4-SSE.h index 9547b03..2f55183 100644 --- a/src/vectors-4-SSE.h +++ b/src/vectors-4-SSE.h @@ -313,9 +313,9 @@ static const union { # define k4ifpos(x,y,z) (_mm_blendv_ps(y,z,x)) #else # ifdef __cplusplus -# define Vectors_SGN(x) std::signbit(x) +# define k4sgn(x) ({ using namespace std; signbit(x); }) # else -# define Vectors_SGN(x) signbit(x) +# define k4sgn(x) (signbit(x)) # endif # define k4ifpos(x,y,z) \ ({ \ @@ -325,9 +325,9 @@ static const union { CCTK_REAL4_VEC const y=yy; \ CCTK_REAL4_VEC const zz=(z_); \ CCTK_REAL4_VEC const z=zz; \ - vec4_set(Vectors_SGN(vec4_elt0(x)) ? vec4_elt0(z) : vec4_elt0(y), \ - Vectors_SGN(vec4_elt1(x)) ? vec4_elt1(z) : vec4_elt1(y), \ - Vectors_SGN(vec4_elt2(x)) ? vec4_elt2(z) : vec4_elt2(y), \ - Vectors_SGN(vec4_elt3(x)) ? vec4_elt3(z) : vec4_elt3(y)); \ + vec4_set(k4sgn(vec4_elt0(x)) ? vec4_elt0(z) : vec4_elt0(y), \ + k4sgn(vec4_elt1(x)) ? vec4_elt1(z) : vec4_elt1(y), \ + k4sgn(vec4_elt2(x)) ? vec4_elt2(z) : vec4_elt2(y), \ + k4sgn(vec4_elt3(x)) ? vec4_elt3(z) : vec4_elt3(y)); \ }) #endif diff --git a/src/vectors-4-default.h b/src/vectors-4-default.h index 76bdc7d..3e5cd70 100644 --- a/src/vectors-4-default.h +++ b/src/vectors-4-default.h @@ -85,9 +85,9 @@ #define k4sqrt(x) (sqrtf(x)) #ifdef __cplusplus -# define Vectors_SGN(x) std::signbit(x) +# define k4sgn(x) ({ using namespace std; signbit(x); }) #else -# define Vectors_SGN(x) signbit(x) +# define k4sgn(x) (signbit(x)) #endif -#define k4ifpos(x,y,z) (Vectors_SGN(x)?(z):(y)) +#define k4ifpos(x,y,z) (k4sgn(x)?(z):(y)) diff --git a/src/vectors-8-DoubleHummer.h b/src/vectors-8-DoubleHummer.h index 952f7fb..a880bd3 100644 --- a/src/vectors-8-DoubleHummer.h +++ b/src/vectors-8-DoubleHummer.h @@ -211,4 +211,4 @@ #define k8pow(x,a) K8REPL2(pow,x,a) #define k8sqrt(x) K8REPL(sqrt,x) -#define k8ifpos(x,y,z) fpsel(y,z,x) +#define k8ifpos(x,y,z) (__fpsel(x,z,y)) diff --git a/src/vectors-8-SSE2.h b/src/vectors-8-SSE2.h index b530d10..56c614d 100644 --- a/src/vectors-8-SSE2.h +++ b/src/vectors-8-SSE2.h @@ -235,9 +235,9 @@ static const union { }) #else # ifdef __cplusplus -# define Vectors_SGN(x) std::signbit(x) +# define k8sgn(x) ({ using namespace std; signbit(x); }) # else -# define Vectors_SGN(x) signbit(x) +# define k4sgn(x) (signbit(x)) # endif # define k8ifpos(x_,y_,z_) \ ({ \ @@ -247,7 +247,7 @@ static const union { CCTK_REAL8_VEC const y=yy; \ CCTK_REAL8_VEC const zz=(z_); \ CCTK_REAL8_VEC const z=zz; \ - vec8_set(Vectors_SGN(vec8_elt0(x)) ? vec8_elt0(z) : vec8_elt0(y), \ - Vectors_SGN(vec8_elt1(x)) ? vec8_elt1(z) : vec8_elt1(y)); \ + vec8_set(k8sgn(vec8_elt0(x)) ? vec8_elt0(z) : vec8_elt0(y), \ + k8sgn(vec8_elt1(x)) ? vec8_elt1(z) : vec8_elt1(y)); \ }) #endif diff --git a/src/vectors-8-VSX.h b/src/vectors-8-VSX.h index 8b24c1b..b079a2f 100644 --- a/src/vectors-8-VSX.h +++ b/src/vectors-8-VSX.h @@ -109,5 +109,5 @@ #define k8pow(x,a) K8REPL2(pow,x,a) #define k8sqrt(x) K8REPL(sqrt,x) -#define k8ifpos(x,y,z) \ - vec_sel(vec_sra(vec_convert((x), &(vector long long*)0, 63), (y), (z)) +#define k8ifpos(x,y,z) \ + (vec_sel((y), (z), vec_sra(vec_convert((x), &(vector long long*)0), 63))) diff --git a/src/vectors-8-default.h b/src/vectors-8-default.h index f24c0d3..d95ca91 100644 --- a/src/vectors-8-default.h +++ b/src/vectors-8-default.h @@ -85,9 +85,9 @@ #define k8sqrt(x) (sqrt(x)) #ifdef __cplusplus -# define Vectors_SGN(x) std::signbit(x) +# define k8sgn(x) ({ using namespace std; signbit(x); }) #else -# define Vectors_SGN(x) signbit(x) +# define k8sgn(x) (signbit(x)) #endif -#define k8ifpos(x,y,z) (Vectors_SGN(x)?(z):(y)) +#define k8ifpos(x,y,z) (k8sgn(x)?(z):(y)) -- cgit v1.2.3