aboutsummaryrefslogtreecommitdiff
path: root/src/vectors.h
diff options
context:
space:
mode:
authoreschnett <eschnett@105869f7-3296-0410-a4ea-f4349344b45a>2010-12-03 14:51:56 +0000
committereschnett <eschnett@105869f7-3296-0410-a4ea-f4349344b45a>2010-12-03 14:51:56 +0000
commit421103bf1df43f250a452df460553f72c824f8db (patch)
tree5742f5eeee2f14402b3ebc734bdaeb8b71c8a436 /src/vectors.h
parent96b656fc2d33f2d5238db7e8de17b11c5893084b (diff)
Add implementation
git-svn-id: https://svn.cct.lsu.edu/repos/numrel/LSUThorns/Vectors/trunk@4 105869f7-3296-0410-a4ea-f4349344b45a
Diffstat (limited to 'src/vectors.h')
-rw-r--r--src/vectors.h284
1 files changed, 284 insertions, 0 deletions
diff --git a/src/vectors.h b/src/vectors.h
new file mode 100644
index 0000000..6fe909f
--- /dev/null
+++ b/src/vectors.h
@@ -0,0 +1,284 @@
+#ifndef VECTORS_H
+#define VECTORS_H
+
+#include <cctk.h>
+
+
+
+#if defined(KRANC_VECTORS)
+
+# if defined(__SSE__) // Intel SSE vector instructions
+# include "vectors-intel-4.h"
+# elif defined(__ALTIVEC__) // Altivec (Power)
+# include "vectors-power-4.h"
+# endif
+
+# if defined(__SSE2__) // Intel SSE2 vector instructions
+# include "vectors-intel-8.h"
+# elif defined(__ALTIVEC__) && defined(_ARCH_PWR7) // Altivec (Power)
+# include "vectors-power-8.h"
+# endif
+
+#endif
+
+// Default implementation, do not vectorise
+#if ! defined(CCTK_REAL4_VEC_SIZE)
+# include "vectors-default-4.h"
+#endif
+#if ! defined(CCTK_REAL8_VEC_SIZE)
+# include "vectors-default-8.h"
+#endif
+
+
+
+// Define macros for CCTK_REAL
+
+#if defined(CCTK_REAL_PRECISION_4)
+
+# define CCTK_REAL_VEC CCTK_REAL4_VEC
+# define CCTK_REAL_VEC_SIZE CCTK_REAL4_VEC_SIZE
+
+# define vec_set1 vec4_set1
+# define vec_set vec4_set
+
+# define vec_elt0 vec4_elt0
+# define vec_elt vec4_elt
+
+# define vec_load vec4_load
+# define vec_loadu vec4_loadu
+# define vec_loadu_maybe vec4_loadu_maybe
+# define vec_loadu_maybe3 vec4_loadu_maybe3
+# define vec_store vec4_store
+# define vec_store_nta vec4_store_nta
+# define vec_store_nta_partial_lo vec4_store_nta_partial_lo
+# define vec_store_nta_partial_hi vec4_store_nta_partial_hi
+
+# define kpos k4pos
+# define kneg k4neg
+
+# define kadd k4add
+# define ksub k4sub
+# define kmul k4mul
+# define kdiv k4div
+
+# define kmadd k4madd
+# define kmsub k4msub
+# define knmadd k4nmadd
+# define knmsub k4nmsub
+
+# define kexp k4exp
+# define kfabs k4fabs
+# define kfmax k4fmax
+# define kfmin k4fmin
+# define kfnabs k4fnabs
+# define klog k4log
+# define kpow k4pow
+# define ksqrt k4sqrt
+
+#elif defined(CCTK_REAL_PRECISION_8)
+
+# define CCTK_REAL_VEC CCTK_REAL8_VEC
+# define CCTK_REAL_VEC_SIZE CCTK_REAL8_VEC_SIZE
+
+# define vec_set1 vec8_set1
+# define vec_set vec8_set
+
+# define vec_elt0 vec8_elt0
+# define vec_elt vec8_elt
+
+# define vec_load vec8_load
+# define vec_loadu vec8_loadu
+# define vec_loadu_maybe vec8_loadu_maybe
+# define vec_loadu_maybe3 vec8_loadu_maybe3
+# define vec_store vec8_store
+# define vec_store_nta vec8_store_nta
+# define vec_store_nta_partial_lo vec8_store_nta_partial_lo
+# define vec_store_nta_partial_hi vec8_store_nta_partial_hi
+
+# define kpos k8pos
+# define kneg k8neg
+
+# define kadd k8add
+# define ksub k8sub
+# define kmul k8mul
+# define kdiv k8div
+
+# define kmadd k8madd
+# define kmsub k8msub
+# define knmadd k8nmadd
+# define knmsub k8nmsub
+
+# define kexp k8exp
+# define kfabs k8fabs
+# define kfmax k8fmax
+# define kfmin k8fmin
+# define kfnabs k8fnabs
+# define klog k8log
+# define kpow k8pow
+# define ksqrt k8sqrt
+
+#else
+
+# error "Unknown CCTK_REAL_PRECISION"
+
+#endif
+
+
+
+// Define a class template for easier access from C++
+
+#ifdef __cplusplus
+
+template<typename T>
+struct vecprops {
+ typedef T scalar_t;
+ typedef T vector_t;
+ static inline int size()
+ {
+ return 1;
+ }
+ static inline vector_t load (scalar_t const& a)
+ {
+ return a;
+ }
+ static inline vector_t loadu (scalar_t const& a)
+ {
+ return a;
+ }
+ static inline scalar_t elt (vector_t const& x, int const d)
+ {
+ return x;
+ }
+ static inline vector_t pos (vector_t const& x)
+ {
+ return +x;
+ }
+ static inline vector_t neg (vector_t const& x)
+ {
+ return -x;
+ }
+ static inline vector_t add (vector_t const& x, vector_t const& y)
+ {
+ return x+y;
+ }
+ static inline vector_t sub (vector_t const& x, vector_t const& y)
+ {
+ return x-y;
+ }
+ static inline vector_t mul (vector_t const& x, vector_t const& y)
+ {
+ return x*y;
+ }
+ static inline vector_t div (vector_t const& x, vector_t const& y)
+ {
+ return x/y;
+ }
+};
+
+template<>
+struct vecprops<CCTK_REAL4> {
+ typedef CCTK_REAL4 scalar_t;
+ typedef CCTK_REAL4_VEC vector_t;
+ static inline int size()
+ {
+ return CCTK_REAL4_VEC_SIZE;
+ }
+ static inline vector_t load (scalar_t const& a)
+ {
+ return vec4_load(a);
+ }
+ static inline vector_t loadu (scalar_t const& a)
+ {
+ return vec4_loadu(a);
+ }
+ static inline scalar_t elt (vector_t const& x, int const d)
+ {
+ return vec4_elt(x,d);
+ }
+ static inline vector_t pos (vector_t const& x)
+ {
+ return k4pos(x);
+ }
+ static inline vector_t neg (vector_t const& x)
+ {
+ return k4neg(x);
+ }
+ static inline vector_t add (vector_t const& x, vector_t const& y)
+ {
+ return k4add(x,y);
+ }
+ static inline vector_t sub (vector_t const& x, vector_t const& y)
+ {
+ return k4sub(x,y);
+ }
+ static inline vector_t mul (vector_t const& x, vector_t const& y)
+ {
+ return k4mul(x,y);
+ }
+ static inline vector_t div (vector_t const& x, vector_t const& y)
+ {
+ return k4div(x,y);
+ }
+};
+
+template<>
+struct vecprops<CCTK_REAL8> {
+ typedef CCTK_REAL8 scalar_t;
+ typedef CCTK_REAL8_VEC vector_t;
+ static inline int size()
+ {
+ return CCTK_REAL8_VEC_SIZE;
+ }
+ static inline vector_t load (scalar_t const& a)
+ {
+ return vec8_load(a);
+ }
+ static inline vector_t loadu (scalar_t const& a)
+ {
+ return vec8_loadu(a);
+ }
+ static inline scalar_t elt (vector_t const& x, int const d)
+ {
+ return vec8_elt(x,d);
+ }
+ static inline vector_t pos (vector_t const& x)
+ {
+ return k8pos(x);
+ }
+ static inline vector_t neg (vector_t const& x)
+ {
+ return k8neg(x);
+ }
+ static inline vector_t add (vector_t const& x, vector_t const& y)
+ {
+ return k8add(x,y);
+ }
+ static inline vector_t sub (vector_t const& x, vector_t const& y)
+ {
+ return k8sub(x,y);
+ }
+ static inline vector_t mul (vector_t const& x, vector_t const& y)
+ {
+ return k8mul(x,y);
+ }
+ static inline vector_t div (vector_t const& x, vector_t const& y)
+ {
+ return k8div(x,y);
+ }
+};
+
+#endif
+
+
+
+// For Kranc
+
+#undef ToReal
+#define ToReal(x) (vec_set1((CCTK_REAL)(x)))
+
+#undef Sign
+#define Sign(x) -999999999 // poison
+
+
+
+#endif // #ifndef VECTORS_H