aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoreschnett <eschnett@105869f7-3296-0410-a4ea-f4349344b45a>2011-08-20 00:30:29 +0000
committereschnett <eschnett@105869f7-3296-0410-a4ea-f4349344b45a>2011-08-20 00:30:29 +0000
commitb075a3dfcf5aaa72c086d7896ab0c975f42d04c2 (patch)
treed6fd1425bf823a0cd9a8d69e06231ca95864c831
parenteb2a20c1f75a6de636a4d2c3ff3c3ae5064f5b3f (diff)
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
-rw-r--r--src/test.cc11
-rw-r--r--src/vectors-4-Altivec.h4
-rw-r--r--src/vectors-4-SSE.h12
-rw-r--r--src/vectors-4-default.h6
-rw-r--r--src/vectors-8-DoubleHummer.h2
-rw-r--r--src/vectors-8-SSE2.h8
-rw-r--r--src/vectors-8-VSX.h4
-rw-r--r--src/vectors-8-default.h6
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 <math.h>
#include <stdio.h>
+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))