Bridge++  Ver. 2.0.2
vsimd_float-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  float v[VLENS];
16 } Vsimd_t;
17 
18 #ifdef __ARM_FEATURE_SVE
19 #include <arm_sve.h>
20 
21 typedef svfloat32_t svreal_t;
22 
23 typedef svint32_t svint_t;
24 
25 typedef svuint32_t svuint_t;
26 
27 typedef int32_t int_t;
28 
29 typedef uint32_t uint_t;
30 
31 namespace {
32  inline svbool_t set_predicate()
33  {
34  return svptrue_b32();
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_b32(0, range);
47  }
48 
49 
50  inline void set_predicate_xp(svbool_t& pg1, svbool_t& pg2)
51  {
52  svbool_t pg0 = svptrue_b32();
53  pg2 = svpfalse();
54  for (int iy = VLENYS; iy > 0; --iy) {
55  pg1 = svwhilelt_b32(0, iy * VLENXS);
56  pg2 = sveor_z(pg0, pg2, pg1);
57  pg1 = svwhilelt_b32(0, iy * VLENXS - 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_b32();
67  pg2 = svwhilelt_b32(0, VLENS - VLENXS + 1);
68  for (int iy = VLENYS - 1; iy > 0; --iy) {
69  pg1 = svwhilelt_b32(0, iy * VLENXS);
70  pg2 = sveor_z(pg0, pg2, pg1);
71  pg1 = svwhilelt_b32(0, (iy - 1) * VLENXS + 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_b32();
82  pg2 = svpfalse();
83  pg3 = svpfalse();
84  for (int iy = VLENYS; iy > 0; --iy) {
85  if (iy % 2 == ieo) {
86  pg1 = svwhilelt_b32(0, iy * VLENXS);
87  pg2 = sveor_z(pg0, pg2, pg1);
88  pg1 = svwhilelt_b32(0, iy * VLENXS - 1);
89  pg2 = sveor_z(pg0, pg2, pg1);
90  } else {
91  pg1 = svwhilelt_b32(0, iy * VLENXS);
92  pg3 = sveor_z(pg0, pg3, pg1);
93  pg1 = svwhilelt_b32(0, (iy - 1) * VLENXS);
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_b32();
106  pg1 = svpfalse();
107  pg3 = svpfalse();
108  for (int iy = VLENYS; iy > 0; --iy) {
109  if (iy % 2 == ieo) {
110  pg2 = svwhilelt_b32(0, iy * VLENXS);
111  pg3 = sveor_z(pg0, pg3, pg2);
112  pg2 = svwhilelt_b32(0, (iy - 1) * VLENXS);
113  pg3 = sveor_z(pg0, pg3, pg2);
114  } else {
115  pg2 = svwhilelt_b32(0, iy * VLENXS);
116  pg1 = sveor_z(pg0, pg1, pg2);
117  pg2 = svwhilelt_b32(0, (iy - 1) * VLENXS + 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_b32();
129  pg1 = svwhilelt_b32(0, VLENXS * (VLENYS - 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_b32();
137  pg2 = svwhilelt_b32(0, VLENXS);
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_b32();
146  svbool_t pg1 = svwhilelt_b32(0, i);
147  svbool_t pg2 = svwhilelt_b32(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(uint32_t *u, const int len = VLENXS)
154  {
155  uint32_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(uint32_t *u, const int len = VLENXS)
164  {
165  uint32_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  inline void set_idx_predicate_xp_eo(svbool_t& pg,
174  svuint32_t& idx,
175  const int ieo)
176  {
177  uint32_t u[VLEN];
178  for (int i = 0; i < VLEN; i++) {
179  u[i] = i;
180  }
181 
182  pg = svpfalse();
183  if (0 == ieo) {
184  // L-shift odd rows
185  for (int i = VLENXS; i < VLEN; i += 2 * VLENXS) {
186  set1_at(i, pg); // 3, 11
187  rot1_L(u + i, VLENXS);
188  }
189  }
190  if (1 == ieo) {
191  // L-shift env rows
192  for (int i = 0; i < VLEN; i += 2 * VLENXS) {
193  set1_at(i, pg); // 7, 15
194  rot1_L(u + i, VLENXS);
195  }
196  }
197  idx = svld1_u32(svptrue_b32(), u);
198  }
199 
200 
201  inline void set_idx_predicate_xm_eo(svbool_t& pg,
202  svuint32_t& idx,
203  const int ieo)
204  {
205  uint32_t u[VLEN];
206  for (int i = 0; i < VLEN; ++i) {
207  u[i] = i;
208  }
209 
210  pg = svpfalse();
211  if (0 == ieo) {
212  // R-shift evn rows
213  for (int i = 0; i < VLEN; i += 2 * VLENXS) {
214  set1_at(i + VLENXS - 1, pg); // 3, 11
215  rot1_R(u + i, VLENXS);
216  }
217  }
218  if (1 == ieo) {
219  // R-shift odd rows
220  for (int i = VLENXS; i < VLEN; i += 2 * VLENXS) {
221  set1_at(i + VLENXS - 1, pg); // 7, 15
222  rot1_R(u + i, VLENXS);
223  }
224  }
225  idx = svld1_u32(svptrue_b32(), u);
226  }
227 
228 
229  inline void set_idx_predicate_yp(svbool_t& pg1, svuint32_t& idx)
230  {
231  pg1 = svwhilelt_b32(0, VLENXS);
232  uint32_t u[VLENS];
233  for (int i = 0; i < VLENXS * (VLENYS - 1); ++i) {
234  u[i] = i + VLENXS;
235  }
236  for (int i = 0; i < VLENXS; ++i) {
237  u[i + VLENXS * (VLENYS - 1)] = i;
238  }
239  idx = svld1_u32(svptrue_b32(), u);
240  }
241 
242 
243  inline void set_idx_predicate_ym(svbool_t& pg1, svuint32_t& idx)
244  {
245  svbool_t pg2 = svwhilelt_b32(0, VLENXS * (VLENYS - 1));
246  pg1 = svnot_z(svptrue_b32(), pg2);
247  uint32_t u[VLENS];
248  for (int i = 0; i < VLENXS; ++i) {
249  u[i] = i + VLENXS * (VLENYS - 1);
250  }
251  for (int i = VLENXS; i < VLENS; ++i) {
252  u[i] = i - VLENXS;
253  }
254  idx = svld1_u32(svptrue_b32(), u);
255  }
256 
257 
258  inline void set_vec(svbool_t pg, svfloat32_t& v, float32_t a)
259  {
260  v = svdup_f32_m(v, pg, a);
261  }
262 
263 
264  inline void clear_vec(svbool_t pg, svfloat32_t& v)
265  {
266  v = svdup_f32_m(v, pg, 0.0);
267  }
268 
269 
270  inline void load_vec(svbool_t pg, svfloat32_t& v, const float32_t *vp)
271  {
272  v = svld1_f32(pg, vp);
273  }
274 
275 
276  inline void load_add(svbool_t pg, svfloat32_t& v, float32_t *vp)
277  {
278  svfloat32_t v2;
279  v2 = svld1_f32(pg, vp);
280  v = svsel_f32(pg, v2, v);
281  // v = svmul_m(pg, v, 0.0);
282  // v = svadd_m(pg, v, v2);
283  }
284 
285 
286  inline void load_svint(svbool_t pg, svint32_t& v, int32_t *vp)
287  {
288  v = svld1_s32(pg, vp);
289  }
290 
291 
292  inline void load_svuint(svbool_t pg, svuint32_t& v, uint32_t *vp)
293  {
294  v = svld1_u32(pg, vp);
295  }
296 
297 
298  inline void load_vec_gather(svbool_t pg, svfloat32_t& v, float32_t *vp,
299  svint32_t index)
300  {
301  v = svld1_gather_s32index_f32(pg, vp, index);
302  }
303 
304 
305  inline void load_add_gather(svbool_t pg, svfloat32_t& v, float32_t *vp,
306  svint32_t index)
307  {
308  svfloat32_t v2;
309  v2 = svld1_gather_s32index_f32(pg, vp, index);
310  v = svsel_f32(pg, v2, v);
311  // v = svmul_m(pg, v, 0.0);
312  // v = svadd_m(pg, v, v2);
313  }
314 
315 
316  inline void flip_sign(svbool_t pg, svfloat32_t& v)
317  {
318  v = svneg_f32_m(v, pg, v);
319  }
320 
321 
322  inline void flip_sign(svbool_t pg, svfloat32_t& v1, svfloat32_t& v2)
323  {
324  v1 = svneg_f32_m(v2, pg, v2);
325  }
326 }
327 
328 #endif // __ARM_FEATURE_SVE
329 
330 #endif
svint_t
Isimd_t svint_t
Definition: vsimd_float-inc.h:37
VLEN
#define VLEN
Definition: bridgeQXS_Clover_coarse_double.cpp:12
VLENYS
#define VLENYS
Definition: define_vlen.h:27
Vsimd_t
Definition: vsimd_double-inc.h:13
VLENS
#define VLENS
Definition: define_vlen.h:41
svuint_t
Usimd_t svuint_t
Definition: vsimd_float-inc.h:39
svreal_t
Vsimd_t svreal_t
Definition: vsimd_float-inc.h:35
uint_t
unsigned int uint_t
Definition: vsimd_float-inc.h:13
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
int_t
int int_t
Definition: vsimd_float-inc.h:41
svbool_t
Definition: vsimd_double-inc.h:30
VLENXS
#define VLENXS
Definition: define_vlen.h:26