Bridge++  Ver. 2.0.2
vsimd_double-inc.h
Go to the documentation of this file.
1 
10 #ifndef QXS_VSIMD_INCLUDED
11 #define QXS_VSIMD_INCLUDED
12 
13 typedef struct
14 {
15  double v[VLEND];
16 } Vsimd_t;
17 
18 #ifdef __ARM_FEATURE_SVE
19 #include <arm_sve.h>
20 
21 typedef svfloat64_t svreal_t;
22 
23 typedef svint64_t svint_t;
24 
25 typedef svuint64_t svuint_t;
26 
27 typedef int64_t int_t;
28 
29 typedef uint64_t uint_t;
30 
31 namespace {
32  inline svbool_t set_predicate()
33  {
34  return svptrue_b64();
35  }
36 
37 
38  inline svbool_t set_predicate_false()
39  {
40  return svpfalse();
41  }
42 
43 
44  inline svbool_t set_predicate_whilelt(int range)
45  {
46  return svwhilelt_b64(0, range);
47  }
48 
49 
50  inline void set_predicate_xp(svbool_t& pg1, svbool_t& pg2)
51  {
52  svbool_t pg0 = svptrue_b64();
53  pg2 = svpfalse();
54  for (int iy = VLENYD; iy > 0; --iy) {
55  pg1 = svwhilelt_b64(0, iy * VLENXD);
56  pg2 = sveor_z(pg0, pg2, pg1);
57  pg1 = svwhilelt_b64(0, iy * VLENXD - 1);
58  pg2 = sveor_z(pg0, pg2, pg1);
59  }
60  pg1 = svnot_z(pg0, pg2);
61  }
62 
63 
64  inline void set_predicate_xm(svbool_t& pg1, svbool_t& pg2)
65  {
66  svbool_t pg0 = svptrue_b64();
67  pg2 = svwhilelt_b64(0, VLEND - VLENXD + 1);
68  for (int iy = VLENYD - 1; iy > 0; --iy) {
69  pg1 = svwhilelt_b64(0, iy * VLENXD);
70  pg2 = sveor_z(pg0, pg2, pg1);
71  pg1 = svwhilelt_b64(0, (iy - 1) * VLENXD + 1);
72  pg2 = sveor_z(pg0, pg2, pg1);
73  }
74  pg1 = svnot_z(pg0, pg2);
75  }
76 
77 
78  inline void set_predicate_xp_eo(svbool_t& pg1, svbool_t& pg2,
79  svbool_t& pg3, int ieo)
80  {
81  svbool_t pg0 = svptrue_b64();
82  pg2 = svpfalse();
83  pg3 = svpfalse();
84  for (int iy = VLENYD; iy > 0; --iy) {
85  if (iy % 2 == ieo) {
86  pg1 = svwhilelt_b64(0, iy * VLENXD);
87  pg2 = sveor_z(pg0, pg2, pg1);
88  pg1 = svwhilelt_b64(0, iy * VLENXD - 1);
89  pg2 = sveor_z(pg0, pg2, pg1);
90  } else {
91  pg1 = svwhilelt_b64(0, iy * VLENXD);
92  pg3 = sveor_z(pg0, pg3, pg1);
93  pg1 = svwhilelt_b64(0, (iy - 1) * VLENXD);
94  pg3 = sveor_z(pg0, pg3, pg1);
95  }
96  }
97  pg1 = sveor_z(pg0, pg2, pg3);
98  pg1 = svnot_z(pg0, pg1);
99  }
100 
101 
102  inline void set_predicate_xm_eo(svbool_t& pg1, svbool_t& pg2,
103  svbool_t& pg3, int ieo)
104  {
105  svbool_t pg0 = svptrue_b64();
106  pg1 = svpfalse();
107  pg3 = svpfalse();
108  for (int iy = VLENYD; iy > 0; --iy) {
109  if (iy % 2 == ieo) {
110  pg2 = svwhilelt_b64(0, iy * VLENXD);
111  pg3 = sveor_z(pg0, pg3, pg2);
112  pg2 = svwhilelt_b64(0, (iy - 1) * VLENXD);
113  pg3 = sveor_z(pg0, pg3, pg2);
114  } else {
115  pg2 = svwhilelt_b64(0, iy * VLENXD);
116  pg1 = sveor_z(pg0, pg1, pg2);
117  pg2 = svwhilelt_b64(0, (iy - 1) * VLENXD + 1);
118  pg1 = sveor_z(pg0, pg1, pg2);
119  }
120  }
121  pg2 = sveor_z(pg0, pg1, pg3);
122  pg2 = svnot_z(pg0, pg2);
123  }
124 
125 
126  inline void set_predicate_yp(svbool_t& pg1, svbool_t& pg2)
127  {
128  svbool_t pg0 = svptrue_b64();
129  pg1 = svwhilelt_b64(0, VLENXD * (VLENYD - 1));
130  pg2 = svnot_z(pg0, pg1);
131  }
132 
133 
134  inline void set_predicate_ym(svbool_t& pg1, svbool_t& pg2)
135  {
136  svbool_t pg0 = svptrue_b64();
137  pg2 = svwhilelt_b64(0, VLENXD);
138  pg1 = svnot_z(pg0, pg2);
139  }
140 
141 
142  // Nitadori-san's implementation
143  inline void set1_at(const int i, svbool_t& pg)
144  {
145  svbool_t pg0 = svptrue_b64();
146  svbool_t pg1 = svwhilelt_b64(0, i);
147  svbool_t pg2 = svwhilelt_b64(0, i + 1);
148  pg = sveor_z(pg0, pg, pg1);
149  pg = sveor_z(pg0, pg, pg2);
150  }
151 
152 
153  inline void rot1_R(uint64_t *u, const int len = VLENXD)
154  {
155  uint64_t tmp = u[len - 1]; // tail
156  for (int i = len - 1; i >= 1; i--) {
157  u[i] = u[i - 1];
158  }
159  u[0] = tmp;
160  }
161 
162 
163  inline void rot1_L(uint64_t *u, const int len = VLENXD)
164  {
165  uint64_t tmp = u[0]; // head
166  for (int i = 0; i < len - 1; ++i) {
167  u[i] = u[i + 1];
168  }
169  u[len - 1] = tmp;
170  }
171 
172 
173  // Nitadori-san's implementation
174  inline void set_idx_predicate_xp_eo(svbool_t& pg,
175  svuint64_t& idx,
176  const int ieo)
177  {
178  uint64_t u[VLEN];
179  for (int i = 0; i < VLEN; ++i) {
180  u[i] = i;
181  }
182 
183  pg = svpfalse();
184  if (0 == ieo) {
185  // L-shift odd rows
186  for (int i = VLENXD; i < VLEN; i += 2 * VLENXD) {
187  set1_at(i, pg);
188  rot1_L(u + i, VLENXD);
189  }
190  }
191  if (1 == ieo) {
192  // L-shift env rows
193  for (int i = 0; i < VLEN; i += 2 * VLENXD) {
194  set1_at(i, pg);
195  rot1_L(u + i, VLENXD);
196  }
197  }
198  idx = svld1_u64(svptrue_b64(), u);
199  }
200 
201 
202  inline void set_idx_predicate_xm_eo(svbool_t& pg,
203  svuint64_t& idx,
204  const int ieo)
205  {
206  uint64_t u[VLEN];
207  for (int i = 0; i < VLEN; i++) {
208  u[i] = i;
209  }
210 
211  pg = svpfalse();
212  if (0 == ieo) {
213  // R-shift evn rows
214  for (int i = 0; i < VLEN; i += 2 * VLENXD) {
215  set1_at(i + VLENXD - 1, pg); // 3, 11
216  rot1_R(u + i, VLENXD);
217  }
218  }
219  if (1 == ieo) {
220  // R-shift odd rows
221  for (int i = VLENXD; i < VLEN; i += 2 * VLENXD) {
222  set1_at(i + VLENXD - 1, pg); // 7, 15
223  rot1_R(u + i, VLENXD);
224  }
225  }
226  idx = svld1_u64(svptrue_b64(), u);
227  }
228 
229 
230  inline void set_idx_predicate_yp(svbool_t& pg1, svuint64_t& idx)
231  {
232  pg1 = svwhilelt_b64(0, VLENXD);
233  uint64_t u[VLEND];
234  for (int i = 0; i < VLENXD * (VLENYD - 1); ++i) {
235  u[i] = i + VLENXD;
236  }
237  for (int i = 0; i < VLENXD; ++i) {
238  u[i + VLENXD * (VLENYD - 1)] = i;
239  }
240  idx = svld1_u64(svptrue_b64(), u);
241  }
242 
243 
244  inline void set_idx_predicate_ym(svbool_t& pg1, svuint64_t& idx)
245  {
246  svbool_t pg2 = svwhilelt_b64(0, VLENXD * (VLENYD - 1));
247  pg1 = svnot_z(svptrue_b64(), pg2);
248  uint64_t u[VLEND];
249  for (int i = 0; i < VLENXD; ++i) {
250  u[i] = i + VLENXD * (VLENYD - 1);
251  }
252  for (int i = VLENXD; i < VLEND; ++i) {
253  u[i] = i - VLENXD;
254  }
255  idx = svld1_u64(svptrue_b64(), u);
256  }
257 
258 
259  inline void load_vec(svbool_t pg, svfloat64_t& v, const float64_t *vp)
260  {
261  v = svld1_f64(pg, vp);
262  }
263 
264 
265  inline void load_add(svbool_t pg, svfloat64_t& v, float64_t *vp)
266  {
267  svfloat64_t v2;
268  v2 = svld1_f64(pg, vp);
269  v = svsel_f64(pg, v2, v);
270  // v = svmul_m(pg, v, 0.0);
271  // v = svadd_m(pg, v, v2);
272  }
273 
274 
275  inline void set_vec(svbool_t pg, svfloat64_t& v, float64_t a)
276  {
277  v = svdup_f64_m(v, pg, a);
278  }
279 
280 
281  inline void clear_vec(svbool_t pg, svfloat64_t& v)
282  {
283  v = svdup_f64_m(v, pg, 0.0);
284  }
285 
286 
287  inline void load_svint(svbool_t pg, svint64_t& v, int64_t *vp)
288  {
289  v = svld1_s64(pg, vp);
290  }
291 
292 
293  inline void load_svuint(svbool_t pg, svuint64_t& v, uint64_t *vp)
294  {
295  v = svld1_u64(pg, vp);
296  }
297 
298 
299  inline void load_vec_gather(svbool_t pg, svfloat64_t& v, float64_t *vp,
300  svint64_t index)
301  {
302  v = svld1_gather_s64index_f64(pg, vp, index);
303  }
304 
305 
306  inline void load_add_gather(svbool_t pg, svfloat64_t& v, float64_t *vp,
307  svint64_t index)
308  {
309  svfloat64_t v2;
310  v2 = svld1_gather_s64index_f64(pg, vp, index);
311  v = svsel_f64(pg, v2, v);
312  // v = svmul_m(pg, v, 0.0);
313  // v = svadd_m(pg, v, v2);
314  }
315 
316 
317  inline void flip_sign(svbool_t pg, svfloat64_t& v)
318  {
319  v = svneg_f64_m(v, pg, v);
320  }
321 
322 
323  inline void flip_sign(svbool_t pg, svfloat64_t& v1, svfloat64_t& v2)
324  {
325  v1 = svneg_f64_m(v2, pg, v2);
326  }
327 }
328 
329 #endif // __ARM_FEATURE_SVE
330 
331 #endif
svuint_t
Usimd_t svuint_t
Definition: vsimd_double-inc.h:39
VLEND
#define VLEND
Definition: define_vlen.h:42
svint_t
Isimd_t svint_t
Definition: vsimd_double-inc.h:37
VLEN
#define VLEN
Definition: bridgeQXS_Clover_coarse_double.cpp:12
uint_t
unsigned int uint_t
Definition: vsimd_double-inc.h:13
Vsimd_t
Definition: vsimd_double-inc.h:13
int_t
int int_t
Definition: vsimd_double-inc.h:41
svreal_t
Vsimd_t svreal_t
Definition: vsimd_double-inc.h:35
AIndex_eo_qxs::idx
int idx(const int in, const int Nin, const int ist, const int Nx2, const int Ny, const int leo, const int Nvol2, const int ex)
Definition: aindex_eo.h:27
VLENXD
#define VLENXD
Definition: define_vlen.h:23
svbool_t
Definition: vsimd_double-inc.h:30
VLENYD
#define VLENYD
Definition: define_vlen.h:24