From 660bef5fac69225a47c966c09e9683873833f09e Mon Sep 17 00:00:00 2001
From: James Willis <james.s.willis@durham.ac.uk>
Date: Mon, 25 Apr 2016 11:13:32 +0100
Subject: [PATCH] Added macro FILL_VEC to setup constants as vectors, depending
 on the vector size.

---
 src/kernel_hydro.h | 87 +++++++++++++++++++++++-----------------------
 1 file changed, 43 insertions(+), 44 deletions(-)

diff --git a/src/kernel_hydro.h b/src/kernel_hydro.h
index e16e627da1..6cfb9a8193 100644
--- a/src/kernel_hydro.h
+++ b/src/kernel_hydro.h
@@ -214,6 +214,39 @@ __attribute__((always_inline)) INLINE static void kernel_eval(float u,
 
 #ifdef VECTORIZE
 
+#ifdef __MIC__ 
+#define FILL_VEC(constant) .f[0] = constant, \
+                           .f[1] = constant, \
+                           .f[2] = constant, \
+                           .f[3] = constant, \
+                           .f[4] = constant, \
+                           .f[5] = constant, \
+                           .f[6] = constant, \
+                           .f[7] = constant, \
+                           .f[8] = constant, \
+                           .f[9] = constant, \
+                           .f[10] = constant, \
+                           .f[11] = constant, \
+                           .f[12] = constant, \
+                           .f[13] = constant, \
+                           .f[14] = constant, \
+                           .f[15] = constant
+#elif defined(__AVX__) || defined (__AVX2__) 
+#define FILL_VEC(constant) .f[0] = constant, \
+                           .f[1] = constant, \
+                           .f[2] = constant, \
+                           .f[3] = constant, \
+                           .f[4] = constant, \
+                           .f[5] = constant, \
+                           .f[6] = constant, \
+                           .f[7] = constant
+#elif defined(__SSE2__)
+#define FILL_VEC(constant) .f[0] = constant, \
+                           .f[1] = constant, \
+                           .f[2] = constant, \
+                           .f[3] = constant
+#endif
+
 /**
  * @brief Computes the kernel function and its derivative (Vectorised version).
  *
@@ -224,50 +257,16 @@ __attribute__((always_inline)) INLINE static void kernel_eval(float u,
  * @param dw_dx (return) The norm of the gradient of $|\\nabla W(x,h)|$.
  */
 
-static const vector kernel_igamma_vec = {.f[0] = (float)kernel_igamma,
-                                         .f[1] = (float)kernel_igamma,
-                                         .f[2] = (float)kernel_igamma,
-                                         .f[3] = (float)kernel_igamma,
-                                         .f[4] = (float)kernel_igamma,
-                                         .f[5] = (float)kernel_igamma,
-                                         .f[6] = (float)kernel_igamma,
-                                         .f[7] = (float)kernel_igamma};
-
-static const vector kernel_ivals_vec = {.f[0] = (float)kernel_ivals,
-                                        .f[1] = (float)kernel_ivals,
-                                        .f[2] = (float)kernel_ivals,
-                                        .f[3] = (float)kernel_ivals,
-                                        .f[4] = (float)kernel_ivals,
-                                        .f[5] = (float)kernel_ivals,
-                                        .f[6] = (float)kernel_ivals,
-                                        .f[7] = (float)kernel_ivals};
-
-static const vector kernel_constant_vec = {.f[0] = (float)kernel_constant,
-                                           .f[1] = (float)kernel_constant,
-                                           .f[2] = (float)kernel_constant,
-                                           .f[3] = (float)kernel_constant,
-                                           .f[4] = (float)kernel_constant,
-                                           .f[5] = (float)kernel_constant,
-                                           .f[6] = (float)kernel_constant,
-                                           .f[7] = (float)kernel_constant};
-
-static const vector kernel_igamma3_vec = {.f[0] = (float)kernel_igamma3,
-                                          .f[1] = (float)kernel_igamma3,
-                                          .f[2] = (float)kernel_igamma3,
-                                          .f[3] = (float)kernel_igamma3,
-                                          .f[4] = (float)kernel_igamma3,
-                                          .f[5] = (float)kernel_igamma3,
-                                          .f[6] = (float)kernel_igamma3,
-                                          .f[7] = (float)kernel_igamma3};
-
-static const vector kernel_igamma4_vec = {.f[0] = (float)kernel_igamma4,
-                                          .f[1] = (float)kernel_igamma4,
-                                          .f[2] = (float)kernel_igamma4,
-                                          .f[3] = (float)kernel_igamma4,
-                                          .f[4] = (float)kernel_igamma4,
-                                          .f[5] = (float)kernel_igamma4,
-                                          .f[6] = (float)kernel_igamma4,
-                                          .f[7] = (float)kernel_igamma4};
+static const vector kernel_igamma_vec = {FILL_VEC((float)kernel_igamma)};
+
+static const vector kernel_ivals_vec = {FILL_VEC((float)kernel_ivals)};
+
+static const vector kernel_constant_vec = {FILL_VEC((float)kernel_constant)};
+
+static const vector kernel_igamma3_vec = {FILL_VEC((float)kernel_igamma3)};
+
+static const vector kernel_igamma4_vec = {FILL_VEC((float)kernel_igamma4)};
+
 __attribute__((always_inline))
     INLINE static void kernel_deval_vec(vector *u, vector *w, vector *dw_dx) {
 
-- 
GitLab