Bridge++  Ver. 2.0.2
vsimd_common_double-inc.h
Go to the documentation of this file.
1 
9 #ifndef QXS_VSIMD_COMMON_INCLUDED
10 #define QXS_VSIMD_COMMON_INCLUDED
11 
12 namespace {
13  inline svbool_t set_predicate()
14  {
15  svbool_t pg;
16  for (int i = 0; i < VLEN; ++i) {
17  pg.v[i] = true;
18  }
19  return pg;
20  }
21 
22 
23  inline svbool_t set_predicate_false()
24  {
25  svbool_t pg;
26  for (int i = 0; i < VLEN; ++i) {
27  pg.v[i] = false;
28  }
29  return pg;
30  }
31 
32 
33  inline svbool_t set_predicate_not(const svbool_t pg1)
34  {
35  svbool_t pg2;
36  for (int i = 0; i < VLEN; ++i) {
37  if (pg1.v[i] == true) {
38  pg2.v[i] = false;
39  } else {
40  pg2.v[i] = true;
41  }
42  }
43  return pg2;
44  }
45 
46 
47  inline svbool_t sveor_z(svbool_t pg, svbool_t pg1, svbool_t pg2)
48  {
49  svbool_t pg3;
50  for (int i = 0; i < VLEN; ++i) {
51  pg3.v[i] = pg1.v[i] ^ pg2.v[i];
52  }
53  return pg3;
54  }
55 
56 
57  inline void set_predicate_xp(svbool_t& pg1, svbool_t& pg2)
58  {
59  for (int k = 0; k < VLEN; ++k) {
60  pg1.v[k] = true;
61  pg2.v[k] = false;
62  }
63  for (int iy = 0; iy < VLENY; ++iy) {
64  pg1.v[VLENX - 1 + VLENX * iy] = false;
65  pg2.v[VLENX - 1 + VLENX * iy] = true;
66  }
67  }
68 
69 
70  inline void set_predicate_xm(svbool_t& pg1, svbool_t& pg2)
71  {
72  for (int k = 0; k < VLEN; ++k) {
73  pg1.v[k] = true;
74  pg2.v[k] = false;
75  }
76  for (int iy = 0; iy < VLENY; ++iy) {
77  pg1.v[VLENX * iy] = false;
78  pg2.v[VLENX * iy] = true;
79  }
80  }
81 
82 
83  inline void set_predicate_xp_eo(svbool_t& pg1, svbool_t& pg2,
84  svbool_t& pg3, int ieo)
85  {
86  for (int k = 0; k < VLEN; ++k) {
87  pg1.v[k] = false;
88  pg2.v[k] = false;
89  pg3.v[k] = false;
90  }
91  for (int iy = 0; iy < VLENY; ++iy) {
92  if (iy % 2 != ieo) {
93  for (int ix = 0; ix < VLENX - 1; ++ix) {
94  pg1.v[ix + VLENX * iy] = true;
95  }
96  pg2.v[VLENX - 1 + VLENX * iy] = true;
97  } else {
98  for (int ix = 0; ix < VLENX; ++ix) {
99  pg3.v[ix + VLENX * iy] = true;
100  }
101  }
102  }
103  }
104 
105 
106  inline void set_predicate_xm_eo(svbool_t& pg1, svbool_t& pg2,
107  svbool_t& pg3, int ieo)
108  {
109  for (int k = 0; k < VLEN; ++k) {
110  pg1.v[k] = false;
111  pg2.v[k] = false;
112  pg3.v[k] = false;
113  }
114  for (int iy = 0; iy < VLENY; ++iy) {
115  if (iy % 2 != ieo) {
116  for (int ix = 0; ix < VLENX; ++ix) {
117  pg3.v[ix + VLENX * iy] = true;
118  }
119  } else {
120  for (int ix = 1; ix < VLENX; ++ix) {
121  pg1.v[ix + VLENX * iy] = true;
122  }
123  pg2.v[0 + VLENX * iy] = true;
124  }
125  }
126  }
127 
128 
129  inline void set_predicate_yp(svbool_t& pg1, svbool_t& pg2)
130  {
131  for (int k = 0; k < VLEN; ++k) {
132  pg1.v[k] = true;
133  pg2.v[k] = false;
134  }
135  for (int ix = 0; ix < VLENX; ++ix) {
136  pg1.v[ix + VLENX * (VLENY - 1)] = false;
137  pg2.v[ix + VLENX * (VLENY - 1)] = true;
138  }
139  }
140 
141 
142  inline void set_predicate_ym(svbool_t& pg1, svbool_t& pg2)
143  {
144  for (int k = 0; k < VLEN; ++k) {
145  pg1.v[k] = true;
146  pg2.v[k] = false;
147  }
148  for (int ix = 0; ix < VLENX; ++ix) {
149  pg1.v[ix] = false;
150  pg2.v[ix] = true;
151  }
152  }
153 
154 
155  inline void set_index_xp(svint_t& svindex_xp)
156  {
157  for (int iy = 0; iy < VLENY; ++iy) {
158  svindex_xp.v[VLENX - 1 + VLENX * iy] = iy;
159  for (int ix = 0; ix < VLENX - 1; ++ix) {
160  svindex_xp.v[ix + VLENX * iy] = 0;
161  }
162  }
163  }
164 
165 
166  inline void set_index_xm(svint_t& svindex_xm)
167  {
168  for (int iy = 0; iy < VLENY; ++iy) {
169  svindex_xm.v[VLENX * iy] = iy;
170  for (int ix = 1; ix < VLENX; ++ix) {
171  svindex_xm.v[ix + VLENX * iy] = 0;
172  }
173  }
174  }
175 
176 
177  inline void set_index_xp_eo(svint_t& svindex_xp)
178  {
179  for (int iy = 0; iy < VLENY; ++iy) {
180  svindex_xp.v[VLENX - 1 + VLENX * iy] = iy / 2;
181  for (int ix = 0; ix < VLENX - 1; ++ix) {
182  svindex_xp.v[ix + VLENX * iy] = 0;
183  }
184  }
185  }
186 
187 
188  inline void set_index_xm_eo(svint_t& svindex_xm)
189  {
190  for (int iy = 0; iy < VLENY; ++iy) {
191  svindex_xm.v[VLENX * iy] = iy / 2;
192  for (int ix = 1; ix < VLENX; ++ix) {
193  svindex_xm.v[ix + VLENX * iy] = 0;
194  }
195  }
196  }
197 
198 
199  inline void set_index_xp_eo(svuint_t& svindex_xp)
200  {
201  for (int iy = 0; iy < VLENY; ++iy) {
202  svindex_xp.v[VLENX - 1 + VLENX * iy] = iy / 2;
203  for (int ix = 0; ix < VLENX - 1; ++ix) {
204  svindex_xp.v[ix + VLENX * iy] = 0;
205  }
206  }
207  }
208 
209 
210  inline void set_index_xm_eo(svuint_t& svindex_xm)
211  {
212  for (int iy = 0; iy < VLENY; ++iy) {
213  svindex_xm.v[VLENX * iy] = iy / 2;
214  for (int ix = 1; ix < VLENX; ++ix) {
215  svindex_xm.v[ix + VLENX * iy] = 0;
216  }
217  }
218  }
219 
220 
221  inline void set_index_yp(svint_t& svindex_yp)
222  {
223  for (int ix = 0; ix < VLENX; ++ix) {
224  for (int iy = 0; iy < VLENY - 1; ++iy) {
225  svindex_yp.v[ix + VLENX * iy] = 0;
226  }
227  svindex_yp.v[ix + VLENX * (VLENY - 1)] = ix;
228  }
229  }
230 
231 
232  inline void set_index_ym(svint_t& svindex_ym)
233  {
234  for (int ix = 0; ix < VLENX; ++ix) {
235  svindex_ym.v[ix] = ix;
236  for (int iy = 1; iy < VLENY; ++iy) {
237  svindex_ym.v[ix + VLENX * iy] = 0;
238  }
239  }
240  }
241 
242 
243 // to be discarded
244  template<typename REALTYPE>
245  inline void load_vec(Vsimd_t *vt, REALTYPE *vp, int Nin)
246  {
247  for (int in = 0; in < Nin; ++in) {
248  for (int k = 0; k < VLEN; ++k) {
249  vt[in].v[k] = vp[k + VLEN * in];
250  }
251  }
252  }
253 
254 
255  template<typename REALTYPE>
256  inline void load_vec(svbool_t pg, Vsimd_t& vt, REALTYPE *vp)
257  {
258  for (int k = 0; k < VLEN; ++k) {
259  if (pg.v[k]) {
260  vt.v[k] = vp[k];
261  } else {
262  vt.v[k] = 0.0;
263  }
264  }
265  }
266 
267 
268  template<typename REALTYPE>
269  inline void load_vec_gather(svbool_t pg, Vsimd_t& v, REALTYPE *vp,
270  svint_t index)
271  {
272  for (int k = 0; k < VLEN; ++k) {
273  if (pg.v[k]) v.v[k] = vp[index.v[k]];
274  }
275  }
276 
277 
278  template<typename REALTYPE>
279  inline void save_vec_scatter(svbool_t pg, REALTYPE *vp, Vsimd_t& vt,
280  svint_t index)
281  {
282  for (int k = 0; k < VLEN; ++k) {
283  if (pg.v[k]) vp[index.v[k]] = vt.v[k];
284  }
285  }
286 
287 
288  template<typename REALTYPE>
289  inline void load_add(svbool_t pg, Vsimd_t& vt, REALTYPE *vp)
290  {
291  for (int k = 0; k < VLEN; ++k) {
292  if (pg.v[k]) vt.v[k] = vp[k];
293  }
294  }
295 
296 
297  template<typename REALTYPE>
298  inline void load_add_gather(svbool_t pg, Vsimd_t& v, REALTYPE *vp,
299  Isimd_t& index)
300  {
301  for (int k = 0; k < VLEN; ++k) {
302  if (pg.v[k]) v.v[k] = vp[index.v[k]];
303  }
304  }
305 
306 
307  template<typename REALTYPE>
308  inline void load_add_gather(svbool_t pg, Vsimd_t& vt, REALTYPE *vp,
309  Usimd_t& index, int skip)
310  {
311  for (int k = 0; k < VLEN; ++k) {
312  if (pg.v[k]) vt.v[k] = vp[index.v[k]];
313  }
314  }
315 
316 
317  template<typename REALTYPE>
318  inline void load_vec1_x(REALTYPE *vt, REALTYPE *v, int kx, int Nin)
319  {
320  for (int in = 0; in < Nin; ++in) {
321  for (int ky = 0; ky < VLENY; ++ky) {
322  vt[ky + VLENY * in] = v[kx + VLENX * ky + VLEN * in];
323  }
324  }
325  }
326 
327 
328  template<typename REALTYPE>
329  inline void load_vec1_y(REALTYPE *vt, REALTYPE *v, int ky, int Nin)
330  {
331  for (int in = 0; in < Nin; ++in) {
332  for (int kx = 0; kx < VLENX; ++kx) {
333  vt[kx + VLENX * in] = v[kx + VLENX * ky + VLEN * in];
334  }
335  }
336  }
337 
338 
339  template<typename REALTYPE>
340  inline void save_vec(REALTYPE *x, Vsimd_t *vt, int Nin)
341  {
342  for (int in = 0; in < Nin; ++in) {
343  for (int k = 0; k < VLEN; ++k) {
344  x[k + VLEN * in] = vt[in].v[k];
345  }
346  }
347  }
348 
349 
350  template<typename REALTYPE>
351  inline void save_vec(svbool_t pg, REALTYPE *x, Vsimd_t& vt)
352  {
353  for (int k = 0; k < VLEN; ++k) {
354  if (pg.v[k]) x[k] = vt.v[k];
355  }
356  }
357 
358 
359  template<typename REALTYPE>
360  inline void svst1_scatter_index(svbool_t pg, REALTYPE *x,
361  Isimd_t index, Vsimd_t& vt)
362  {
363  for (int k = 0; k < VLEN; ++k) {
364  if (pg.v[k]) x[index.v[k]] = vt.v[k];
365  }
366  }
367 
368 
369  template<typename REALTYPE>
370  inline void save_vec1_x(REALTYPE *x, Vsimd_t *vt, int kx, int Nin)
371  {
372  for (int in = 0; in < Nin; ++in) {
373  for (int ky = 0; ky < VLENY; ++ky) {
374  x[ky + VLENY * in] = vt[in].v[kx + VLENX * ky];
375  }
376  }
377  }
378 
379 
380  template<typename REALTYPE>
381  inline void save_vec1_y(REALTYPE *x, Vsimd_t *vt, int ky, int Nin)
382  {
383  for (int in = 0; in < Nin; ++in) {
384  for (int kx = 0; kx < VLENX; ++kx) {
385  x[kx + VLENX * in] = vt[in].v[kx + VLENX * ky];
386  }
387  }
388  }
389 
390 
391  template<typename REALTYPE>
392  inline void shift_vec(svbool_t pg, svuint_t idx,
393  svreal_t& v, REALTYPE *xc, REALTYPE *xn)
394  {
395  svreal_t vt;
396  for (int k = 0; k < VLEN; ++k) {
397  if (pg.v[k]) {
398  vt.v[k] = xn[k];
399  } else {
400  vt.v[k] = xc[k];
401  }
402  }
403  for (int k = 0; k < VLEN; ++k) {
404  v.v[k] = vt.v[idx.v[k]];
405  }
406  }
407 
408 
409  template<typename REALTYPE>
410  inline void shift_vec_xbw(svbool_t& pg1, svbool_t& pg2,
411  svreal_t& v, REALTYPE *wx, REALTYPE *wn)
412  {
413  load_vec(pg1, v, &wx[1]);
414  load_add(pg2, v, &wn[-VLENX + 1]);
415  }
416 
417 
418  template<typename REALTYPE>
419  inline void shift_vec_xbw(svbool_t& pg1, svbool_t& pg2, svbool_t& pg3,
420  svreal_t& v, REALTYPE *wx, REALTYPE *wn)
421  {
422  load_vec(pg3, v, &wx[0]);
423  load_add(pg1, v, &wx[1]);
424  load_add(pg2, v, &wn[-VLENX + 1]);
425  }
426 
427 
428  template<typename REALTYPE>
429  inline void shift_vec_xfw(svbool_t& pg1, svbool_t& pg2,
430  svreal_t& v, REALTYPE *wx, REALTYPE *wn)
431  {
432  load_vec(pg1, v, &wx[-1]);
433  load_add(pg2, v, &wn[VLENX - 1]);
434  }
435 
436 
437  template<typename REALTYPE>
438  inline void shift_vec_xfw(svbool_t& pg1, svbool_t& pg2, svbool_t& pg3,
439  svreal_t& v, REALTYPE *wx, REALTYPE *wn)
440  {
441  load_vec(pg3, v, &wx[0]);
442  load_add(pg1, v, &wx[-1]);
443  load_add(pg2, v, &wn[VLENX - 1]);
444  }
445 
446 
447  template<typename REALTYPE>
448  inline void shift_vec_ybw(svbool_t& pg1, svbool_t& pg2,
449  svreal_t& v, REALTYPE *wx, REALTYPE *wn)
450  {
451  load_vec(pg1, v, &wx[VLENX]);
452  load_add(pg2, v, &wn[-VLENX * (VLENY - 1)]);
453  }
454 
455 
456  template<typename REALTYPE>
457  inline void shift_vec_yfw(svbool_t& pg1, svbool_t& pg2,
458  svreal_t& v, REALTYPE *wx, REALTYPE *wn)
459  {
460  load_vec(pg1, v, &wx[-VLENX]);
461  load_add(pg2, v, &wn[VLENX * (VLENY - 1)]);
462  }
463 
464 
465  template<typename REALTYPE>
466  inline void shift_vec_ybw(svreal_t& v, REALTYPE *wx, REALTYPE *wn)
467  {
468  for (int k = 0; k < VLEN - VLENX; ++k) {
469  v.v[k] = wx[k + VLENX];
470  }
471  for (int k = 0; k < VLENX; ++k) {
472  v.v[k + VLEN - VLENX] = wn[k];
473  }
474  }
475 
476 
477  template<typename REALTYPE>
478  inline void shift_vec_yfw(svreal_t& v, REALTYPE *wx, REALTYPE *wn)
479  {
480  for (int k = 0; k < VLENX; ++k) {
481  v.v[k] = wn[VLEN - VLENX + k];
482  }
483  for (int k = VLENX; k < VLEN; ++k) {
484  v.v[k] = wx[k - VLENX];
485  }
486  }
487 
488 
489  inline void clear_vec(svbool_t pg, Vsimd_t& vt)
490  {
491  for (int k = 0; k < VLEN; ++k) {
492  if (pg.v[k]) vt.v[k] = 0.0;
493  }
494  }
495 
496 
497  //to be discarded
498  inline void clear_vec(Vsimd_t *vt, int Nin)
499  {
500  for (int in = 0; in < Nin; ++in) {
501  for (int k = 0; k < VLEN; ++k) {
502  vt[in].v[k] = 0.0;
503  }
504  }
505  }
506 
507 
508 // to be discarded
509  template<typename REALTYPE>
510  inline void add_vec(REALTYPE *x, Vsimd_t *vt, int Nin)
511  {
512  for (int in = 0; in < Nin; ++in) {
513  for (int k = 0; k < VLEN; ++k) {
514  x[k + VLEN * in] += vt[in].v[k];
515  }
516  }
517  }
518 
519 
520 // to be discarded
521  inline void add_vec(Vsimd_t *x, Vsimd_t *y, int Nin)
522  {
523  for (int in = 0; in < Nin; ++in) {
524  for (int k = 0; k < VLEN; ++k) {
525  x[in].v[k] += y[in].v[k];
526  }
527  }
528  }
529 
530 
531  inline void add_vec(svbool_t pg, Vsimd_t& x, Vsimd_t& y)
532  {
533  for (int k = 0; k < VLEN; ++k) {
534  if (pg.v[k]) x.v[k] += y.v[k];
535  }
536  }
537 
538 
539  inline void add_vec(svbool_t pg, Vsimd_t& z, Vsimd_t& x, Vsimd_t& y)
540  {
541  for (int k = 0; k < VLEN; ++k) {
542  if (pg.v[k]) z.v[k] = x.v[k] + y.v[k];
543  }
544  }
545 
546 
547  inline void sub_vec(svbool_t pg, Vsimd_t& x, Vsimd_t& y)
548  {
549  for (int k = 0; k < VLEN; ++k) {
550  if (pg.v[k]) x.v[k] -= y.v[k];
551  }
552  }
553 
554 
555  inline void sub_vec(svbool_t pg, Vsimd_t& z, Vsimd_t& x, Vsimd_t& y)
556  {
557  for (int k = 0; k < VLEN; ++k) {
558  if (pg.v[k]) z.v[k] = x.v[k] - y.v[k];
559  }
560  }
561 
562 
563  inline void mul_vec(svbool_t pg, Vsimd_t& w, Vsimd_t& x, Vsimd_t& y)
564  {
565  for (int k = 0; k < VLEN; ++k) {
566  if (pg.v[k]) w.v[k] = x.v[k] * y.v[k];
567  }
568  }
569 
570 
571  inline void copy_vec(Vsimd_t *x, Vsimd_t *y, int Nin)
572  {
573  for (int in = 0; in < Nin; ++in) {
574  for (int k = 0; k < VLEN; ++k) {
575  x[in].v[k] = y[in].v[k];
576  }
577  }
578  }
579 
580 
581 // to be discarded
582  template<typename REALTYPE>
583  inline void set_vec(Vsimd_t *x, REALTYPE a, Vsimd_t *y, int Nin)
584  {
585  for (int in = 0; in < Nin; ++in) {
586  for (int k = 0; k < VLEN; ++k) {
587  x[in].v[k] = a * y[in].v[k];
588  }
589  }
590  }
591 
592 
593  template<typename REALTYPE>
594  inline void set_vec(svbool_t pg, Vsimd_t& x, REALTYPE a)
595  {
596  for (int k = 0; k < VLEN; ++k) {
597  if (pg.v[k]) x.v[k] = a;
598  }
599  }
600 
601 
602 // to be discarded
603  template<typename REALTYPE>
604  inline void axpy_vec(Vsimd_t *y, REALTYPE a, Vsimd_t *x, int Nin)
605  {
606  for (int in = 0; in < Nin; ++in) {
607  for (int k = 0; k < VLEN; ++k) {
608  y[in].v[k] += a * x[in].v[k];
609  }
610  }
611  }
612 
613 
614  template<typename REALTYPE>
615  inline void axpy_vec(svbool_t pg, Vsimd_t& y, REALTYPE a, Vsimd_t& x)
616  {
617  for (int k = 0; k < VLEN; ++k) {
618  if (pg.v[k]) y.v[k] += a * x.v[k];
619  }
620  }
621 
622 
623  inline void axpy_vec(svbool_t pg, Vsimd_t& y, Vsimd_t& a, Vsimd_t& x)
624  {
625  for (int k = 0; k < VLEN; ++k) {
626  if (pg.v[k]) y.v[k] += a.v[k] * x.v[k];
627  }
628  }
629 
630 
631  inline void ymax_vec(svbool_t pg, Vsimd_t& y, Vsimd_t& a, Vsimd_t& x)
632  {
633  for (int k = 0; k < VLEN; ++k) {
634  if (pg.v[k]) y.v[k] -= a.v[k] * x.v[k];
635  }
636  }
637 
638 
639 // to be discarded
640  template<typename REALTYPE>
641  inline void aypx_vec(REALTYPE a, Vsimd_t *x, Vsimd_t *y, int Nin)
642  {
643  for (int in = 0; in < Nin; ++in) {
644  for (int k = 0; k < VLEN; ++k) {
645  x[in].v[k] = a * x[in].v[k] + y[in].v[k];
646  }
647  }
648  }
649 
650 
651  template<typename REALTYPE>
652  inline void aypx_vec(svbool_t pg, REALTYPE a, Vsimd_t& x, Vsimd_t& y)
653  {
654  for (int k = 0; k < VLEN; ++k) {
655  if (pg.v[k]) x.v[k] = a * x.v[k] + y.v[k];
656  }
657  }
658 
659 
660  template<typename REALTYPE>
661  inline void scal_vec(svbool_t pg, Vsimd_t& x, REALTYPE a)
662  {
663  for (int k = 0; k < VLEN; ++k) {
664  if (pg.v[k]) x.v[k] *= a;
665  }
666  }
667 
668 
669  inline void scal_vec(svbool_t pg, Vsimd_t& x, Vsimd_t& a)
670  {
671  for (int k = 0; k < VLEN; ++k) {
672  if (pg.v[k]) x.v[k] *= a.v[k];
673  }
674  }
675 
676 
677 // to be discarded
678  template<typename REALTYPE>
679  inline void scal_vec(Vsimd_t *x, REALTYPE a, int Nin)
680  {
681  for (int in = 0; in < Nin; ++in) {
682  for (int k = 0; k < VLEN; ++k) {
683  x[in].v[k] *= a;
684  }
685  }
686  }
687 
688 
689  template<typename REALTYPE>
690  inline void dot_vec(REALTYPE& a, Vsimd_t *x, Vsimd_t *y, int Nin)
691  {
692  a = REALTYPE(0.0);
693  for (int in = 0; in < Nin; ++in) {
694  for (int k = 0; k < VLEN; ++k) {
695  a += x[in].v[k] * y[in].v[k];
696  }
697  }
698  }
699 
700 
701  template<typename REALTYPE>
702  inline void norm2_vec(REALTYPE& a, Vsimd_t *x, int Nin)
703  {
704  a = REALTYPE(0.0);
705  for (int in = 0; in < Nin; ++in) {
706  for (int k = 0; k < VLEN; ++k) {
707  a += x[in].v[k] * x[in].v[k];
708  }
709  }
710  }
711 
712 
713 // to be discarded
714  template<typename REALTYPE>
715  inline void reduce_vec(REALTYPE& a, Vsimd_t *x, int Nin)
716  {
717  a = REALTYPE(0.0);
718  for (int in = 0; in < Nin; ++in) {
719  for (int k = 0; k < VLEN; ++k) {
720  a += x[in].v[k];
721  }
722  }
723  }
724 
725 
726  template<typename REALTYPE>
727  inline void reduce_vec(svbool_t pg, REALTYPE& a, Vsimd_t& x)
728  {
729  a = REALTYPE(0.0);
730  for (int k = 0; k < VLEN; ++k) {
731  if (pg.v[k]) a += x.v[k];
732  }
733  }
734 
735 
736 // to be discarded
737  inline void add_norm2_vec(Vsimd_t *y, Vsimd_t *x, int Nin)
738  {
739  for (int in = 0; in < Nin; ++in) {
740  for (int k = 0; k < VLEN; ++k) {
741  y[in].v[k] += x[in].v[k] * x[in].v[k];
742  }
743  }
744  }
745 
746 
747  inline void add_norm2_vec(svbool_t pg, Vsimd_t& y, Vsimd_t& x)
748  {
749  for (int k = 0; k < VLEN; ++k) {
750  if (pg.v[k]) y.v[k] += x.v[k] * x.v[k];
751  }
752  }
753 
754 
755 // to be discaeded
756  inline void add_dot_vec(Vsimd_t *y, Vsimd_t *x, Vsimd_t *w, int Nin)
757  {
758  for (int in = 0; in < Nin; ++in) {
759  for (int k = 0; k < VLEN; ++k) {
760  y[in].v[k] += x[in].v[k] * w[in].v[k];
761  }
762  }
763  }
764 
765 
766  inline void add_dot_vec(svbool_t pg, Vsimd_t& y, Vsimd_t& x, Vsimd_t& w)
767  {
768  for (int k = 0; k < VLEN; ++k) {
769  if (pg.v[k]) y.v[k] += x.v[k] * w.v[k];
770  }
771  }
772 
773 
774 // to be discarded
775  inline void sub_dot_vec(Vsimd_t *y, Vsimd_t *x, Vsimd_t *w, int Nin)
776  {
777  for (int in = 0; in < Nin; ++in) {
778  for (int k = 0; k < VLEN; ++k) {
779  y[in].v[k] -= x[in].v[k] * w[in].v[k];
780  }
781  }
782  }
783 
784 
785  inline void sub_dot_vec(svbool_t pg, Vsimd_t& y, Vsimd_t& x, Vsimd_t& w)
786  {
787  for (int k = 0; k < VLEN; ++k) {
788  if (pg.v[k]) y.v[k] -= x.v[k] * w.v[k];
789  }
790  }
791 
792 
793  template<typename REALTYPE>
794  inline void shift_vec0_xbw(REALTYPE *v, REALTYPE *w, int Nin)
795  {
796  for (int in = 0; in < Nin; ++in) {
797  for (int kx = 0; kx < VLENX - 1; ++kx) {
798  for (int ky = 0; ky < VLENY; ++ky) {
799  v[kx + VLENX * ky + VLEN * in] = w[kx + 1 + VLENX * ky + VLEN * in];
800  }
801  }
802  int kx = VLENX - 1;
803  for (int ky = 0; ky < VLENY; ++ky) {
804  v[kx + VLENX * ky + VLEN * in] = 0.0;
805  }
806  }
807  }
808 
809 
810  template<typename REALTYPE>
811  inline void shift_vec0_xfw(REALTYPE *v, REALTYPE *w, int Nin)
812  {
813  for (int in = 0; in < Nin; ++in) {
814  for (int kx = 1; kx < VLENX; ++kx) {
815  for (int ky = 0; ky < VLENY; ++ky) {
816  v[kx + VLENX * ky + VLEN * in] = w[kx - 1 + VLENX * ky + VLEN * in];
817  }
818  }
819  for (int ky = 0; ky < VLENY; ++ky) {
820  v[0 + VLENX * ky + VLEN * in] = 0.0;
821  }
822  }
823  }
824 
825 
826  template<typename REALTYPE>
827  inline void shift_vec0_ybw(REALTYPE *v, REALTYPE *w, int Nin)
828  {
829  for (int in = 0; in < Nin; ++in) {
830  for (int kx = 0; kx < VLENX; ++kx) {
831  for (int ky = 0; ky < VLENY - 1; ++ky) {
832  v[kx + VLENX * ky + VLEN * in] = w[kx + VLENX * (ky + 1) + VLEN * in];
833  }
834  }
835  int ky = VLENY - 1;
836  for (int kx = 0; kx < VLENX; ++kx) {
837  v[kx + VLENX * ky + VLEN * in] = 0.0;
838  }
839  }
840  }
841 
842 
843  template<typename REALTYPE>
844  inline void shift_vec0_yfw(REALTYPE *v, REALTYPE *w, int Nin)
845  {
846  for (int in = 0; in < Nin; ++in) {
847  for (int kx = 0; kx < VLENX; ++kx) {
848  for (int ky = 1; ky < VLENY; ++ky) {
849  v[kx + VLENX * ky + VLEN * in] = w[kx + VLENX * (ky - 1) + VLEN * in];
850  }
851  }
852  int ky = 0;
853  for (int kx = 0; kx < VLENX; ++kx) {
854  v[kx + VLENX * ky + VLEN * in] = 0.0;
855  }
856  }
857  }
858 
859 
860  template<typename REALTYPE>
861  inline void shift_vec1_xbw(Vsimd_t *x, REALTYPE *buf, int Nin)
862  {
863  for (int in = 0; in < Nin; ++in) {
864  for (int kx = 0; kx < VLENX - 1; ++kx) {
865  for (int ky = 0; ky < VLENY; ++ky) {
866  x[in].v[kx + VLENX * ky] = 0.0;
867  }
868  }
869  int kx = VLENX - 1;
870  for (int ky = 0; ky < VLENY; ++ky) {
871  x[in].v[kx + VLENX * ky] = buf[ky + VLENY * in];
872  }
873  }
874  }
875 
876 
877  template<typename REALTYPE>
878  inline void shift_vec1_xfw(Vsimd_t *x, REALTYPE *buf, int Nin)
879  {
880  for (int in = 0; in < Nin; ++in) {
881  for (int kx = 1; kx < VLENX; ++kx) {
882  for (int ky = 0; ky < VLENY; ++ky) {
883  x[in].v[kx + VLENX * ky] = 0.0;
884  }
885  }
886  for (int ky = 0; ky < VLENY; ++ky) {
887  x[in].v[0 + VLENX * ky] = buf[ky + VLENY * in];
888  }
889  }
890  }
891 
892 
893  template<typename REALTYPE>
894  inline void shift_vec1_ybw(Vsimd_t *v, REALTYPE *buf, int Nin)
895  {
896  for (int in = 0; in < Nin; ++in) {
897  for (int kx = 0; kx < VLENX; ++kx) {
898  for (int ky = 0; ky < VLENY - 1; ++ky) {
899  v[in].v[kx + VLENX * ky] = 0.0;
900  }
901  }
902  int ky = VLENY - 1;
903  for (int kx = 0; kx < VLENX; ++kx) {
904  v[in].v[kx + VLENX * ky] = buf[kx + VLENX * in];
905  }
906  }
907  }
908 
909 
910  template<typename REALTYPE>
911  inline void shift_vec1_yfw(Vsimd_t *v, REALTYPE *buf, int Nin)
912  {
913  for (int in = 0; in < Nin; ++in) {
914  for (int kx = 0; kx < VLENX; ++kx) {
915  for (int ky = 1; ky < VLENY; ++ky) {
916  v[in].v[kx + VLENX * ky] = 0.0;
917  }
918  }
919  int ky = 0;
920  for (int kx = 0; kx < VLENX; ++kx) {
921  v[in].v[kx + VLENX * ky] = buf[kx + VLENX * in];
922  }
923  }
924  }
925 
926 
927  template<typename REALTYPE>
928  inline void shift_vec2_xbw(REALTYPE *v, REALTYPE *w, REALTYPE *y, int Nin)
929  {
930  for (int in = 0; in < Nin; ++in) {
931  for (int kx = 0; kx < VLENX - 1; ++kx) {
932  for (int ky = 0; ky < VLENY; ++ky) {
933  v[kx + VLENX * ky + VLEN * in] = w[kx + 1 + VLENX * ky + VLEN * in];
934  }
935  }
936  int kx = VLENX - 1;
937  for (int ky = 0; ky < VLENY; ++ky) {
938  v[kx + VLENX * ky + VLEN * in] = y[0 + VLENX * ky + VLEN * in];
939  }
940  }
941  }
942 
943 
944  template<typename REALTYPE>
945  inline void shift_vec2_xfw(REALTYPE *v, REALTYPE *w, REALTYPE *y, int Nin)
946  {
947  for (int in = 0; in < Nin; ++in) {
948  for (int kx = 1; kx < VLENX; ++kx) {
949  for (int ky = 0; ky < VLENY; ++ky) {
950  v[kx + VLENX * ky + VLEN * in] = w[kx - 1 + VLENX * ky + VLEN * in];
951  }
952  }
953  for (int ky = 0; ky < VLENY; ++ky) {
954  v[0 + VLENX * ky + VLEN * in] = y[VLENX - 1 + VLENX * ky + VLEN * in];
955  }
956  }
957  }
958 
959 
960  template<typename REALTYPE>
961  inline void shift_vec2_xbw(Vsimd_t *v, REALTYPE *w, REALTYPE *y, int Nin)
962  {
963  for (int in = 0; in < Nin; ++in) {
964  for (int kx = 0; kx < VLENX - 1; ++kx) {
965  for (int ky = 0; ky < VLENY; ++ky) {
966  v[in].v[kx + VLENX * ky] = w[kx + 1 + VLENX * ky + VLEN * in];
967  }
968  }
969  int kx = VLENX - 1;
970  for (int ky = 0; ky < VLENY; ++ky) {
971  v[in].v[kx + VLENX * ky] = y[0 + VLENX * ky + VLEN * in];
972  }
973  }
974  }
975 
976 
977  template<typename REALTYPE>
978  inline void shift_vec2_xfw(Vsimd_t *v, REALTYPE *w, REALTYPE *y, int Nin)
979  {
980  for (int in = 0; in < Nin; ++in) {
981  for (int kx = 1; kx < VLENX; ++kx) {
982  for (int ky = 0; ky < VLENY; ++ky) {
983  v[in].v[kx + VLENX * ky] = w[kx - 1 + VLENX * ky + VLEN * in];
984  }
985  }
986  for (int ky = 0; ky < VLENY; ++ky) {
987  v[in].v[0 + VLENX * ky] = y[VLENX - 1 + VLENX * ky + VLEN * in];
988  }
989  }
990  }
991 
992 
993  template<typename REALTYPE>
994  inline void shift_vec2_ybw(REALTYPE *v, REALTYPE *w, REALTYPE *y, int Nin)
995  {
996  for (int in = 0; in < Nin; ++in) {
997  for (int kx = 0; kx < VLENX; ++kx) {
998  for (int ky = 0; ky < VLENY - 1; ++ky) {
999  v[kx + VLENX * ky + VLEN * in] = w[kx + VLENX * (ky + 1) + VLEN * in];
1000  }
1001  }
1002  int ky = VLENY - 1;
1003  for (int kx = 0; kx < VLENX; ++kx) {
1004  v[kx + VLENX * ky + VLEN * in] = y[kx + VLENX * 0 + VLEN * in];
1005  }
1006  }
1007  }
1008 
1009 
1010  template<typename REALTYPE>
1011  inline void shift_vec2_yfw(REALTYPE *v, REALTYPE *w, REALTYPE *y, int Nin)
1012  {
1013  for (int in = 0; in < Nin; ++in) {
1014  for (int kx = 0; kx < VLENX; ++kx) {
1015  for (int ky = 1; ky < VLENY; ++ky) {
1016  v[kx + VLENX * ky + VLEN * in] = w[kx + VLENX * (ky - 1) + VLEN * in];
1017  }
1018  }
1019  int ky = 0;
1020  for (int kx = 0; kx < VLENX; ++kx) {
1021  v[kx + VLENX * ky + VLEN * in] = y[kx + VLENX * (VLENY - 1) + VLEN * in];
1022  }
1023  }
1024  }
1025 
1026 
1027  template<typename REALTYPE>
1028  inline void shift_vec2_ybw(Vsimd_t *v, REALTYPE *w, REALTYPE *y, int Nin)
1029  {
1030  for (int in = 0; in < Nin; ++in) {
1031  for (int kx = 0; kx < VLENX; ++kx) {
1032  for (int ky = 0; ky < VLENY - 1; ++ky) {
1033  v[in].v[kx + VLENX * ky] = w[kx + VLENX * (ky + 1) + VLEN * in];
1034  }
1035  }
1036  int ky = VLENY - 1;
1037  for (int kx = 0; kx < VLENX; ++kx) {
1038  v[in].v[kx + VLENX * ky] = y[kx + VLENX * 0 + VLEN * in];
1039  }
1040  }
1041  }
1042 
1043 
1044  template<typename REALTYPE>
1045  inline void shift_vec2_yfw(Vsimd_t *v, REALTYPE *w, REALTYPE *y, int Nin)
1046  {
1047  for (int in = 0; in < Nin; ++in) {
1048  for (int kx = 0; kx < VLENX; ++kx) {
1049  for (int ky = 1; ky < VLENY; ++ky) {
1050  v[in].v[kx + VLENX * ky] = w[kx + VLENX * (ky - 1) + VLEN * in];
1051  }
1052  }
1053  int ky = 0;
1054  for (int kx = 0; kx < VLENX; ++kx) {
1055  v[in].v[kx + VLENX * ky] = y[kx + VLENX * (VLENY - 1) + VLEN * in];
1056  }
1057  }
1058  }
1059 
1060 
1061  inline void set_vec(svbool_t pg, svreal_t& x, real_t a, svreal_t y)
1062  {
1063  for (int k = 0; k < VLEN; ++k) {
1064  if (pg.v[k]) x.v[k] = a * y.v[k];
1065  }
1066  }
1067 
1068 
1069  inline svreal_t svadd_z(svbool_t pg, svreal_t wt1, svreal_t wt2)
1070  {
1071  svreal_t vt;
1072  for (int k = 0; k < VLEN; ++k) {
1073  if (pg.v[k]) {
1074  vt.v[k] = wt1.v[k] + wt2.v[k];
1075  } else {
1076  vt.v[k] = 0.0;
1077  }
1078  }
1079  return vt;
1080  }
1081 
1082 
1083  inline svreal_t svsub_z(svbool_t pg, svreal_t wt1, svreal_t wt2)
1084  {
1085  svreal_t vt;
1086  for (int k = 0; k < VLEN; ++k) {
1087  if (pg.v[k]) {
1088  vt.v[k] = wt1.v[k] - wt2.v[k];
1089  } else {
1090  vt.v[k] = 0.0;
1091  }
1092  }
1093  return vt;
1094  }
1095 
1096 
1097  inline svreal_t svadd_m(svbool_t pg, svreal_t wt1, svreal_t wt2)
1098  {
1099  svreal_t vt;
1100  for (int k = 0; k < VLEN; ++k) {
1101  if (pg.v[k]) vt.v[k] = wt1.v[k] + wt2.v[k];
1102  }
1103  return vt;
1104  }
1105 
1106 
1107  inline svreal_t svsub_m(svbool_t pg, svreal_t wt1, svreal_t wt2)
1108  {
1109  svreal_t vt;
1110  for (int k = 0; k < VLEN; ++k) {
1111  if (pg.v[k]) vt.v[k] = wt1.v[k] - wt2.v[k];
1112  }
1113  return vt;
1114  }
1115 
1116 
1117  inline void flip_sign(svbool_t pg, svreal_t& vt)
1118  {
1119  for (int k = 0; k < VLEN; ++k) {
1120  if (pg.v[k]) vt.v[k] = -vt.v[k];
1121  }
1122  }
1123 
1124 
1125  template<typename REALTYPE>
1126  inline svreal_t svmla_m(svbool_t pg, svreal_t wt1, svreal_t wt2,
1127  REALTYPE a)
1128  {
1129  svreal_t vt;
1130  for (int k = 0; k < VLEN; ++k) {
1131  if (pg.v[k]) vt.v[k] = wt1.v[k] + a * wt2.v[k];
1132  }
1133  return vt;
1134  }
1135 
1136 
1137  inline svreal_t compact_vec(svbool_t pg, svreal_t& yt)
1138  {
1139  svreal_t vt;
1140  int j = 0;
1141  for (int k = 0; k < VLEN; ++k) {
1142  if (pg.v[k]) {
1143  vt.v[j] = yt.v[k];
1144  ++j;
1145  }
1146  }
1147  for (int k = j; k < VLEN; ++k) {
1148  vt.v[j] = 0.0;
1149  }
1150  return vt;
1151  }
1152 
1153 
1154  inline svbool_t set_predicate_whilelt(int n)
1155  {
1156  svbool_t pg;
1157  for (int k = 0; k < n; ++k) {
1158  pg.v[k] = true;
1159  }
1160  for (int k = n; k < VLEN; ++k) {
1161  pg.v[k] = false;
1162  }
1163  return pg;
1164  }
1165 
1166 
1167  inline void set1_at(const int i, svbool_t& pg)
1168  {
1169  if (pg.v[i] == true) {
1170  pg.v[i] = false;
1171  } else {
1172  pg.v[i] = true;
1173  }
1174  }
1175 
1176 
1177  inline void rot1_R(uint_t *u)
1178  {
1179  uint_t tmp = u[VLENX - 1]; // tail
1180  for (int i = VLENX - 1; i >= 1; --i) {
1181  u[i] = u[i - 1];
1182  }
1183  u[0] = tmp;
1184  }
1185 
1186 
1187  inline void rot1_L(uint_t *u)
1188  {
1189  uint_t tmp = u[0]; // head
1190  for (int i = 0; i < VLENX - 1; ++i) {
1191  u[i] = u[i + 1];
1192  }
1193  u[VLENX - 1] = tmp;
1194  }
1195 
1196 
1197  inline void set_idx_predicate_xp_eo(svbool_t& pg, svuint_t& idx,
1198  const int ieo)
1199  {
1200  uint_t u[VLEN];
1201  for (int i = 0; i < VLEN; ++i) {
1202  u[i] = i;
1203  }
1204  pg = set_predicate_false();
1205  if (ieo == 0) {
1206  // L-shift odd rows
1207  for (int i = VLENX; i < VLEN; i += 2 * VLENX) {
1208  set1_at(i, pg);
1209  rot1_L(u + i);
1210  }
1211  }
1212  if (ieo == 1) {
1213  // L-shift env rows
1214  for (int i = 0; i < VLEN; i += 2 * VLENX) {
1215  set1_at(i, pg);
1216  rot1_L(u + i);
1217  }
1218  }
1219  for (int k = 0; k < VLEN; ++k) {
1220  idx.v[k] = u[k];
1221  }
1222  }
1223 
1224 
1225  inline void set_idx_predicate_xm_eo(svbool_t& pg, svuint_t& idx,
1226  const int ieo)
1227  {
1228  uint_t u[VLEN];
1229  for (int i = 0; i < VLEN; i++) {
1230  u[i] = i;
1231  }
1232  pg = set_predicate_false();
1233  if (ieo == 0) {
1234  // R-shift evn rows
1235  for (int i = 0; i < VLEN; i += 2 * VLENX) {
1236  set1_at(i + VLENX - 1, pg); // 3, 11
1237  rot1_R(u + i);
1238  }
1239  }
1240  if (ieo == 1) {
1241  // R-shift odd rows
1242  for (int i = VLENX; i < VLEN; i += 2 * VLENX) {
1243  set1_at(i + VLENX - 1, pg); // 7, 15
1244  rot1_R(u + i);
1245  }
1246  }
1247  for (int k = 0; k < VLEN; ++k) {
1248  idx.v[k] = u[k];
1249  }
1250  }
1251 
1252 
1253  inline void set_idx_predicate_yp(svbool_t& pg1, svuint_t& idx)
1254  {
1255  pg1 = set_predicate_whilelt(VLENX);
1256  uint_t u[VLEN];
1257  for (int i = 0; i < VLENX * (VLENY - 1); ++i) {
1258  u[i] = i + VLENX;
1259  }
1260  for (int i = 0; i < VLENX; ++i) {
1261  u[i + VLENX * (VLENY - 1)] = i;
1262  }
1263  for (int k = 0; k < VLEN; ++k) {
1264  idx.v[k] = u[k];
1265  }
1266  }
1267 
1268 
1269  inline void set_idx_predicate_ym(svbool_t& pg1, svuint_t& idx)
1270  {
1271  svbool_t pg2 = set_predicate_whilelt(VLENX * (VLENY - 1));
1272  pg1 = set_predicate_not(pg2);
1273  uint_t u[VLEN];
1274  for (int i = 0; i < VLENX; ++i) {
1275  u[i] = i + VLENX * (VLENY - 1);
1276  }
1277  for (int i = VLENX; i < VLEN; ++i) {
1278  u[i] = i - VLENX;
1279  }
1280  for (int k = 0; k < VLEN; ++k) {
1281  idx.v[k] = u[k];
1282  }
1283  }
1284 } // end of nameless namespace
1285 
1286 #endif
1287 //============================================================END=====
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
Isimd_t
Definition: vsimd_double-inc.h:20
real_t
double real_t
Definition: bridgeQXS_Clover_coarse_double.cpp:16
Isimd_t::v
int v[VLEND]
Definition: vsimd_double-inc.h:22
svbool_t::v
bool v[VLEND]
Definition: vsimd_double-inc.h:32
Vsimd_t::v
double v[VLEND]
Definition: vsimd_double-inc.h:15
Usimd_t::v
unsigned int v[VLEND]
Definition: vsimd_double-inc.h:27
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
Usimd_t
Definition: vsimd_double-inc.h:25
VLENY
#define VLENY
Definition: bridgeQXS_Clover_coarse_double.cpp:14
svbool_t
Definition: vsimd_double-inc.h:30
VLENX
#define VLENX
Definition: bridgeQXS_Clover_coarse_double.cpp:13