clang  20.0.0git
hexagon_types.h
Go to the documentation of this file.
1 /******************************************************************************/
2 /* (c) 2020 Qualcomm Innovation Center, Inc. All rights reserved. */
3 /* */
4 /******************************************************************************/
5 #ifndef HEXAGON_TYPES_H
6 #define HEXAGON_TYPES_H
7 
8 #include <hexagon_protos.h>
9 
10 /* Hexagon names */
11 #define HEXAGON_Vect HEXAGON_Vect64
12 #define HEXAGON_V_GET_D HEXAGON_V64_GET_D
13 #define HEXAGON_V_GET_UD HEXAGON_V64_GET_UD
14 #define HEXAGON_V_GET_W0 HEXAGON_V64_GET_W0
15 #define HEXAGON_V_GET_W1 HEXAGON_V64_GET_W1
16 #define HEXAGON_V_GET_UW0 HEXAGON_V64_GET_UW0
17 #define HEXAGON_V_GET_UW1 HEXAGON_V64_GET_UW1
18 #define HEXAGON_V_GET_H0 HEXAGON_V64_GET_H0
19 #define HEXAGON_V_GET_H1 HEXAGON_V64_GET_H1
20 #define HEXAGON_V_GET_H2 HEXAGON_V64_GET_H2
21 #define HEXAGON_V_GET_H3 HEXAGON_V64_GET_H3
22 #define HEXAGON_V_GET_UH0 HEXAGON_V64_GET_UH0
23 #define HEXAGON_V_GET_UH1 HEXAGON_V64_GET_UH1
24 #define HEXAGON_V_GET_UH2 HEXAGON_V64_GET_UH2
25 #define HEXAGON_V_GET_UH3 HEXAGON_V64_GET_UH3
26 #define HEXAGON_V_GET_B0 HEXAGON_V64_GET_B0
27 #define HEXAGON_V_GET_B1 HEXAGON_V64_GET_B1
28 #define HEXAGON_V_GET_B2 HEXAGON_V64_GET_B2
29 #define HEXAGON_V_GET_B3 HEXAGON_V64_GET_B3
30 #define HEXAGON_V_GET_B4 HEXAGON_V64_GET_B4
31 #define HEXAGON_V_GET_B5 HEXAGON_V64_GET_B5
32 #define HEXAGON_V_GET_B6 HEXAGON_V64_GET_B6
33 #define HEXAGON_V_GET_B7 HEXAGON_V64_GET_B7
34 #define HEXAGON_V_GET_UB0 HEXAGON_V64_GET_UB0
35 #define HEXAGON_V_GET_UB1 HEXAGON_V64_GET_UB1
36 #define HEXAGON_V_GET_UB2 HEXAGON_V64_GET_UB2
37 #define HEXAGON_V_GET_UB3 HEXAGON_V64_GET_UB3
38 #define HEXAGON_V_GET_UB4 HEXAGON_V64_GET_UB4
39 #define HEXAGON_V_GET_UB5 HEXAGON_V64_GET_UB5
40 #define HEXAGON_V_GET_UB6 HEXAGON_V64_GET_UB6
41 #define HEXAGON_V_GET_UB7 HEXAGON_V64_GET_UB7
42 #define HEXAGON_V_PUT_D HEXAGON_V64_PUT_D
43 #define HEXAGON_V_PUT_W0 HEXAGON_V64_PUT_W0
44 #define HEXAGON_V_PUT_W1 HEXAGON_V64_PUT_W1
45 #define HEXAGON_V_PUT_H0 HEXAGON_V64_PUT_H0
46 #define HEXAGON_V_PUT_H1 HEXAGON_V64_PUT_H1
47 #define HEXAGON_V_PUT_H2 HEXAGON_V64_PUT_H2
48 #define HEXAGON_V_PUT_H3 HEXAGON_V64_PUT_H3
49 #define HEXAGON_V_PUT_B0 HEXAGON_V64_PUT_B0
50 #define HEXAGON_V_PUT_B1 HEXAGON_V64_PUT_B1
51 #define HEXAGON_V_PUT_B2 HEXAGON_V64_PUT_B2
52 #define HEXAGON_V_PUT_B3 HEXAGON_V64_PUT_B3
53 #define HEXAGON_V_PUT_B4 HEXAGON_V64_PUT_B4
54 #define HEXAGON_V_PUT_B5 HEXAGON_V64_PUT_B5
55 #define HEXAGON_V_PUT_B6 HEXAGON_V64_PUT_B6
56 #define HEXAGON_V_PUT_B7 HEXAGON_V64_PUT_B7
57 #define HEXAGON_V_CREATE_D HEXAGON_V64_CREATE_D
58 #define HEXAGON_V_CREATE_W HEXAGON_V64_CREATE_W
59 #define HEXAGON_V_CREATE_H HEXAGON_V64_CREATE_H
60 #define HEXAGON_V_CREATE_B HEXAGON_V64_CREATE_B
61 
62 #ifdef __cplusplus
63 #define HEXAGON_VectC HEXAGON_Vect64C
64 #endif /* __cplusplus */
65 
66 /* 64 Bit Vectors */
67 
68 typedef long long __attribute__((__may_alias__)) HEXAGON_Vect64;
69 
70 /* Extract doubleword macros */
71 
72 #define HEXAGON_V64_GET_D(v) (v)
73 #define HEXAGON_V64_GET_UD(v) ((unsigned long long)(v))
74 
75 /* Extract word macros */
76 
77 #define HEXAGON_V64_GET_W0(v) \
78  __extension__({ \
79  union { \
80  long long d; \
81  int w[2]; \
82  } _HEXAGON_V64_internal_union; \
83  _HEXAGON_V64_internal_union.d = (v); \
84  _HEXAGON_V64_internal_union.w[0]; \
85  })
86 #define HEXAGON_V64_GET_W1(v) \
87  __extension__({ \
88  union { \
89  long long d; \
90  int w[2]; \
91  } _HEXAGON_V64_internal_union; \
92  _HEXAGON_V64_internal_union.d = (v); \
93  _HEXAGON_V64_internal_union.w[1]; \
94  })
95 #define HEXAGON_V64_GET_UW0(v) \
96  __extension__({ \
97  union { \
98  long long d; \
99  unsigned int uw[2]; \
100  } _HEXAGON_V64_internal_union; \
101  _HEXAGON_V64_internal_union.d = (v); \
102  _HEXAGON_V64_internal_union.uw[0]; \
103  })
104 #define HEXAGON_V64_GET_UW1(v) \
105  __extension__({ \
106  union { \
107  long long d; \
108  unsigned int uw[2]; \
109  } _HEXAGON_V64_internal_union; \
110  _HEXAGON_V64_internal_union.d = (v); \
111  _HEXAGON_V64_internal_union.uw[1]; \
112  })
113 
114 /* Extract half word macros */
115 
116 #define HEXAGON_V64_GET_H0(v) \
117  __extension__({ \
118  union { \
119  long long d; \
120  short h[4]; \
121  } _HEXAGON_V64_internal_union; \
122  _HEXAGON_V64_internal_union.d = (v); \
123  _HEXAGON_V64_internal_union.h[0]; \
124  })
125 #define HEXAGON_V64_GET_H1(v) \
126  __extension__({ \
127  union { \
128  long long d; \
129  short h[4]; \
130  } _HEXAGON_V64_internal_union; \
131  _HEXAGON_V64_internal_union.d = (v); \
132  _HEXAGON_V64_internal_union.h[1]; \
133  })
134 #define HEXAGON_V64_GET_H2(v) \
135  __extension__({ \
136  union { \
137  long long d; \
138  short h[4]; \
139  } _HEXAGON_V64_internal_union; \
140  _HEXAGON_V64_internal_union.d = (v); \
141  _HEXAGON_V64_internal_union.h[2]; \
142  })
143 #define HEXAGON_V64_GET_H3(v) \
144  __extension__({ \
145  union { \
146  long long d; \
147  short h[4]; \
148  } _HEXAGON_V64_internal_union; \
149  _HEXAGON_V64_internal_union.d = (v); \
150  _HEXAGON_V64_internal_union.h[3]; \
151  })
152 #define HEXAGON_V64_GET_UH0(v) \
153  __extension__({ \
154  union { \
155  long long d; \
156  unsigned short uh[4]; \
157  } _HEXAGON_V64_internal_union; \
158  _HEXAGON_V64_internal_union.d = (v); \
159  _HEXAGON_V64_internal_union.uh[0]; \
160  })
161 #define HEXAGON_V64_GET_UH1(v) \
162  __extension__({ \
163  union { \
164  long long d; \
165  unsigned short uh[4]; \
166  } _HEXAGON_V64_internal_union; \
167  _HEXAGON_V64_internal_union.d = (v); \
168  _HEXAGON_V64_internal_union.uh[1]; \
169  })
170 #define HEXAGON_V64_GET_UH2(v) \
171  __extension__({ \
172  union { \
173  long long d; \
174  unsigned short uh[4]; \
175  } _HEXAGON_V64_internal_union; \
176  _HEXAGON_V64_internal_union.d = (v); \
177  _HEXAGON_V64_internal_union.uh[2]; \
178  })
179 #define HEXAGON_V64_GET_UH3(v) \
180  __extension__({ \
181  union { \
182  long long d; \
183  unsigned short uh[4]; \
184  } _HEXAGON_V64_internal_union; \
185  _HEXAGON_V64_internal_union.d = (v); \
186  _HEXAGON_V64_internal_union.uh[3]; \
187  })
188 
189 /* Extract byte macros */
190 
191 #define HEXAGON_V64_GET_B0(v) \
192  __extension__({ \
193  union { \
194  long long d; \
195  signed char b[8]; \
196  } _HEXAGON_V64_internal_union; \
197  _HEXAGON_V64_internal_union.d = (v); \
198  _HEXAGON_V64_internal_union.b[0]; \
199  })
200 #define HEXAGON_V64_GET_B1(v) \
201  __extension__({ \
202  union { \
203  long long d; \
204  signed char b[8]; \
205  } _HEXAGON_V64_internal_union; \
206  _HEXAGON_V64_internal_union.d = (v); \
207  _HEXAGON_V64_internal_union.b[1]; \
208  })
209 #define HEXAGON_V64_GET_B2(v) \
210  __extension__({ \
211  union { \
212  long long d; \
213  signed char b[8]; \
214  } _HEXAGON_V64_internal_union; \
215  _HEXAGON_V64_internal_union.d = (v); \
216  _HEXAGON_V64_internal_union.b[2]; \
217  })
218 #define HEXAGON_V64_GET_B3(v) \
219  __extension__({ \
220  union { \
221  long long d; \
222  signed char b[8]; \
223  } _HEXAGON_V64_internal_union; \
224  _HEXAGON_V64_internal_union.d = (v); \
225  _HEXAGON_V64_internal_union.b[3]; \
226  })
227 #define HEXAGON_V64_GET_B4(v) \
228  __extension__({ \
229  union { \
230  long long d; \
231  signed char b[8]; \
232  } _HEXAGON_V64_internal_union; \
233  _HEXAGON_V64_internal_union.d = (v); \
234  _HEXAGON_V64_internal_union.b[4]; \
235  })
236 #define HEXAGON_V64_GET_B5(v) \
237  __extension__({ \
238  union { \
239  long long d; \
240  signed char b[8]; \
241  } _HEXAGON_V64_internal_union; \
242  _HEXAGON_V64_internal_union.d = (v); \
243  _HEXAGON_V64_internal_union.b[5]; \
244  })
245 #define HEXAGON_V64_GET_B6(v) \
246  __extension__({ \
247  union { \
248  long long d; \
249  signed char b[8]; \
250  } _HEXAGON_V64_internal_union; \
251  _HEXAGON_V64_internal_union.d = (v); \
252  _HEXAGON_V64_internal_union.b[6]; \
253  })
254 #define HEXAGON_V64_GET_B7(v) \
255  __extension__({ \
256  union { \
257  long long d; \
258  signed char b[8]; \
259  } _HEXAGON_V64_internal_union; \
260  _HEXAGON_V64_internal_union.d = (v); \
261  _HEXAGON_V64_internal_union.b[7]; \
262  })
263 #define HEXAGON_V64_GET_UB0(v) \
264  __extension__({ \
265  union { \
266  long long d; \
267  unsigned char ub[8]; \
268  } _HEXAGON_V64_internal_union; \
269  _HEXAGON_V64_internal_union.d = (v); \
270  _HEXAGON_V64_internal_union.ub[0]; \
271  })
272 #define HEXAGON_V64_GET_UB1(v) \
273  __extension__({ \
274  union { \
275  long long d; \
276  unsigned char ub[8]; \
277  } _HEXAGON_V64_internal_union; \
278  _HEXAGON_V64_internal_union.d = (v); \
279  _HEXAGON_V64_internal_union.ub[1]; \
280  })
281 #define HEXAGON_V64_GET_UB2(v) \
282  __extension__({ \
283  union { \
284  long long d; \
285  unsigned char ub[8]; \
286  } _HEXAGON_V64_internal_union; \
287  _HEXAGON_V64_internal_union.d = (v); \
288  _HEXAGON_V64_internal_union.ub[2]; \
289  })
290 #define HEXAGON_V64_GET_UB3(v) \
291  __extension__({ \
292  union { \
293  long long d; \
294  unsigned char ub[8]; \
295  } _HEXAGON_V64_internal_union; \
296  _HEXAGON_V64_internal_union.d = (v); \
297  _HEXAGON_V64_internal_union.ub[3]; \
298  })
299 #define HEXAGON_V64_GET_UB4(v) \
300  __extension__({ \
301  union { \
302  long long d; \
303  unsigned char ub[8]; \
304  } _HEXAGON_V64_internal_union; \
305  _HEXAGON_V64_internal_union.d = (v); \
306  _HEXAGON_V64_internal_union.ub[4]; \
307  })
308 #define HEXAGON_V64_GET_UB5(v) \
309  __extension__({ \
310  union { \
311  long long d; \
312  unsigned char ub[8]; \
313  } _HEXAGON_V64_internal_union; \
314  _HEXAGON_V64_internal_union.d = (v); \
315  _HEXAGON_V64_internal_union.ub[5]; \
316  })
317 #define HEXAGON_V64_GET_UB6(v) \
318  __extension__({ \
319  union { \
320  long long d; \
321  unsigned char ub[8]; \
322  } _HEXAGON_V64_internal_union; \
323  _HEXAGON_V64_internal_union.d = (v); \
324  _HEXAGON_V64_internal_union.ub[6]; \
325  })
326 #define HEXAGON_V64_GET_UB7(v) \
327  __extension__({ \
328  union { \
329  long long d; \
330  unsigned char ub[8]; \
331  } _HEXAGON_V64_internal_union; \
332  _HEXAGON_V64_internal_union.d = (v); \
333  _HEXAGON_V64_internal_union.ub[7]; \
334  })
335 
336 /* NOTE: All set macros return a HEXAGON_Vect64 type */
337 
338 /* Set doubleword macro */
339 
340 #define HEXAGON_V64_PUT_D(v, new) (new)
341 
342 /* Set word macros */
343 
344 #ifdef __hexagon__
345 
346 #define HEXAGON_V64_PUT_W0(v, new) \
347  __extension__({ \
348  union { \
349  long long d; \
350  int w[2]; \
351  } _HEXAGON_V64_internal_union; \
352  _HEXAGON_V64_internal_union.d = (v); \
353  _HEXAGON_V64_internal_union.w[0] = (new); \
354  _HEXAGON_V64_internal_union.d; \
355  })
356 #define HEXAGON_V64_PUT_W1(v, new) \
357  __extension__({ \
358  union { \
359  long long d; \
360  int w[2]; \
361  } _HEXAGON_V64_internal_union; \
362  _HEXAGON_V64_internal_union.d = (v); \
363  _HEXAGON_V64_internal_union.w[1] = (new); \
364  _HEXAGON_V64_internal_union.d; \
365  })
366 
367 #else /* !__hexagon__ */
368 
369 #define HEXAGON_V64_PUT_W0(v, new) \
370  (((v) & 0xffffffff00000000LL) | ((HEXAGON_Vect64)((unsigned int)(new))))
371 #define HEXAGON_V64_PUT_W1(v, new) \
372  (((v) & 0x00000000ffffffffLL) | (((HEXAGON_Vect64)(new)) << 32LL))
373 
374 #endif /* !__hexagon__ */
375 
376 /* Set half word macros */
377 
378 #ifdef __hexagon__
379 
380 #define HEXAGON_V64_PUT_H0(v, new) \
381  __extension__({ \
382  union { \
383  long long d; \
384  short h[4]; \
385  } _HEXAGON_V64_internal_union; \
386  _HEXAGON_V64_internal_union.d = (v); \
387  _HEXAGON_V64_internal_union.h[0] = (new); \
388  _HEXAGON_V64_internal_union.d; \
389  })
390 #define HEXAGON_V64_PUT_H1(v, new) \
391  __extension__({ \
392  union { \
393  long long d; \
394  short h[4]; \
395  } _HEXAGON_V64_internal_union; \
396  _HEXAGON_V64_internal_union.d = (v); \
397  _HEXAGON_V64_internal_union.h[1] = (new); \
398  _HEXAGON_V64_internal_union.d; \
399  })
400 #define HEXAGON_V64_PUT_H2(v, new) \
401  __extension__({ \
402  union { \
403  long long d; \
404  short h[4]; \
405  } _HEXAGON_V64_internal_union; \
406  _HEXAGON_V64_internal_union.d = (v); \
407  _HEXAGON_V64_internal_union.h[2] = (new); \
408  _HEXAGON_V64_internal_union.d; \
409  })
410 #define HEXAGON_V64_PUT_H3(v, new) \
411  __extension__({ \
412  union { \
413  long long d; \
414  short h[4]; \
415  } _HEXAGON_V64_internal_union; \
416  _HEXAGON_V64_internal_union.d = (v); \
417  _HEXAGON_V64_internal_union.h[3] = (new); \
418  _HEXAGON_V64_internal_union.d; \
419  })
420 
421 #else /* !__hexagon__ */
422 
423 #define HEXAGON_V64_PUT_H0(v, new) \
424  (((v) & 0xffffffffffff0000LL) | ((HEXAGON_Vect64)((unsigned short)(new))))
425 #define HEXAGON_V64_PUT_H1(v, new) \
426  (((v) & 0xffffffff0000ffffLL) | (((HEXAGON_Vect64)((unsigned short)(new))) << 16LL))
427 #define HEXAGON_V64_PUT_H2(v, new) \
428  (((v) & 0xffff0000ffffffffLL) | (((HEXAGON_Vect64)((unsigned short)(new))) << 32LL))
429 #define HEXAGON_V64_PUT_H3(v, new) \
430  (((v) & 0x0000ffffffffffffLL) | (((HEXAGON_Vect64)(new)) << 48LL))
431 
432 #endif /* !__hexagon__ */
433 
434 /* Set byte macros */
435 
436 #ifdef __hexagon__
437 
438 #define HEXAGON_V64_PUT_B0(v, new) \
439  __extension__({ \
440  union { \
441  long long d; \
442  char b[8]; \
443  } _HEXAGON_V64_internal_union; \
444  _HEXAGON_V64_internal_union.d = (v); \
445  _HEXAGON_V64_internal_union.b[0] = (new); \
446  _HEXAGON_V64_internal_union.d; \
447  })
448 #define HEXAGON_V64_PUT_B1(v, new) \
449  __extension__({ \
450  union { \
451  long long d; \
452  char b[8]; \
453  } _HEXAGON_V64_internal_union; \
454  _HEXAGON_V64_internal_union.d = (v); \
455  _HEXAGON_V64_internal_union.b[1] = (new); \
456  _HEXAGON_V64_internal_union.d; \
457  })
458 #define HEXAGON_V64_PUT_B2(v, new) \
459  __extension__({ \
460  union { \
461  long long d; \
462  char b[8]; \
463  } _HEXAGON_V64_internal_union; \
464  _HEXAGON_V64_internal_union.d = (v); \
465  _HEXAGON_V64_internal_union.b[2] = (new); \
466  _HEXAGON_V64_internal_union.d; \
467  })
468 #define HEXAGON_V64_PUT_B3(v, new) \
469  __extension__({ \
470  union { \
471  long long d; \
472  char b[8]; \
473  } _HEXAGON_V64_internal_union; \
474  _HEXAGON_V64_internal_union.d = (v); \
475  _HEXAGON_V64_internal_union.b[3] = (new); \
476  _HEXAGON_V64_internal_union.d; \
477  })
478 #define HEXAGON_V64_PUT_B4(v, new) \
479  __extension__({ \
480  union { \
481  long long d; \
482  char b[8]; \
483  } _HEXAGON_V64_internal_union; \
484  _HEXAGON_V64_internal_union.d = (v); \
485  _HEXAGON_V64_internal_union.b[4] = (new); \
486  _HEXAGON_V64_internal_union.d; \
487  })
488 #define HEXAGON_V64_PUT_B5(v, new) \
489  __extension__({ \
490  union { \
491  long long d; \
492  char b[8]; \
493  } _HEXAGON_V64_internal_union; \
494  _HEXAGON_V64_internal_union.d = (v); \
495  _HEXAGON_V64_internal_union.b[5] = (new); \
496  _HEXAGON_V64_internal_union.d; \
497  })
498 #define HEXAGON_V64_PUT_B6(v, new) \
499  __extension__({ \
500  union { \
501  long long d; \
502  char b[8]; \
503  } _HEXAGON_V64_internal_union; \
504  _HEXAGON_V64_internal_union.d = (v); \
505  _HEXAGON_V64_internal_union.b[6] = (new); \
506  _HEXAGON_V64_internal_union.d; \
507  })
508 #define HEXAGON_V64_PUT_B7(v, new) \
509  __extension__({ \
510  union { \
511  long long d; \
512  char b[8]; \
513  } _HEXAGON_V64_internal_union; \
514  _HEXAGON_V64_internal_union.d = (v); \
515  _HEXAGON_V64_internal_union.b[7] = (new); \
516  _HEXAGON_V64_internal_union.d; \
517  })
518 
519 #else /* !__hexagon__ */
520 
521 #define HEXAGON_V64_PUT_B0(v, new) \
522  (((v) & 0xffffffffffffff00LL) | ((HEXAGON_Vect64)((unsigned char)(new))))
523 #define HEXAGON_V64_PUT_B1(v, new) \
524  (((v) & 0xffffffffffff00ffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 8LL))
525 #define HEXAGON_V64_PUT_B2(v, new) \
526  (((v) & 0xffffffffff00ffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 16LL))
527 #define HEXAGON_V64_PUT_B3(v, new) \
528  (((v) & 0xffffffff00ffffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 24LL))
529 #define HEXAGON_V64_PUT_B4(v, new) \
530  (((v) & 0xffffff00ffffffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 32LL))
531 #define HEXAGON_V64_PUT_B5(v, new) \
532  (((v) & 0xffff00ffffffffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 40LL))
533 #define HEXAGON_V64_PUT_B6(v, new) \
534  (((v) & 0xff00ffffffffffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 48LL))
535 #define HEXAGON_V64_PUT_B7(v, new) \
536  (((v) & 0x00ffffffffffffffLL) | (((HEXAGON_Vect64)(new)) << 56LL))
537 
538 #endif /* !__hexagon__ */
539 
540 /* NOTE: All create macros return a HEXAGON_Vect64 type */
541 
542 /* Create from a doubleword */
543 
544 #define HEXAGON_V64_CREATE_D(d) (d)
545 
546 /* Create from words */
547 
548 #ifdef __hexagon__
549 
550 #define HEXAGON_V64_CREATE_W(w1, w0) \
551  __extension__({ \
552  union { \
553  long long d; \
554  int w[2]; \
555  } _HEXAGON_V64_internal_union; \
556  _HEXAGON_V64_internal_union.w[0] = (w0); \
557  _HEXAGON_V64_internal_union.w[1] = (w1); \
558  _HEXAGON_V64_internal_union.d; \
559  })
560 
561 #else /* !__hexagon__ */
562 
563 #define HEXAGON_V64_CREATE_W(w1, w0) \
564  ((((HEXAGON_Vect64)(w1)) << 32LL) | ((HEXAGON_Vect64)((w0) & 0xffffffff)))
565 
566 #endif /* !__hexagon__ */
567 
568 /* Create from half words */
569 
570 #ifdef __hexagon__
571 
572 #define HEXAGON_V64_CREATE_H(h3, h2, h1, h0) \
573  __extension__({ \
574  union { \
575  long long d; \
576  short h[4]; \
577  } _HEXAGON_V64_internal_union; \
578  _HEXAGON_V64_internal_union.h[0] = (h0); \
579  _HEXAGON_V64_internal_union.h[1] = (h1); \
580  _HEXAGON_V64_internal_union.h[2] = (h2); \
581  _HEXAGON_V64_internal_union.h[3] = (h3); \
582  _HEXAGON_V64_internal_union.d; \
583  })
584 
585 #else /* !__hexagon__ */
586 
587 #define HEXAGON_V64_CREATE_H(h3, h2, h1, h0) \
588  ((((HEXAGON_Vect64)(h3)) << 48LL) | (((HEXAGON_Vect64)((h2) & 0xffff)) << 32LL) | \
589  (((HEXAGON_Vect64)((h1) & 0xffff)) << 16LL) | ((HEXAGON_Vect64)((h0) & 0xffff)))
590 
591 #endif /* !__hexagon__ */
592 
593 /* Create from bytes */
594 
595 #ifdef __hexagon__
596 
597 #define HEXAGON_V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0) \
598  __extension__({ \
599  union { \
600  long long d; \
601  char b[8]; \
602  } _HEXAGON_V64_internal_union; \
603  _HEXAGON_V64_internal_union.b[0] = (b0); \
604  _HEXAGON_V64_internal_union.b[1] = (b1); \
605  _HEXAGON_V64_internal_union.b[2] = (b2); \
606  _HEXAGON_V64_internal_union.b[3] = (b3); \
607  _HEXAGON_V64_internal_union.b[4] = (b4); \
608  _HEXAGON_V64_internal_union.b[5] = (b5); \
609  _HEXAGON_V64_internal_union.b[6] = (b6); \
610  _HEXAGON_V64_internal_union.b[7] = (b7); \
611  _HEXAGON_V64_internal_union.d; \
612  })
613 
614 #else /* !__hexagon__ */
615 
616 #define HEXAGON_V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0) \
617  ((((HEXAGON_Vect64)(b7)) << 56LL) | (((HEXAGON_Vect64)((b6) & 0xff)) << 48LL) | \
618  (((HEXAGON_Vect64)((b5) & 0xff)) << 40LL) | (((HEXAGON_Vect64)((b4) & 0xff)) << 32LL) | \
619  (((HEXAGON_Vect64)((b3) & 0xff)) << 24LL) | (((HEXAGON_Vect64)((b2) & 0xff)) << 16LL) | \
620  (((HEXAGON_Vect64)((b1) & 0xff)) << 8LL) | ((HEXAGON_Vect64)((b0) & 0xff)))
621 
622 #endif /* !__hexagon__ */
623 
624 #ifdef __cplusplus
625 
626 class HEXAGON_Vect64C {
627 public:
628  // Constructors
629  HEXAGON_Vect64C(long long d = 0) : data(d) {};
630  HEXAGON_Vect64C(int w1, int w0) : data(HEXAGON_V64_CREATE_W(w1, w0)) {};
631  HEXAGON_Vect64C(short h3, short h2, short h1, short h0)
632  : data(HEXAGON_V64_CREATE_H(h3, h2, h1, h0)) {};
633  HEXAGON_Vect64C(signed char b7, signed char b6, signed char b5, signed char b4,
634  signed char b3, signed char b2, signed char b1, signed char b0)
635  : data(HEXAGON_V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0)) {};
636  HEXAGON_Vect64C(const HEXAGON_Vect64C &v) : data(v.data) {};
637 
638  HEXAGON_Vect64C &operator=(const HEXAGON_Vect64C &v) {
639  data = v.data;
640  return *this;
641  };
642 
643  operator long long() {
644  return data;
645  };
646 
647  // Extract doubleword methods
648  long long D(void) {
649  return HEXAGON_V64_GET_D(data);
650  };
651  unsigned long long UD(void) {
652  return HEXAGON_V64_GET_UD(data);
653  };
654 
655  // Extract word methods
656  int W0(void) {
657  return HEXAGON_V64_GET_W0(data);
658  };
659  int W1(void) {
660  return HEXAGON_V64_GET_W1(data);
661  };
662  unsigned int UW0(void) {
663  return HEXAGON_V64_GET_UW0(data);
664  };
665  unsigned int UW1(void) {
666  return HEXAGON_V64_GET_UW1(data);
667  };
668 
669  // Extract half word methods
670  short H0(void) {
671  return HEXAGON_V64_GET_H0(data);
672  };
673  short H1(void) {
674  return HEXAGON_V64_GET_H1(data);
675  };
676  short H2(void) {
677  return HEXAGON_V64_GET_H2(data);
678  };
679  short H3(void) {
680  return HEXAGON_V64_GET_H3(data);
681  };
682  unsigned short UH0(void) {
683  return HEXAGON_V64_GET_UH0(data);
684  };
685  unsigned short UH1(void) {
686  return HEXAGON_V64_GET_UH1(data);
687  };
688  unsigned short UH2(void) {
689  return HEXAGON_V64_GET_UH2(data);
690  };
691  unsigned short UH3(void) {
692  return HEXAGON_V64_GET_UH3(data);
693  };
694 
695  // Extract byte methods
696  signed char B0(void) {
697  return HEXAGON_V64_GET_B0(data);
698  };
699  signed char B1(void) {
700  return HEXAGON_V64_GET_B1(data);
701  };
702  signed char B2(void) {
703  return HEXAGON_V64_GET_B2(data);
704  };
705  signed char B3(void) {
706  return HEXAGON_V64_GET_B3(data);
707  };
708  signed char B4(void) {
709  return HEXAGON_V64_GET_B4(data);
710  };
711  signed char B5(void) {
712  return HEXAGON_V64_GET_B5(data);
713  };
714  signed char B6(void) {
715  return HEXAGON_V64_GET_B6(data);
716  };
717  signed char B7(void) {
718  return HEXAGON_V64_GET_B7(data);
719  };
720  unsigned char UB0(void) {
721  return HEXAGON_V64_GET_UB0(data);
722  };
723  unsigned char UB1(void) {
724  return HEXAGON_V64_GET_UB1(data);
725  };
726  unsigned char UB2(void) {
727  return HEXAGON_V64_GET_UB2(data);
728  };
729  unsigned char UB3(void) {
730  return HEXAGON_V64_GET_UB3(data);
731  };
732  unsigned char UB4(void) {
733  return HEXAGON_V64_GET_UB4(data);
734  };
735  unsigned char UB5(void) {
736  return HEXAGON_V64_GET_UB5(data);
737  };
738  unsigned char UB6(void) {
739  return HEXAGON_V64_GET_UB6(data);
740  };
741  unsigned char UB7(void) {
742  return HEXAGON_V64_GET_UB7(data);
743  };
744 
745  // NOTE: All set methods return a HEXAGON_Vect64C type
746 
747  // Set doubleword method
748  HEXAGON_Vect64C D(long long d) {
749  return HEXAGON_Vect64C(HEXAGON_V64_PUT_D(data, d));
750  };
751 
752  // Set word methods
753  HEXAGON_Vect64C W0(int w) {
754  return HEXAGON_Vect64C(HEXAGON_V64_PUT_W0(data, w));
755  };
756  HEXAGON_Vect64C W1(int w) {
757  return HEXAGON_Vect64C(HEXAGON_V64_PUT_W1(data, w));
758  };
759 
760  // Set half word methods
761  HEXAGON_Vect64C H0(short h) {
762  return HEXAGON_Vect64C(HEXAGON_V64_PUT_H0(data, h));
763  };
764  HEXAGON_Vect64C H1(short h) {
765  return HEXAGON_Vect64C(HEXAGON_V64_PUT_H1(data, h));
766  };
767  HEXAGON_Vect64C H2(short h) {
768  return HEXAGON_Vect64C(HEXAGON_V64_PUT_H2(data, h));
769  };
770  HEXAGON_Vect64C H3(short h) {
771  return HEXAGON_Vect64C(HEXAGON_V64_PUT_H3(data, h));
772  };
773 
774  // Set byte methods
775  HEXAGON_Vect64C B0(signed char b) {
776  return HEXAGON_Vect64C(HEXAGON_V64_PUT_B0(data, b));
777  };
778  HEXAGON_Vect64C B1(signed char b) {
779  return HEXAGON_Vect64C(HEXAGON_V64_PUT_B1(data, b));
780  };
781  HEXAGON_Vect64C B2(signed char b) {
782  return HEXAGON_Vect64C(HEXAGON_V64_PUT_B2(data, b));
783  };
784  HEXAGON_Vect64C B3(signed char b) {
785  return HEXAGON_Vect64C(HEXAGON_V64_PUT_B3(data, b));
786  };
787  HEXAGON_Vect64C B4(signed char b) {
788  return HEXAGON_Vect64C(HEXAGON_V64_PUT_B4(data, b));
789  };
790  HEXAGON_Vect64C B5(signed char b) {
791  return HEXAGON_Vect64C(HEXAGON_V64_PUT_B5(data, b));
792  };
793  HEXAGON_Vect64C B6(signed char b) {
794  return HEXAGON_Vect64C(HEXAGON_V64_PUT_B6(data, b));
795  };
796  HEXAGON_Vect64C B7(signed char b) {
797  return HEXAGON_Vect64C(HEXAGON_V64_PUT_B7(data, b));
798  };
799 
800 private:
801  long long data;
802 };
803 
804 #endif /* __cplusplus */
805 
806 /* 32 Bit Vectors */
807 
808 typedef int HEXAGON_Vect32;
809 
810 /* Extract word macros */
811 
812 #define HEXAGON_V32_GET_W(v) (v)
813 #define HEXAGON_V32_GET_UW(v) ((unsigned int)(v))
814 
815 /* Extract half word macros */
816 
817 #define HEXAGON_V32_GET_H0(v) \
818  __extension__({ \
819  union { \
820  int w; \
821  short h[2]; \
822  } _HEXAGON_V32_internal_union; \
823  _HEXAGON_V32_internal_union.w = (v); \
824  _HEXAGON_V32_internal_union.h[0]; \
825  })
826 #define HEXAGON_V32_GET_H1(v) \
827  __extension__({ \
828  union { \
829  int w; \
830  short h[2]; \
831  } _HEXAGON_V32_internal_union; \
832  _HEXAGON_V32_internal_union.w = (v); \
833  _HEXAGON_V32_internal_union.h[1]; \
834  })
835 #define HEXAGON_V32_GET_UH0(v) \
836  __extension__({ \
837  union { \
838  int w; \
839  unsigned short uh[2]; \
840  } _HEXAGON_V32_internal_union; \
841  _HEXAGON_V32_internal_union.w = (v); \
842  _HEXAGON_V32_internal_union.uh[0]; \
843  })
844 #define HEXAGON_V32_GET_UH1(v) \
845  __extension__({ \
846  union { \
847  int w; \
848  unsigned short uh[2]; \
849  } _HEXAGON_V32_internal_union; \
850  _HEXAGON_V32_internal_union.w = (v); \
851  _HEXAGON_V32_internal_union.uh[1]; \
852  })
853 
854 /* Extract byte macros */
855 
856 #define HEXAGON_V32_GET_B0(v) \
857  __extension__({ \
858  union { \
859  int w; \
860  signed char b[4]; \
861  } _HEXAGON_V32_internal_union; \
862  _HEXAGON_V32_internal_union.w = (v); \
863  _HEXAGON_V32_internal_union.b[0]; \
864  })
865 #define HEXAGON_V32_GET_B1(v) \
866  __extension__({ \
867  union { \
868  int w; \
869  signed char b[4]; \
870  } _HEXAGON_V32_internal_union; \
871  _HEXAGON_V32_internal_union.w = (v); \
872  _HEXAGON_V32_internal_union.b[1]; \
873  })
874 #define HEXAGON_V32_GET_B2(v) \
875  __extension__({ \
876  union { \
877  int w; \
878  signed char b[4]; \
879  } _HEXAGON_V32_internal_union; \
880  _HEXAGON_V32_internal_union.w = (v); \
881  _HEXAGON_V32_internal_union.b[2]; \
882  })
883 #define HEXAGON_V32_GET_B3(v) \
884  __extension__({ \
885  union { \
886  int w; \
887  signed char b[4]; \
888  } _HEXAGON_V32_internal_union; \
889  _HEXAGON_V32_internal_union.w = (v); \
890  _HEXAGON_V32_internal_union.b[3]; \
891  })
892 #define HEXAGON_V32_GET_UB0(v) \
893  __extension__({ \
894  union { \
895  int w; \
896  unsigned char ub[4]; \
897  } _HEXAGON_V32_internal_union; \
898  _HEXAGON_V32_internal_union.w = (v); \
899  _HEXAGON_V32_internal_union.ub[0]; \
900  })
901 #define HEXAGON_V32_GET_UB1(v) \
902  __extension__({ \
903  union { \
904  int w; \
905  unsigned char ub[4]; \
906  } _HEXAGON_V32_internal_union; \
907  _HEXAGON_V32_internal_union.w = (v); \
908  _HEXAGON_V32_internal_union.ub[1]; \
909  })
910 #define HEXAGON_V32_GET_UB2(v) \
911  __extension__({ \
912  union { \
913  int w; \
914  unsigned char ub[4]; \
915  } _HEXAGON_V32_internal_union; \
916  _HEXAGON_V32_internal_union.w = (v); \
917  _HEXAGON_V32_internal_union.ub[2]; \
918  })
919 #define HEXAGON_V32_GET_UB3(v) \
920  __extension__({ \
921  union { \
922  int w; \
923  unsigned char ub[4]; \
924  } _HEXAGON_V32_internal_union; \
925  _HEXAGON_V32_internal_union.w = (v); \
926  _HEXAGON_V32_internal_union.ub[3]; \
927  })
928 
929 /* NOTE: All set macros return a HEXAGON_Vect32 type */
930 
931 /* Set word macro */
932 
933 #define HEXAGON_V32_PUT_W(v, new) (new)
934 
935 /* Set half word macros */
936 
937 #ifdef __hexagon__
938 
939 #define HEXAGON_V32_PUT_H0(v, new) \
940  __extension__({ \
941  union { \
942  int w; \
943  short h[2]; \
944  } _HEXAGON_V32_internal_union; \
945  _HEXAGON_V32_internal_union.w = (v); \
946  _HEXAGON_V32_internal_union.h[0] = (new); \
947  _HEXAGON_V32_internal_union.w; \
948  })
949 #define HEXAGON_V32_PUT_H1(v, new) \
950  __extension__({ \
951  union { \
952  int w; \
953  short h[2]; \
954  } _HEXAGON_V32_internal_union; \
955  _HEXAGON_V32_internal_union.w = (v); \
956  _HEXAGON_V32_internal_union.h[1] = (new); \
957  _HEXAGON_V32_internal_union.w; \
958  })
959 
960 #else /* !__hexagon__ */
961 
962 #define HEXAGON_V32_PUT_H0(v, new) \
963  (((v) & 0xffff0000) | ((HEXAGON_Vect32)((unsigned short)(new))))
964 #define HEXAGON_V32_PUT_H1(v, new) (((v) & 0x0000ffff) | (((HEXAGON_Vect32)(new)) << 16))
965 
966 #endif /* !__hexagon__ */
967 
968 /* Set byte macros */
969 
970 #ifdef __hexagon__
971 
972 #define HEXAGON_V32_PUT_B0(v, new) \
973  __extension__({ \
974  union { \
975  int w; \
976  char b[4]; \
977  } _HEXAGON_V32_internal_union; \
978  _HEXAGON_V32_internal_union.w = (v); \
979  _HEXAGON_V32_internal_union.b[0] = (new); \
980  _HEXAGON_V32_internal_union.w; \
981  })
982 #define HEXAGON_V32_PUT_B1(v, new) \
983  __extension__({ \
984  union { \
985  int w; \
986  char b[4]; \
987  } _HEXAGON_V32_internal_union; \
988  _HEXAGON_V32_internal_union.w = (v); \
989  _HEXAGON_V32_internal_union.b[1] = (new); \
990  _HEXAGON_V32_internal_union.w; \
991  })
992 #define HEXAGON_V32_PUT_B2(v, new) \
993  __extension__({ \
994  union { \
995  int w; \
996  char b[4]; \
997  } _HEXAGON_V32_internal_union; \
998  _HEXAGON_V32_internal_union.w = (v); \
999  _HEXAGON_V32_internal_union.b[2] = (new); \
1000  _HEXAGON_V32_internal_union.w; \
1001  })
1002 #define HEXAGON_V32_PUT_B3(v, new) \
1003  __extension__({ \
1004  union { \
1005  int w; \
1006  char b[4]; \
1007  } _HEXAGON_V32_internal_union; \
1008  _HEXAGON_V32_internal_union.w = (v); \
1009  _HEXAGON_V32_internal_union.b[3] = (new); \
1010  _HEXAGON_V32_internal_union.w; \
1011  })
1012 
1013 #else /* !__hexagon__ */
1014 
1015 #define HEXAGON_V32_PUT_B0(v, new) \
1016  (((v) & 0xffffff00) | ((HEXAGON_Vect32)((unsigned char)(new))))
1017 #define HEXAGON_V32_PUT_B1(v, new) \
1018  (((v) & 0xffff00ff) | (((HEXAGON_Vect32)((unsigned char)(new))) << 8))
1019 #define HEXAGON_V32_PUT_B2(v, new) \
1020  (((v) & 0xff00ffff) | (((HEXAGON_Vect32)((unsigned char)(new))) << 16))
1021 #define HEXAGON_V32_PUT_B3(v, new) (((v) & 0x00ffffff) | (((HEXAGON_Vect32)(new)) << 24))
1022 
1023 #endif /* !__hexagon__ */
1024 
1025 /* NOTE: All create macros return a HEXAGON_Vect32 type */
1026 
1027 /* Create from a word */
1028 
1029 #define HEXAGON_V32_CREATE_W(w) (w)
1030 
1031 /* Create from half words */
1032 
1033 #ifdef __hexagon__
1034 
1035 #define HEXAGON_V32_CREATE_H(h1, h0) \
1036  __extension__({ \
1037  union { \
1038  long long d; \
1039  short h[2]; \
1040  } _HEXAGON_V32_internal_union; \
1041  _HEXAGON_V32_internal_union.h[0] = (h0); \
1042  _HEXAGON_V32_internal_union.h[1] = (h1); \
1043  _HEXAGON_V32_internal_union.d; \
1044  })
1045 
1046 #else /* !__hexagon__ */
1047 
1048 #define HEXAGON_V32_CREATE_H(h1, h0) \
1049  ((((HEXAGON_Vect32)(h1)) << 16) | ((HEXAGON_Vect32)((h0) & 0xffff)))
1050 
1051 #endif /* !__hexagon__ */
1052 
1053 /* Create from bytes */
1054 #ifdef __hexagon__
1055 
1056 #define HEXAGON_V32_CREATE_B(b3, b2, b1, b0) \
1057  __extension__({ \
1058  union { \
1059  long long d; \
1060  char b[4]; \
1061  } _HEXAGON_V32_internal_union; \
1062  _HEXAGON_V32_internal_union.b[0] = (b0); \
1063  _HEXAGON_V32_internal_union.b[1] = (b1); \
1064  _HEXAGON_V32_internal_union.b[2] = (b2); \
1065  _HEXAGON_V32_internal_union.b[3] = (b3); \
1066  _HEXAGON_V32_internal_union.d; \
1067  })
1068 
1069 #else /* !__hexagon__ */
1070 
1071 #define HEXAGON_V32_CREATE_B(b3, b2, b1, b0) \
1072  ((((HEXAGON_Vect32)(b3)) << 24) | (((HEXAGON_Vect32)((b2) & 0xff)) << 16) | \
1073  (((HEXAGON_Vect32)((b1) & 0xff)) << 8) | ((HEXAGON_Vect32)((b0) & 0xff)))
1074 
1075 #endif /* !__hexagon__ */
1076 
1077 #ifdef __cplusplus
1078 
1079 class HEXAGON_Vect32C {
1080 public:
1081  // Constructors
1082  HEXAGON_Vect32C(int w = 0) : data(w) {};
1083  HEXAGON_Vect32C(short h1, short h0) : data(HEXAGON_V32_CREATE_H(h1, h0)) {};
1084  HEXAGON_Vect32C(signed char b3, signed char b2, signed char b1, signed char b0)
1085  : data(HEXAGON_V32_CREATE_B(b3, b2, b1, b0)) {};
1086  HEXAGON_Vect32C(const HEXAGON_Vect32C &v) : data(v.data) {};
1087 
1088  HEXAGON_Vect32C &operator=(const HEXAGON_Vect32C &v) {
1089  data = v.data;
1090  return *this;
1091  };
1092 
1093  operator int() {
1094  return data;
1095  };
1096 
1097  // Extract word methods
1098  int W(void) {
1099  return HEXAGON_V32_GET_W(data);
1100  };
1101  unsigned int UW(void) {
1102  return HEXAGON_V32_GET_UW(data);
1103  };
1104 
1105  // Extract half word methods
1106  short H0(void) {
1107  return HEXAGON_V32_GET_H0(data);
1108  };
1109  short H1(void) {
1110  return HEXAGON_V32_GET_H1(data);
1111  };
1112  unsigned short UH0(void) {
1113  return HEXAGON_V32_GET_UH0(data);
1114  };
1115  unsigned short UH1(void) {
1116  return HEXAGON_V32_GET_UH1(data);
1117  };
1118 
1119  // Extract byte methods
1120  signed char B0(void) {
1121  return HEXAGON_V32_GET_B0(data);
1122  };
1123  signed char B1(void) {
1124  return HEXAGON_V32_GET_B1(data);
1125  };
1126  signed char B2(void) {
1127  return HEXAGON_V32_GET_B2(data);
1128  };
1129  signed char B3(void) {
1130  return HEXAGON_V32_GET_B3(data);
1131  };
1132  unsigned char UB0(void) {
1133  return HEXAGON_V32_GET_UB0(data);
1134  };
1135  unsigned char UB1(void) {
1136  return HEXAGON_V32_GET_UB1(data);
1137  };
1138  unsigned char UB2(void) {
1139  return HEXAGON_V32_GET_UB2(data);
1140  };
1141  unsigned char UB3(void) {
1142  return HEXAGON_V32_GET_UB3(data);
1143  };
1144 
1145  // NOTE: All set methods return a HEXAGON_Vect32C type
1146 
1147  // Set word method
1148  HEXAGON_Vect32C W(int w) {
1149  return HEXAGON_Vect32C(HEXAGON_V32_PUT_W(data, w));
1150  };
1151 
1152  // Set half word methods
1153  HEXAGON_Vect32C H0(short h) {
1154  return HEXAGON_Vect32C(HEXAGON_V32_PUT_H0(data, h));
1155  };
1156  HEXAGON_Vect32C H1(short h) {
1157  return HEXAGON_Vect32C(HEXAGON_V32_PUT_H1(data, h));
1158  };
1159 
1160  // Set byte methods
1161  HEXAGON_Vect32C B0(signed char b) {
1162  return HEXAGON_Vect32C(HEXAGON_V32_PUT_B0(data, b));
1163  };
1164  HEXAGON_Vect32C B1(signed char b) {
1165  return HEXAGON_Vect32C(HEXAGON_V32_PUT_B1(data, b));
1166  };
1167  HEXAGON_Vect32C B2(signed char b) {
1168  return HEXAGON_Vect32C(HEXAGON_V32_PUT_B2(data, b));
1169  };
1170  HEXAGON_Vect32C B3(signed char b) {
1171  return HEXAGON_Vect32C(HEXAGON_V32_PUT_B3(data, b));
1172  };
1173 
1174 private:
1175  int data;
1176 };
1177 
1178 #endif /* __cplusplus */
1179 
1180 // V65 Vector types
1181 #if __HVX_ARCH__ >= 65
1182 #if defined __HVX__ && (__HVX_LENGTH__ == 128)
1183  typedef long HEXAGON_VecPred128 __attribute__((__vector_size__(128)))
1184  __attribute__((aligned(128)));
1185 
1186  typedef long HEXAGON_Vect1024 __attribute__((__vector_size__(128)))
1187  __attribute__((aligned(128)));
1188 
1189  typedef long HEXAGON_Vect2048 __attribute__((__vector_size__(256)))
1190  __attribute__((aligned(256)));
1191 
1192  typedef long HEXAGON_UVect1024 __attribute__((__vector_size__(128)))
1193  __attribute__((aligned(4)));
1194 
1195  typedef long HEXAGON_UVect2048 __attribute__((__vector_size__(256)))
1196  __attribute__((aligned(4)));
1197 
1198  #define HVX_VectorPred HEXAGON_VecPred128
1199  #define HVX_Vector HEXAGON_Vect1024
1200  #define HVX_VectorPair HEXAGON_Vect2048
1201  #define HVX_UVector HEXAGON_UVect1024
1202  #define HVX_UVectorPair HEXAGON_UVect2048
1203 #else /* defined __HVX__ && (__HVX_LENGTH__ == 128) */
1204 #if defined __HVX__ && (__HVX_LENGTH__ == 64)
1205  typedef long HEXAGON_VecPred64 __attribute__((__vector_size__(64)))
1206  __attribute__((aligned(64)));
1207 
1208  typedef long HEXAGON_Vect512 __attribute__((__vector_size__(64)))
1209  __attribute__((aligned(64)));
1210 
1211  typedef long HEXAGON_Vect1024 __attribute__((__vector_size__(128)))
1212  __attribute__((aligned(128)));
1213 
1214  typedef long HEXAGON_UVect512 __attribute__((__vector_size__(64)))
1215  __attribute__((aligned(4)));
1216 
1217  typedef long HEXAGON_UVect1024 __attribute__((__vector_size__(128)))
1218  __attribute__((aligned(4)));
1219 
1220  #define HVX_VectorPred HEXAGON_VecPred64
1221  #define HVX_Vector HEXAGON_Vect512
1222  #define HVX_VectorPair HEXAGON_Vect1024
1223  #define HVX_UVector HEXAGON_UVect512
1224  #define HVX_UVectorPair HEXAGON_UVect1024
1225 #endif /* defined __HVX__ && (__HVX_LENGTH__ == 64) */
1226 #endif /* defined __HVX__ && (__HVX_LENGTH__ == 128) */
1227 #endif /* __HVX_ARCH__ >= 65 */
1228 
1229 /* Predicates */
1230 
1231 typedef int HEXAGON_Pred;
1232 
1233 /***
1234  *** backward compatibility aliases
1235  ***/
1236 
1237 /* Old names */
1238 #define Q6Vect Q6Vect64
1239 #define Q6V_GET_D Q6V64_GET_D
1240 #define Q6V_GET_UD Q6V64_GET_UD
1241 #define Q6V_GET_W0 Q6V64_GET_W0
1242 #define Q6V_GET_W1 Q6V64_GET_W1
1243 #define Q6V_GET_UW0 Q6V64_GET_UW0
1244 #define Q6V_GET_UW1 Q6V64_GET_UW1
1245 #define Q6V_GET_H0 Q6V64_GET_H0
1246 #define Q6V_GET_H1 Q6V64_GET_H1
1247 #define Q6V_GET_H2 Q6V64_GET_H2
1248 #define Q6V_GET_H3 Q6V64_GET_H3
1249 #define Q6V_GET_UH0 Q6V64_GET_UH0
1250 #define Q6V_GET_UH1 Q6V64_GET_UH1
1251 #define Q6V_GET_UH2 Q6V64_GET_UH2
1252 #define Q6V_GET_UH3 Q6V64_GET_UH3
1253 #define Q6V_GET_B0 Q6V64_GET_B0
1254 #define Q6V_GET_B1 Q6V64_GET_B1
1255 #define Q6V_GET_B2 Q6V64_GET_B2
1256 #define Q6V_GET_B3 Q6V64_GET_B3
1257 #define Q6V_GET_B4 Q6V64_GET_B4
1258 #define Q6V_GET_B5 Q6V64_GET_B5
1259 #define Q6V_GET_B6 Q6V64_GET_B6
1260 #define Q6V_GET_B7 Q6V64_GET_B7
1261 #define Q6V_GET_UB0 Q6V64_GET_UB0
1262 #define Q6V_GET_UB1 Q6V64_GET_UB1
1263 #define Q6V_GET_UB2 Q6V64_GET_UB2
1264 #define Q6V_GET_UB3 Q6V64_GET_UB3
1265 #define Q6V_GET_UB4 Q6V64_GET_UB4
1266 #define Q6V_GET_UB5 Q6V64_GET_UB5
1267 #define Q6V_GET_UB6 Q6V64_GET_UB6
1268 #define Q6V_GET_UB7 Q6V64_GET_UB7
1269 #define Q6V_PUT_D Q6V64_PUT_D
1270 #define Q6V_PUT_W0 Q6V64_PUT_W0
1271 #define Q6V_PUT_W1 Q6V64_PUT_W1
1272 #define Q6V_PUT_H0 Q6V64_PUT_H0
1273 #define Q6V_PUT_H1 Q6V64_PUT_H1
1274 #define Q6V_PUT_H2 Q6V64_PUT_H2
1275 #define Q6V_PUT_H3 Q6V64_PUT_H3
1276 #define Q6V_PUT_B0 Q6V64_PUT_B0
1277 #define Q6V_PUT_B1 Q6V64_PUT_B1
1278 #define Q6V_PUT_B2 Q6V64_PUT_B2
1279 #define Q6V_PUT_B3 Q6V64_PUT_B3
1280 #define Q6V_PUT_B4 Q6V64_PUT_B4
1281 #define Q6V_PUT_B5 Q6V64_PUT_B5
1282 #define Q6V_PUT_B6 Q6V64_PUT_B6
1283 #define Q6V_PUT_B7 Q6V64_PUT_B7
1284 #define Q6V_CREATE_D Q6V64_CREATE_D
1285 #define Q6V_CREATE_W Q6V64_CREATE_W
1286 #define Q6V_CREATE_H Q6V64_CREATE_H
1287 #define Q6V_CREATE_B Q6V64_CREATE_B
1288 
1289 #ifdef __cplusplus
1290 #define Q6VectC Q6Vect64C
1291 #endif /* __cplusplus */
1292 
1293 /* 64 Bit Vectors */
1294 
1295 typedef long long __attribute__((__may_alias__)) Q6Vect64;
1296 
1297 /* Extract doubleword macros */
1298 
1299 #define Q6V64_GET_D(v) (v)
1300 #define Q6V64_GET_UD(v) ((unsigned long long)(v))
1301 
1302 /* Extract word macros */
1303 
1304 #define Q6V64_GET_W0(v) \
1305  __extension__({ \
1306  union { \
1307  long long d; \
1308  int w[2]; \
1309  } _Q6V64_internal_union; \
1310  _Q6V64_internal_union.d = (v); \
1311  _Q6V64_internal_union.w[0]; \
1312  })
1313 #define Q6V64_GET_W1(v) \
1314  __extension__({ \
1315  union { \
1316  long long d; \
1317  int w[2]; \
1318  } _Q6V64_internal_union; \
1319  _Q6V64_internal_union.d = (v); \
1320  _Q6V64_internal_union.w[1]; \
1321  })
1322 #define Q6V64_GET_UW0(v) \
1323  __extension__({ \
1324  union { \
1325  long long d; \
1326  unsigned int uw[2]; \
1327  } _Q6V64_internal_union; \
1328  _Q6V64_internal_union.d = (v); \
1329  _Q6V64_internal_union.uw[0]; \
1330  })
1331 #define Q6V64_GET_UW1(v) \
1332  __extension__({ \
1333  union { \
1334  long long d; \
1335  unsigned int uw[2]; \
1336  } _Q6V64_internal_union; \
1337  _Q6V64_internal_union.d = (v); \
1338  _Q6V64_internal_union.uw[1]; \
1339  })
1340 
1341 /* Extract half word macros */
1342 
1343 #define Q6V64_GET_H0(v) \
1344  __extension__({ \
1345  union { \
1346  long long d; \
1347  short h[4]; \
1348  } _Q6V64_internal_union; \
1349  _Q6V64_internal_union.d = (v); \
1350  _Q6V64_internal_union.h[0]; \
1351  })
1352 #define Q6V64_GET_H1(v) \
1353  __extension__({ \
1354  union { \
1355  long long d; \
1356  short h[4]; \
1357  } _Q6V64_internal_union; \
1358  _Q6V64_internal_union.d = (v); \
1359  _Q6V64_internal_union.h[1]; \
1360  })
1361 #define Q6V64_GET_H2(v) \
1362  __extension__({ \
1363  union { \
1364  long long d; \
1365  short h[4]; \
1366  } _Q6V64_internal_union; \
1367  _Q6V64_internal_union.d = (v); \
1368  _Q6V64_internal_union.h[2]; \
1369  })
1370 #define Q6V64_GET_H3(v) \
1371  __extension__({ \
1372  union { \
1373  long long d; \
1374  short h[4]; \
1375  } _Q6V64_internal_union; \
1376  _Q6V64_internal_union.d = (v); \
1377  _Q6V64_internal_union.h[3]; \
1378  })
1379 #define Q6V64_GET_UH0(v) \
1380  __extension__({ \
1381  union { \
1382  long long d; \
1383  unsigned short uh[4]; \
1384  } _Q6V64_internal_union; \
1385  _Q6V64_internal_union.d = (v); \
1386  _Q6V64_internal_union.uh[0]; \
1387  })
1388 #define Q6V64_GET_UH1(v) \
1389  __extension__({ \
1390  union { \
1391  long long d; \
1392  unsigned short uh[4]; \
1393  } _Q6V64_internal_union; \
1394  _Q6V64_internal_union.d = (v); \
1395  _Q6V64_internal_union.uh[1]; \
1396  })
1397 #define Q6V64_GET_UH2(v) \
1398  __extension__({ \
1399  union { \
1400  long long d; \
1401  unsigned short uh[4]; \
1402  } _Q6V64_internal_union; \
1403  _Q6V64_internal_union.d = (v); \
1404  _Q6V64_internal_union.uh[2]; \
1405  })
1406 #define Q6V64_GET_UH3(v) \
1407  __extension__({ \
1408  union { \
1409  long long d; \
1410  unsigned short uh[4]; \
1411  } _Q6V64_internal_union; \
1412  _Q6V64_internal_union.d = (v); \
1413  _Q6V64_internal_union.uh[3]; \
1414  })
1415 
1416 /* Extract byte macros */
1417 
1418 #define Q6V64_GET_B0(v) \
1419  __extension__({ \
1420  union { \
1421  long long d; \
1422  signed char b[8]; \
1423  } _Q6V64_internal_union; \
1424  _Q6V64_internal_union.d = (v); \
1425  _Q6V64_internal_union.b[0]; \
1426  })
1427 #define Q6V64_GET_B1(v) \
1428  __extension__({ \
1429  union { \
1430  long long d; \
1431  signed char b[8]; \
1432  } _Q6V64_internal_union; \
1433  _Q6V64_internal_union.d = (v); \
1434  _Q6V64_internal_union.b[1]; \
1435  })
1436 #define Q6V64_GET_B2(v) \
1437  __extension__({ \
1438  union { \
1439  long long d; \
1440  signed char b[8]; \
1441  } _Q6V64_internal_union; \
1442  _Q6V64_internal_union.d = (v); \
1443  _Q6V64_internal_union.b[2]; \
1444  })
1445 #define Q6V64_GET_B3(v) \
1446  __extension__({ \
1447  union { \
1448  long long d; \
1449  signed char b[8]; \
1450  } _Q6V64_internal_union; \
1451  _Q6V64_internal_union.d = (v); \
1452  _Q6V64_internal_union.b[3]; \
1453  })
1454 #define Q6V64_GET_B4(v) \
1455  __extension__({ \
1456  union { \
1457  long long d; \
1458  signed char b[8]; \
1459  } _Q6V64_internal_union; \
1460  _Q6V64_internal_union.d = (v); \
1461  _Q6V64_internal_union.b[4]; \
1462  })
1463 #define Q6V64_GET_B5(v) \
1464  __extension__({ \
1465  union { \
1466  long long d; \
1467  signed char b[8]; \
1468  } _Q6V64_internal_union; \
1469  _Q6V64_internal_union.d = (v); \
1470  _Q6V64_internal_union.b[5]; \
1471  })
1472 #define Q6V64_GET_B6(v) \
1473  __extension__({ \
1474  union { \
1475  long long d; \
1476  signed char b[8]; \
1477  } _Q6V64_internal_union; \
1478  _Q6V64_internal_union.d = (v); \
1479  _Q6V64_internal_union.b[6]; \
1480  })
1481 #define Q6V64_GET_B7(v) \
1482  __extension__({ \
1483  union { \
1484  long long d; \
1485  signed char b[8]; \
1486  } _Q6V64_internal_union; \
1487  _Q6V64_internal_union.d = (v); \
1488  _Q6V64_internal_union.b[7]; \
1489  })
1490 #define Q6V64_GET_UB0(v) \
1491  __extension__({ \
1492  union { \
1493  long long d; \
1494  unsigned char ub[8]; \
1495  } _Q6V64_internal_union; \
1496  _Q6V64_internal_union.d = (v); \
1497  _Q6V64_internal_union.ub[0]; \
1498  })
1499 #define Q6V64_GET_UB1(v) \
1500  __extension__({ \
1501  union { \
1502  long long d; \
1503  unsigned char ub[8]; \
1504  } _Q6V64_internal_union; \
1505  _Q6V64_internal_union.d = (v); \
1506  _Q6V64_internal_union.ub[1]; \
1507  })
1508 #define Q6V64_GET_UB2(v) \
1509  __extension__({ \
1510  union { \
1511  long long d; \
1512  unsigned char ub[8]; \
1513  } _Q6V64_internal_union; \
1514  _Q6V64_internal_union.d = (v); \
1515  _Q6V64_internal_union.ub[2]; \
1516  })
1517 #define Q6V64_GET_UB3(v) \
1518  __extension__({ \
1519  union { \
1520  long long d; \
1521  unsigned char ub[8]; \
1522  } _Q6V64_internal_union; \
1523  _Q6V64_internal_union.d = (v); \
1524  _Q6V64_internal_union.ub[3]; \
1525  })
1526 #define Q6V64_GET_UB4(v) \
1527  __extension__({ \
1528  union { \
1529  long long d; \
1530  unsigned char ub[8]; \
1531  } _Q6V64_internal_union; \
1532  _Q6V64_internal_union.d = (v); \
1533  _Q6V64_internal_union.ub[4]; \
1534  })
1535 #define Q6V64_GET_UB5(v) \
1536  __extension__({ \
1537  union { \
1538  long long d; \
1539  unsigned char ub[8]; \
1540  } _Q6V64_internal_union; \
1541  _Q6V64_internal_union.d = (v); \
1542  _Q6V64_internal_union.ub[5]; \
1543  })
1544 #define Q6V64_GET_UB6(v) \
1545  __extension__({ \
1546  union { \
1547  long long d; \
1548  unsigned char ub[8]; \
1549  } _Q6V64_internal_union; \
1550  _Q6V64_internal_union.d = (v); \
1551  _Q6V64_internal_union.ub[6]; \
1552  })
1553 #define Q6V64_GET_UB7(v) \
1554  __extension__({ \
1555  union { \
1556  long long d; \
1557  unsigned char ub[8]; \
1558  } _Q6V64_internal_union; \
1559  _Q6V64_internal_union.d = (v); \
1560  _Q6V64_internal_union.ub[7]; \
1561  })
1562 
1563 /* NOTE: All set macros return a Q6Vect64 type */
1564 
1565 /* Set doubleword macro */
1566 
1567 #define Q6V64_PUT_D(v, new) (new)
1568 
1569 /* Set word macros */
1570 
1571 #ifdef __qdsp6__
1572 
1573 #define Q6V64_PUT_W0(v, new) \
1574  __extension__({ \
1575  union { \
1576  long long d; \
1577  int w[2]; \
1578  } _Q6V64_internal_union; \
1579  _Q6V64_internal_union.d = (v); \
1580  _Q6V64_internal_union.w[0] = (new); \
1581  _Q6V64_internal_union.d; \
1582  })
1583 #define Q6V64_PUT_W1(v, new) \
1584  __extension__({ \
1585  union { \
1586  long long d; \
1587  int w[2]; \
1588  } _Q6V64_internal_union; \
1589  _Q6V64_internal_union.d = (v); \
1590  _Q6V64_internal_union.w[1] = (new); \
1591  _Q6V64_internal_union.d; \
1592  })
1593 
1594 #else /* !__qdsp6__ */
1595 
1596 #define Q6V64_PUT_W0(v, new) \
1597  (((v) & 0xffffffff00000000LL) | ((Q6Vect64)((unsigned int)(new))))
1598 #define Q6V64_PUT_W1(v, new) \
1599  (((v) & 0x00000000ffffffffLL) | (((Q6Vect64)(new)) << 32LL))
1600 
1601 #endif /* !__qdsp6__ */
1602 
1603 /* Set half word macros */
1604 
1605 #ifdef __qdsp6__
1606 
1607 #define Q6V64_PUT_H0(v, new) \
1608  __extension__({ \
1609  union { \
1610  long long d; \
1611  short h[4]; \
1612  } _Q6V64_internal_union; \
1613  _Q6V64_internal_union.d = (v); \
1614  _Q6V64_internal_union.h[0] = (new); \
1615  _Q6V64_internal_union.d; \
1616  })
1617 #define Q6V64_PUT_H1(v, new) \
1618  __extension__({ \
1619  union { \
1620  long long d; \
1621  short h[4]; \
1622  } _Q6V64_internal_union; \
1623  _Q6V64_internal_union.d = (v); \
1624  _Q6V64_internal_union.h[1] = (new); \
1625  _Q6V64_internal_union.d; \
1626  })
1627 #define Q6V64_PUT_H2(v, new) \
1628  __extension__({ \
1629  union { \
1630  long long d; \
1631  short h[4]; \
1632  } _Q6V64_internal_union; \
1633  _Q6V64_internal_union.d = (v); \
1634  _Q6V64_internal_union.h[2] = (new); \
1635  _Q6V64_internal_union.d; \
1636  })
1637 #define Q6V64_PUT_H3(v, new) \
1638  __extension__({ \
1639  union { \
1640  long long d; \
1641  short h[4]; \
1642  } _Q6V64_internal_union; \
1643  _Q6V64_internal_union.d = (v); \
1644  _Q6V64_internal_union.h[3] = (new); \
1645  _Q6V64_internal_union.d; \
1646  })
1647 
1648 #else /* !__qdsp6__ */
1649 
1650 #define Q6V64_PUT_H0(v, new) \
1651  (((v) & 0xffffffffffff0000LL) | ((Q6Vect64)((unsigned short)(new))))
1652 #define Q6V64_PUT_H1(v, new) \
1653  (((v) & 0xffffffff0000ffffLL) | (((Q6Vect64)((unsigned short)(new))) << 16LL))
1654 #define Q6V64_PUT_H2(v, new) \
1655  (((v) & 0xffff0000ffffffffLL) | (((Q6Vect64)((unsigned short)(new))) << 32LL))
1656 #define Q6V64_PUT_H3(v, new) \
1657  (((v) & 0x0000ffffffffffffLL) | (((Q6Vect64)(new)) << 48LL))
1658 
1659 #endif /* !__qdsp6__ */
1660 
1661 /* Set byte macros */
1662 
1663 #ifdef __qdsp6__
1664 
1665 #define Q6V64_PUT_B0(v, new) \
1666  __extension__({ \
1667  union { \
1668  long long d; \
1669  char b[8]; \
1670  } _Q6V64_internal_union; \
1671  _Q6V64_internal_union.d = (v); \
1672  _Q6V64_internal_union.b[0] = (new); \
1673  _Q6V64_internal_union.d; \
1674  })
1675 #define Q6V64_PUT_B1(v, new) \
1676  __extension__({ \
1677  union { \
1678  long long d; \
1679  char b[8]; \
1680  } _Q6V64_internal_union; \
1681  _Q6V64_internal_union.d = (v); \
1682  _Q6V64_internal_union.b[1] = (new); \
1683  _Q6V64_internal_union.d; \
1684  })
1685 #define Q6V64_PUT_B2(v, new) \
1686  __extension__({ \
1687  union { \
1688  long long d; \
1689  char b[8]; \
1690  } _Q6V64_internal_union; \
1691  _Q6V64_internal_union.d = (v); \
1692  _Q6V64_internal_union.b[2] = (new); \
1693  _Q6V64_internal_union.d; \
1694  })
1695 #define Q6V64_PUT_B3(v, new) \
1696  __extension__({ \
1697  union { \
1698  long long d; \
1699  char b[8]; \
1700  } _Q6V64_internal_union; \
1701  _Q6V64_internal_union.d = (v); \
1702  _Q6V64_internal_union.b[3] = (new); \
1703  _Q6V64_internal_union.d; \
1704  })
1705 #define Q6V64_PUT_B4(v, new) \
1706  __extension__({ \
1707  union { \
1708  long long d; \
1709  char b[8]; \
1710  } _Q6V64_internal_union; \
1711  _Q6V64_internal_union.d = (v); \
1712  _Q6V64_internal_union.b[4] = (new); \
1713  _Q6V64_internal_union.d; \
1714  })
1715 #define Q6V64_PUT_B5(v, new) \
1716  __extension__({ \
1717  union { \
1718  long long d; \
1719  char b[8]; \
1720  } _Q6V64_internal_union; \
1721  _Q6V64_internal_union.d = (v); \
1722  _Q6V64_internal_union.b[5] = (new); \
1723  _Q6V64_internal_union.d; \
1724  })
1725 #define Q6V64_PUT_B6(v, new) \
1726  __extension__({ \
1727  union { \
1728  long long d; \
1729  char b[8]; \
1730  } _Q6V64_internal_union; \
1731  _Q6V64_internal_union.d = (v); \
1732  _Q6V64_internal_union.b[6] = (new); \
1733  _Q6V64_internal_union.d; \
1734  })
1735 #define Q6V64_PUT_B7(v, new) \
1736  __extension__({ \
1737  union { \
1738  long long d; \
1739  char b[8]; \
1740  } _Q6V64_internal_union; \
1741  _Q6V64_internal_union.d = (v); \
1742  _Q6V64_internal_union.b[7] = (new); \
1743  _Q6V64_internal_union.d; \
1744  })
1745 
1746 #else /* !__qdsp6__ */
1747 
1748 #define Q6V64_PUT_B0(v, new) \
1749  (((v) & 0xffffffffffffff00LL) | ((Q6Vect64)((unsigned char)(new))))
1750 #define Q6V64_PUT_B1(v, new) \
1751  (((v) & 0xffffffffffff00ffLL) | (((Q6Vect64)((unsigned char)(new))) << 8LL))
1752 #define Q6V64_PUT_B2(v, new) \
1753  (((v) & 0xffffffffff00ffffLL) | (((Q6Vect64)((unsigned char)(new))) << 16LL))
1754 #define Q6V64_PUT_B3(v, new) \
1755  (((v) & 0xffffffff00ffffffLL) | (((Q6Vect64)((unsigned char)(new))) << 24LL))
1756 #define Q6V64_PUT_B4(v, new) \
1757  (((v) & 0xffffff00ffffffffLL) | (((Q6Vect64)((unsigned char)(new))) << 32LL))
1758 #define Q6V64_PUT_B5(v, new) \
1759  (((v) & 0xffff00ffffffffffLL) | (((Q6Vect64)((unsigned char)(new))) << 40LL))
1760 #define Q6V64_PUT_B6(v, new) \
1761  (((v) & 0xff00ffffffffffffLL) | (((Q6Vect64)((unsigned char)(new))) << 48LL))
1762 #define Q6V64_PUT_B7(v, new) \
1763  (((v) & 0x00ffffffffffffffLL) | (((Q6Vect64)(new)) << 56LL))
1764 
1765 #endif /* !__qdsp6__ */
1766 
1767 /* NOTE: All create macros return a Q6Vect64 type */
1768 
1769 /* Create from a doubleword */
1770 
1771 #define Q6V64_CREATE_D(d) (d)
1772 
1773 /* Create from words */
1774 
1775 #ifdef __qdsp6__
1776 
1777 #define Q6V64_CREATE_W(w1, w0) \
1778  __extension__({ \
1779  union { \
1780  long long d; \
1781  int w[2]; \
1782  } _Q6V64_internal_union; \
1783  _Q6V64_internal_union.w[0] = (w0); \
1784  _Q6V64_internal_union.w[1] = (w1); \
1785  _Q6V64_internal_union.d; \
1786  })
1787 
1788 #else /* !__qdsp6__ */
1789 
1790 #define Q6V64_CREATE_W(w1, w0) \
1791  ((((Q6Vect64)(w1)) << 32LL) | ((Q6Vect64)((w0) & 0xffffffff)))
1792 
1793 #endif /* !__qdsp6__ */
1794 
1795 /* Create from half words */
1796 
1797 #ifdef __qdsp6__
1798 
1799 #define Q6V64_CREATE_H(h3, h2, h1, h0) \
1800  __extension__({ \
1801  union { \
1802  long long d; \
1803  short h[4]; \
1804  } _Q6V64_internal_union; \
1805  _Q6V64_internal_union.h[0] = (h0); \
1806  _Q6V64_internal_union.h[1] = (h1); \
1807  _Q6V64_internal_union.h[2] = (h2); \
1808  _Q6V64_internal_union.h[3] = (h3); \
1809  _Q6V64_internal_union.d; \
1810  })
1811 
1812 #else /* !__qdsp6__ */
1813 
1814 #define Q6V64_CREATE_H(h3, h2, h1, h0) \
1815  ((((Q6Vect64)(h3)) << 48LL) | (((Q6Vect64)((h2) & 0xffff)) << 32LL) | \
1816  (((Q6Vect64)((h1) & 0xffff)) << 16LL) | ((Q6Vect64)((h0) & 0xffff)))
1817 
1818 #endif /* !__qdsp6__ */
1819 
1820 /* Create from bytes */
1821 
1822 #ifdef __qdsp6__
1823 
1824 #define Q6V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0) \
1825  __extension__({ \
1826  union { \
1827  long long d; \
1828  char b[8]; \
1829  } _Q6V64_internal_union; \
1830  _Q6V64_internal_union.b[0] = (b0); \
1831  _Q6V64_internal_union.b[1] = (b1); \
1832  _Q6V64_internal_union.b[2] = (b2); \
1833  _Q6V64_internal_union.b[3] = (b3); \
1834  _Q6V64_internal_union.b[4] = (b4); \
1835  _Q6V64_internal_union.b[5] = (b5); \
1836  _Q6V64_internal_union.b[6] = (b6); \
1837  _Q6V64_internal_union.b[7] = (b7); \
1838  _Q6V64_internal_union.d; \
1839  })
1840 
1841 #else /* !__qdsp6__ */
1842 
1843 #define Q6V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0) \
1844  ((((Q6Vect64)(b7)) << 56LL) | (((Q6Vect64)((b6) & 0xff)) << 48LL) | \
1845  (((Q6Vect64)((b5) & 0xff)) << 40LL) | (((Q6Vect64)((b4) & 0xff)) << 32LL) | \
1846  (((Q6Vect64)((b3) & 0xff)) << 24LL) | (((Q6Vect64)((b2) & 0xff)) << 16LL) | \
1847  (((Q6Vect64)((b1) & 0xff)) << 8LL) | ((Q6Vect64)((b0) & 0xff)))
1848 
1849 #endif /* !__qdsp6__ */
1850 
1851 #ifdef __cplusplus
1852 
1853 class Q6Vect64C {
1854 public:
1855  // Constructors
1856  Q6Vect64C(long long d = 0) : data(d) {};
1857  Q6Vect64C(int w1, int w0) : data(Q6V64_CREATE_W(w1, w0)) {};
1858  Q6Vect64C(short h3, short h2, short h1, short h0)
1859  : data(Q6V64_CREATE_H(h3, h2, h1, h0)) {};
1860  Q6Vect64C(signed char b7, signed char b6, signed char b5, signed char b4,
1861  signed char b3, signed char b2, signed char b1, signed char b0)
1862  : data(Q6V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0)) {};
1863  Q6Vect64C(const Q6Vect64C &v) : data(v.data) {};
1864 
1865  Q6Vect64C &operator=(const Q6Vect64C &v) {
1866  data = v.data;
1867  return *this;
1868  };
1869 
1870  operator long long() {
1871  return data;
1872  };
1873 
1874  // Extract doubleword methods
1875  long long D(void) {
1876  return Q6V64_GET_D(data);
1877  };
1878  unsigned long long UD(void) {
1879  return Q6V64_GET_UD(data);
1880  };
1881 
1882  // Extract word methods
1883  int W0(void) {
1884  return Q6V64_GET_W0(data);
1885  };
1886  int W1(void) {
1887  return Q6V64_GET_W1(data);
1888  };
1889  unsigned int UW0(void) {
1890  return Q6V64_GET_UW0(data);
1891  };
1892  unsigned int UW1(void) {
1893  return Q6V64_GET_UW1(data);
1894  };
1895 
1896  // Extract half word methods
1897  short H0(void) {
1898  return Q6V64_GET_H0(data);
1899  };
1900  short H1(void) {
1901  return Q6V64_GET_H1(data);
1902  };
1903  short H2(void) {
1904  return Q6V64_GET_H2(data);
1905  };
1906  short H3(void) {
1907  return Q6V64_GET_H3(data);
1908  };
1909  unsigned short UH0(void) {
1910  return Q6V64_GET_UH0(data);
1911  };
1912  unsigned short UH1(void) {
1913  return Q6V64_GET_UH1(data);
1914  };
1915  unsigned short UH2(void) {
1916  return Q6V64_GET_UH2(data);
1917  };
1918  unsigned short UH3(void) {
1919  return Q6V64_GET_UH3(data);
1920  };
1921 
1922  // Extract byte methods
1923  signed char B0(void) {
1924  return Q6V64_GET_B0(data);
1925  };
1926  signed char B1(void) {
1927  return Q6V64_GET_B1(data);
1928  };
1929  signed char B2(void) {
1930  return Q6V64_GET_B2(data);
1931  };
1932  signed char B3(void) {
1933  return Q6V64_GET_B3(data);
1934  };
1935  signed char B4(void) {
1936  return Q6V64_GET_B4(data);
1937  };
1938  signed char B5(void) {
1939  return Q6V64_GET_B5(data);
1940  };
1941  signed char B6(void) {
1942  return Q6V64_GET_B6(data);
1943  };
1944  signed char B7(void) {
1945  return Q6V64_GET_B7(data);
1946  };
1947  unsigned char UB0(void) {
1948  return Q6V64_GET_UB0(data);
1949  };
1950  unsigned char UB1(void) {
1951  return Q6V64_GET_UB1(data);
1952  };
1953  unsigned char UB2(void) {
1954  return Q6V64_GET_UB2(data);
1955  };
1956  unsigned char UB3(void) {
1957  return Q6V64_GET_UB3(data);
1958  };
1959  unsigned char UB4(void) {
1960  return Q6V64_GET_UB4(data);
1961  };
1962  unsigned char UB5(void) {
1963  return Q6V64_GET_UB5(data);
1964  };
1965  unsigned char UB6(void) {
1966  return Q6V64_GET_UB6(data);
1967  };
1968  unsigned char UB7(void) {
1969  return Q6V64_GET_UB7(data);
1970  };
1971 
1972  // NOTE: All set methods return a Q6Vect64C type
1973 
1974  // Set doubleword method
1975  Q6Vect64C D(long long d) {
1976  return Q6Vect64C(Q6V64_PUT_D(data, d));
1977  };
1978 
1979  // Set word methods
1980  Q6Vect64C W0(int w) {
1981  return Q6Vect64C(Q6V64_PUT_W0(data, w));
1982  };
1983  Q6Vect64C W1(int w) {
1984  return Q6Vect64C(Q6V64_PUT_W1(data, w));
1985  };
1986 
1987  // Set half word methods
1988  Q6Vect64C H0(short h) {
1989  return Q6Vect64C(Q6V64_PUT_H0(data, h));
1990  };
1991  Q6Vect64C H1(short h) {
1992  return Q6Vect64C(Q6V64_PUT_H1(data, h));
1993  };
1994  Q6Vect64C H2(short h) {
1995  return Q6Vect64C(Q6V64_PUT_H2(data, h));
1996  };
1997  Q6Vect64C H3(short h) {
1998  return Q6Vect64C(Q6V64_PUT_H3(data, h));
1999  };
2000 
2001  // Set byte methods
2002  Q6Vect64C B0(signed char b) {
2003  return Q6Vect64C(Q6V64_PUT_B0(data, b));
2004  };
2005  Q6Vect64C B1(signed char b) {
2006  return Q6Vect64C(Q6V64_PUT_B1(data, b));
2007  };
2008  Q6Vect64C B2(signed char b) {
2009  return Q6Vect64C(Q6V64_PUT_B2(data, b));
2010  };
2011  Q6Vect64C B3(signed char b) {
2012  return Q6Vect64C(Q6V64_PUT_B3(data, b));
2013  };
2014  Q6Vect64C B4(signed char b) {
2015  return Q6Vect64C(Q6V64_PUT_B4(data, b));
2016  };
2017  Q6Vect64C B5(signed char b) {
2018  return Q6Vect64C(Q6V64_PUT_B5(data, b));
2019  };
2020  Q6Vect64C B6(signed char b) {
2021  return Q6Vect64C(Q6V64_PUT_B6(data, b));
2022  };
2023  Q6Vect64C B7(signed char b) {
2024  return Q6Vect64C(Q6V64_PUT_B7(data, b));
2025  };
2026 
2027 private:
2028  long long data;
2029 };
2030 
2031 #endif /* __cplusplus */
2032 
2033 /* 32 Bit Vectors */
2034 
2035 typedef int Q6Vect32;
2036 
2037 /* Extract word macros */
2038 
2039 #define Q6V32_GET_W(v) (v)
2040 #define Q6V32_GET_UW(v) ((unsigned int)(v))
2041 
2042 /* Extract half word macros */
2043 
2044 #define Q6V32_GET_H0(v) \
2045  __extension__({ \
2046  union { \
2047  int w; \
2048  short h[2]; \
2049  } _Q6V32_internal_union; \
2050  _Q6V32_internal_union.w = (v); \
2051  _Q6V32_internal_union.h[0]; \
2052  })
2053 #define Q6V32_GET_H1(v) \
2054  __extension__({ \
2055  union { \
2056  int w; \
2057  short h[2]; \
2058  } _Q6V32_internal_union; \
2059  _Q6V32_internal_union.w = (v); \
2060  _Q6V32_internal_union.h[1]; \
2061  })
2062 #define Q6V32_GET_UH0(v) \
2063  __extension__({ \
2064  union { \
2065  int w; \
2066  unsigned short uh[2]; \
2067  } _Q6V32_internal_union; \
2068  _Q6V32_internal_union.w = (v); \
2069  _Q6V32_internal_union.uh[0]; \
2070  })
2071 #define Q6V32_GET_UH1(v) \
2072  __extension__({ \
2073  union { \
2074  int w; \
2075  unsigned short uh[2]; \
2076  } _Q6V32_internal_union; \
2077  _Q6V32_internal_union.w = (v); \
2078  _Q6V32_internal_union.uh[1]; \
2079  })
2080 
2081 /* Extract byte macros */
2082 
2083 #define Q6V32_GET_B0(v) \
2084  __extension__({ \
2085  union { \
2086  int w; \
2087  signed char b[4]; \
2088  } _Q6V32_internal_union; \
2089  _Q6V32_internal_union.w = (v); \
2090  _Q6V32_internal_union.b[0]; \
2091  })
2092 #define Q6V32_GET_B1(v) \
2093  __extension__({ \
2094  union { \
2095  int w; \
2096  signed char b[4]; \
2097  } _Q6V32_internal_union; \
2098  _Q6V32_internal_union.w = (v); \
2099  _Q6V32_internal_union.b[1]; \
2100  })
2101 #define Q6V32_GET_B2(v) \
2102  __extension__({ \
2103  union { \
2104  int w; \
2105  signed char b[4]; \
2106  } _Q6V32_internal_union; \
2107  _Q6V32_internal_union.w = (v); \
2108  _Q6V32_internal_union.b[2]; \
2109  })
2110 #define Q6V32_GET_B3(v) \
2111  __extension__({ \
2112  union { \
2113  int w; \
2114  signed char b[4]; \
2115  } _Q6V32_internal_union; \
2116  _Q6V32_internal_union.w = (v); \
2117  _Q6V32_internal_union.b[3]; \
2118  })
2119 #define Q6V32_GET_UB0(v) \
2120  __extension__({ \
2121  union { \
2122  int w; \
2123  unsigned char ub[4]; \
2124  } _Q6V32_internal_union; \
2125  _Q6V32_internal_union.w = (v); \
2126  _Q6V32_internal_union.ub[0]; \
2127  })
2128 #define Q6V32_GET_UB1(v) \
2129  __extension__({ \
2130  union { \
2131  int w; \
2132  unsigned char ub[4]; \
2133  } _Q6V32_internal_union; \
2134  _Q6V32_internal_union.w = (v); \
2135  _Q6V32_internal_union.ub[1]; \
2136  })
2137 #define Q6V32_GET_UB2(v) \
2138  __extension__({ \
2139  union { \
2140  int w; \
2141  unsigned char ub[4]; \
2142  } _Q6V32_internal_union; \
2143  _Q6V32_internal_union.w = (v); \
2144  _Q6V32_internal_union.ub[2]; \
2145  })
2146 #define Q6V32_GET_UB3(v) \
2147  __extension__({ \
2148  union { \
2149  int w; \
2150  unsigned char ub[4]; \
2151  } _Q6V32_internal_union; \
2152  _Q6V32_internal_union.w = (v); \
2153  _Q6V32_internal_union.ub[3]; \
2154  })
2155 
2156 /* NOTE: All set macros return a Q6Vect32 type */
2157 
2158 /* Set word macro */
2159 
2160 #define Q6V32_PUT_W(v, new) (new)
2161 
2162 /* Set half word macros */
2163 
2164 #ifdef __qdsp6__
2165 
2166 #define Q6V32_PUT_H0(v, new) \
2167  __extension__({ \
2168  union { \
2169  int w; \
2170  short h[2]; \
2171  } _Q6V32_internal_union; \
2172  _Q6V32_internal_union.w = (v); \
2173  _Q6V32_internal_union.h[0] = (new); \
2174  _Q6V32_internal_union.w; \
2175  })
2176 #define Q6V32_PUT_H1(v, new) \
2177  __extension__({ \
2178  union { \
2179  int w; \
2180  short h[2]; \
2181  } _Q6V32_internal_union; \
2182  _Q6V32_internal_union.w = (v); \
2183  _Q6V32_internal_union.h[1] = (new); \
2184  _Q6V32_internal_union.w; \
2185  })
2186 
2187 #else /* !__qdsp6__ */
2188 
2189 #define Q6V32_PUT_H0(v, new) \
2190  (((v) & 0xffff0000) | ((Q6Vect32)((unsigned short)(new))))
2191 #define Q6V32_PUT_H1(v, new) (((v) & 0x0000ffff) | (((Q6Vect32)(new)) << 16))
2192 
2193 #endif /* !__qdsp6__ */
2194 
2195 /* Set byte macros */
2196 
2197 #ifdef __qdsp6__
2198 
2199 #define Q6V32_PUT_B0(v, new) \
2200  __extension__({ \
2201  union { \
2202  int w; \
2203  char b[4]; \
2204  } _Q6V32_internal_union; \
2205  _Q6V32_internal_union.w = (v); \
2206  _Q6V32_internal_union.b[0] = (new); \
2207  _Q6V32_internal_union.w; \
2208  })
2209 #define Q6V32_PUT_B1(v, new) \
2210  __extension__({ \
2211  union { \
2212  int w; \
2213  char b[4]; \
2214  } _Q6V32_internal_union; \
2215  _Q6V32_internal_union.w = (v); \
2216  _Q6V32_internal_union.b[1] = (new); \
2217  _Q6V32_internal_union.w; \
2218  })
2219 #define Q6V32_PUT_B2(v, new) \
2220  __extension__({ \
2221  union { \
2222  int w; \
2223  char b[4]; \
2224  } _Q6V32_internal_union; \
2225  _Q6V32_internal_union.w = (v); \
2226  _Q6V32_internal_union.b[2] = (new); \
2227  _Q6V32_internal_union.w; \
2228  })
2229 #define Q6V32_PUT_B3(v, new) \
2230  __extension__({ \
2231  union { \
2232  int w; \
2233  char b[4]; \
2234  } _Q6V32_internal_union; \
2235  _Q6V32_internal_union.w = (v); \
2236  _Q6V32_internal_union.b[3] = (new); \
2237  _Q6V32_internal_union.w; \
2238  })
2239 
2240 #else /* !__qdsp6__ */
2241 
2242 #define Q6V32_PUT_B0(v, new) \
2243  (((v) & 0xffffff00) | ((Q6Vect32)((unsigned char)(new))))
2244 #define Q6V32_PUT_B1(v, new) \
2245  (((v) & 0xffff00ff) | (((Q6Vect32)((unsigned char)(new))) << 8))
2246 #define Q6V32_PUT_B2(v, new) \
2247  (((v) & 0xff00ffff) | (((Q6Vect32)((unsigned char)(new))) << 16))
2248 #define Q6V32_PUT_B3(v, new) (((v) & 0x00ffffff) | (((Q6Vect32)(new)) << 24))
2249 
2250 #endif /* !__qdsp6__ */
2251 
2252 /* NOTE: All create macros return a Q6Vect32 type */
2253 
2254 /* Create from a word */
2255 
2256 #define Q6V32_CREATE_W(w) (w)
2257 
2258 /* Create from half words */
2259 
2260 #ifdef __qdsp6__
2261 
2262 #define Q6V32_CREATE_H(h1, h0) \
2263  __extension__({ \
2264  union { \
2265  long long d; \
2266  short h[2]; \
2267  } _Q6V32_internal_union; \
2268  _Q6V32_internal_union.h[0] = (h0); \
2269  _Q6V32_internal_union.h[1] = (h1); \
2270  _Q6V32_internal_union.d; \
2271  })
2272 
2273 #else /* !__qdsp6__ */
2274 
2275 #define Q6V32_CREATE_H(h1, h0) \
2276  ((((Q6Vect32)(h1)) << 16) | ((Q6Vect32)((h0) & 0xffff)))
2277 
2278 #endif /* !__qdsp6__ */
2279 
2280 /* Create from bytes */
2281 #ifdef __qdsp6__
2282 
2283 #define Q6V32_CREATE_B(b3, b2, b1, b0) \
2284  __extension__({ \
2285  union { \
2286  long long d; \
2287  char b[4]; \
2288  } _Q6V32_internal_union; \
2289  _Q6V32_internal_union.b[0] = (b0); \
2290  _Q6V32_internal_union.b[1] = (b1); \
2291  _Q6V32_internal_union.b[2] = (b2); \
2292  _Q6V32_internal_union.b[3] = (b3); \
2293  _Q6V32_internal_union.d; \
2294  })
2295 
2296 #else /* !__qdsp6__ */
2297 
2298 #define Q6V32_CREATE_B(b3, b2, b1, b0) \
2299  ((((Q6Vect32)(b3)) << 24) | (((Q6Vect32)((b2) & 0xff)) << 16) | \
2300  (((Q6Vect32)((b1) & 0xff)) << 8) | ((Q6Vect32)((b0) & 0xff)))
2301 
2302 #endif /* !__qdsp6__ */
2303 
2304 #ifdef __cplusplus
2305 
2306 class Q6Vect32C {
2307 public:
2308  // Constructors
2309  Q6Vect32C(int w = 0) : data(w) {};
2310  Q6Vect32C(short h1, short h0) : data(Q6V32_CREATE_H(h1, h0)) {};
2311  Q6Vect32C(signed char b3, signed char b2, signed char b1, signed char b0)
2312  : data(Q6V32_CREATE_B(b3, b2, b1, b0)) {};
2313  Q6Vect32C(const Q6Vect32C &v) : data(v.data) {};
2314 
2315  Q6Vect32C &operator=(const Q6Vect32C &v) {
2316  data = v.data;
2317  return *this;
2318  };
2319 
2320  operator int() {
2321  return data;
2322  };
2323 
2324  // Extract word methods
2325  int W(void) {
2326  return Q6V32_GET_W(data);
2327  };
2328  unsigned int UW(void) {
2329  return Q6V32_GET_UW(data);
2330  };
2331 
2332  // Extract half word methods
2333  short H0(void) {
2334  return Q6V32_GET_H0(data);
2335  };
2336  short H1(void) {
2337  return Q6V32_GET_H1(data);
2338  };
2339  unsigned short UH0(void) {
2340  return Q6V32_GET_UH0(data);
2341  };
2342  unsigned short UH1(void) {
2343  return Q6V32_GET_UH1(data);
2344  };
2345 
2346  // Extract byte methods
2347  signed char B0(void) {
2348  return Q6V32_GET_B0(data);
2349  };
2350  signed char B1(void) {
2351  return Q6V32_GET_B1(data);
2352  };
2353  signed char B2(void) {
2354  return Q6V32_GET_B2(data);
2355  };
2356  signed char B3(void) {
2357  return Q6V32_GET_B3(data);
2358  };
2359  unsigned char UB0(void) {
2360  return Q6V32_GET_UB0(data);
2361  };
2362  unsigned char UB1(void) {
2363  return Q6V32_GET_UB1(data);
2364  };
2365  unsigned char UB2(void) {
2366  return Q6V32_GET_UB2(data);
2367  };
2368  unsigned char UB3(void) {
2369  return Q6V32_GET_UB3(data);
2370  };
2371 
2372  // NOTE: All set methods return a Q6Vect32C type
2373 
2374  // Set word method
2375  Q6Vect32C W(int w) {
2376  return Q6Vect32C(Q6V32_PUT_W(data, w));
2377  };
2378 
2379  // Set half word methods
2380  Q6Vect32C H0(short h) {
2381  return Q6Vect32C(Q6V32_PUT_H0(data, h));
2382  };
2383  Q6Vect32C H1(short h) {
2384  return Q6Vect32C(Q6V32_PUT_H1(data, h));
2385  };
2386 
2387  // Set byte methods
2388  Q6Vect32C B0(signed char b) {
2389  return Q6Vect32C(Q6V32_PUT_B0(data, b));
2390  };
2391  Q6Vect32C B1(signed char b) {
2392  return Q6Vect32C(Q6V32_PUT_B1(data, b));
2393  };
2394  Q6Vect32C B2(signed char b) {
2395  return Q6Vect32C(Q6V32_PUT_B2(data, b));
2396  };
2397  Q6Vect32C B3(signed char b) {
2398  return Q6Vect32C(Q6V32_PUT_B3(data, b));
2399  };
2400 
2401 private:
2402  int data;
2403 };
2404 
2405 #endif /* __cplusplus */
2406 
2407 // V65 Vector types
2408 #if __HVX_ARCH__ >= 65
2409 #if defined __HVX__ && (__HVX_LENGTH__ == 128)
2410 typedef long Q6VecPred128 __attribute__((__vector_size__(128)))
2411  __attribute__((aligned(128)));
2412 
2413 typedef long Q6Vect1024 __attribute__((__vector_size__(128)))
2414  __attribute__((aligned(128)));
2415 
2416 typedef long Q6Vect2048 __attribute__((__vector_size__(256)))
2417  __attribute__((aligned(256)));
2418 
2419 #else /* defined __HVX__ && (__HVX_LENGTH__ == 128) */
2420 #if defined __HVX__ && (__HVX_LENGTH__ == 64)
2421 typedef long Q6VecPred64 __attribute__((__vector_size__(64)))
2422  __attribute__((aligned(64)));
2423 
2424 typedef long Q6Vect512 __attribute__((__vector_size__(64)))
2425  __attribute__((aligned(64)));
2426 
2427 typedef long Q6Vect1024 __attribute__((__vector_size__(128)))
2428  __attribute__((aligned(128)));
2429 
2430 #endif /* defined __HVX__ && (__HVX_LENGTH__ == 64) */
2431 #endif /* defined __HVX__ && (__HVX_LENGTH__ == 128) */
2432 #endif /* __HVX_ARCH__ >= 65 */
2433 
2434 /* Predicates */
2435 
2436 typedef int Q6Pred;
2437 
2438 
2439 #ifdef __HVX__
2440 
2441 // Extract HVX VectorPair macro.
2442 #define HEXAGON_HVX_GET_W(v) (v)
2443 
2444 // Extract HVX Vector macros.
2445 #define HEXAGON_HVX_GET_V0(v) \
2446  __extension__({ \
2447  union { \
2448  HVX_VectorPair W; \
2449  HVX_Vector V[2]; \
2450  } _HEXAGON_HVX_internal_union; \
2451  _HEXAGON_HVX_internal_union.W = (v); \
2452  _HEXAGON_HVX_internal_union.V[0]; \
2453  })
2454 #define HEXAGON_HVX_GET_V1(v) \
2455  __extension__({ \
2456  union { \
2457  HVX_VectorPair W; \
2458  HVX_Vector V[2]; \
2459  } _HEXAGON_HVX_internal_union; \
2460  _HEXAGON_HVX_internal_union.W = (v); \
2461  _HEXAGON_HVX_internal_union.V[1]; \
2462  })
2463 #define HEXAGON_HVX_GET_P(v) \
2464  __extension__({ \
2465  union { \
2466  HVX_VectorPair W; \
2467  HVX_VectorPred P[2]; \
2468  } _HEXAGON_HVX_internal_union; \
2469  _HEXAGON_HVX_internal_union.W = (v); \
2470  _HEXAGON_HVX_internal_union.P[0]; \
2471  })
2472 
2473 // Set HVX VectorPair macro.
2474 #define HEXAGON_HVX_PUT_W(v, new) (new)
2475 
2476 // Set HVX Vector macros.
2477 #define HEXAGON_HVX_PUT_V0(v, new) \
2478  __extension__({ \
2479  union { \
2480  HVX_VectorPair W; \
2481  HVX_Vector V[2]; \
2482  } _HEXAGON_HVX_internal_union; \
2483  _HEXAGON_HVX_internal_union.W = (v); \
2484  _HEXAGON_HVX_internal_union.V[0] = (new); \
2485  _HEXAGON_HVX_internal_union.W; \
2486  })
2487 
2488 #define HEXAGON_HVX_PUT_V1(v, new) \
2489  __extension__({ \
2490  union { \
2491  HVX_VectorPair W; \
2492  HVX_Vector V[2]; \
2493  } _HEXAGON_HVX_internal_union; \
2494  _HEXAGON_HVX_internal_union.W = (v); \
2495  _HEXAGON_HVX_internal_union.V[1] = (new); \
2496  _HEXAGON_HVX_internal_union.W; \
2497  })
2498 
2499 #define HEXAGON_HVX_PUT_P(v, new) \
2500  __extension__({ \
2501  union { \
2502  HVX_VectorPair W; \
2503  HVX_VectorPred P[2]; \
2504  } _HEXAGON_HVX_internal_union; \
2505  _HEXAGON_HVX_internal_union.W = (v); \
2506  _HEXAGON_HVX_internal_union.P[0] = (new); \
2507  _HEXAGON_HVX_internal_union.W; \
2508  })
2509 
2510 
2511 #define HEXAGON_HVX_CREATE_W(v1, v0) \
2512  __extension__({ \
2513  union { \
2514  HVX_VectorPair W; \
2515  HVX_Vector V[2]; \
2516  } _HEXAGON_HVX_internal_union; \
2517  _HEXAGON_HVX_internal_union.V[0] = (v0); \
2518  _HEXAGON_HVX_internal_union.V[1] = (v1); \
2519  _HEXAGON_HVX_internal_union.W; \
2520  })
2521 
2522 #ifdef __cplusplus
2523 
2524 class HVX_Vect {
2525 public:
2526  // Constructors.
2527  // Default.
2528  HVX_Vect() : data(Q6_W_vcombine_VV(Q6_V_vzero(), Q6_V_vzero())){};
2529 
2530  // Custom constructors.
2531  HVX_Vect(HVX_VectorPair W) : data(W){};
2532  HVX_Vect(HVX_Vector v1, HVX_Vector v0) : data(HEXAGON_HVX_CREATE_W(v1, v0)){};
2533 
2534  // Copy constructor.
2535  HVX_Vect(const HVX_Vect &W) = default;
2536 
2537  // Move constructor.
2538  HVX_Vect(HVX_Vect &&W) = default;
2539 
2540  // Assignment operator.
2541  HVX_Vect &operator=(const HVX_Vect &W) = default;
2542 
2543  operator HVX_VectorPair() { return data; };
2544 
2545  // Extract VectorPair method.
2546  HVX_VectorPair W(void) { return HEXAGON_HVX_GET_W(data); };
2547 
2548  // Extract Vector methods.
2549  HVX_Vector V0(void) { return HEXAGON_HVX_GET_V0(data); };
2550  HVX_Vector V1(void) { return HEXAGON_HVX_GET_V1(data); };
2551  HVX_VectorPred P(void) { return HEXAGON_HVX_GET_P(data); };
2552 
2553  // NOTE: All set methods return a HVX_Vect type.
2554  // Set HVX VectorPair method.
2555  HVX_Vect W(HVX_VectorPair w) { return HVX_Vect(HEXAGON_HVX_PUT_W(data, w)); };
2556 
2557  // Set HVX Vector methods.
2558  HVX_Vect V0(HVX_Vector v) { return HVX_Vect(HEXAGON_HVX_PUT_V0(data, v)); };
2559  HVX_Vect V1(HVX_Vector v) { return HVX_Vect(HEXAGON_HVX_PUT_V1(data, v)); };
2560  HVX_Vect P(HVX_VectorPred p) { return HVX_Vect(HEXAGON_HVX_PUT_P(data, p)); };
2561 
2562 private:
2563  HVX_VectorPair data;
2564 };
2565 
2566 #endif /* __cplusplus */
2567 #endif /* __HVX__ */
2568 
2569 #define HEXAGON_UDMA_DM0_STATUS_IDLE 0x00000000
2570 #define HEXAGON_UDMA_DM0_STATUS_RUN 0x00000001
2571 #define HEXAGON_UDMA_DM0_STATUS_ERROR 0x00000002
2572 #define HEXAGON_UDMA_DESC_DSTATE_INCOMPLETE 0
2573 #define HEXAGON_UDMA_DESC_DSTATE_COMPLETE 1
2574 #define HEXAGON_UDMA_DESC_ORDER_NOORDER 0
2575 #define HEXAGON_UDMA_DESC_ORDER_ORDER 1
2576 #define HEXAGON_UDMA_DESC_BYPASS_OFF 0
2577 #define HEXAGON_UDMA_DESC_BYPASS_ON 1
2578 #define HEXAGON_UDMA_DESC_COMP_NONE 0
2579 #define HEXAGON_UDMA_DESC_COMP_DLBC 1
2580 #define HEXAGON_UDMA_DESC_DESCTYPE_TYPE0 0
2581 #define HEXAGON_UDMA_DESC_DESCTYPE_TYPE1 1
2582 
2584 {
2585  void *next;
2586  unsigned int length:24;
2587  unsigned int desctype:2;
2588  unsigned int dstcomp:1;
2589  unsigned int srccomp:1;
2590  unsigned int dstbypass:1;
2591  unsigned int srcbypass:1;
2592  unsigned int order:1;
2593  unsigned int dstate:1;
2594  void *src;
2595  void *dst;
2597 
2599 {
2600  void *next;
2601  unsigned int length:24;
2602  unsigned int desctype:2;
2603  unsigned int dstcomp:1;
2604  unsigned int srccomp:1;
2605  unsigned int dstbypass:1;
2606  unsigned int srcbypass:1;
2607  unsigned int order:1;
2608  unsigned int dstate:1;
2609  void *src;
2610  void *dst;
2611  unsigned int allocation:28;
2612  unsigned int padding:4;
2613  unsigned int roiwidth:16;
2614  unsigned int roiheight:16;
2615  unsigned int srcstride:16;
2616  unsigned int dststride:16;
2617  unsigned int srcwidthoffset:16;
2618  unsigned int dstwidthoffset:16;
2620 
2621 #endif /* !HEXAGON_TYPES_H */
StringRef P
const Decl * D
__device__ __2f16 b
__device__ int
do v
Definition: arm_acle.h:91
#define HEXAGON_V64_PUT_H0(v, new)
#define HEXAGON_V32_GET_UH0(v)
#define Q6V64_GET_H1(v)
#define Q6V64_GET_UB2(v)
#define Q6V64_PUT_H0(v, new)
#define Q6V64_GET_W1(v)
#define Q6V64_PUT_W1(v, new)
#define HEXAGON_V64_GET_UB6(v)
#define HEXAGON_V32_GET_UW(v)
#define HEXAGON_V64_GET_UH3(v)
#define HEXAGON_V64_PUT_B0(v, new)
#define HEXAGON_V64_GET_B6(v)
#define Q6V64_PUT_B0(v, new)
#define Q6V32_GET_UB2(v)
#define Q6V64_GET_B6(v)
#define HEXAGON_V32_GET_B2(v)
#define HEXAGON_V32_PUT_H1(v, new)
#define HEXAGON_V32_GET_B1(v)
#define Q6V32_PUT_H1(v, new)
#define Q6V32_GET_UB0(v)
#define HEXAGON_V64_PUT_B1(v, new)
#define Q6V64_GET_UB0(v)
#define Q6V64_GET_B3(v)
#define Q6V32_GET_UH1(v)
#define HEXAGON_V32_PUT_B2(v, new)
int HEXAGON_Vect32
#define HEXAGON_V64_PUT_B7(v, new)
#define HEXAGON_V32_PUT_B3(v, new)
#define HEXAGON_V32_GET_H0(v)
#define HEXAGON_V64_GET_B0(v)
#define Q6V32_GET_B0(v)
#define Q6V64_GET_UB5(v)
#define Q6V64_GET_UB3(v)
#define Q6V32_GET_UH0(v)
#define Q6V64_GET_UH0(v)
#define Q6V64_GET_B1(v)
#define Q6V64_GET_UW1(v)
#define Q6V64_PUT_B3(v, new)
#define Q6V64_GET_UB4(v)
#define HEXAGON_V64_GET_B5(v)
#define Q6V64_GET_B2(v)
#define HEXAGON_V64_GET_UB7(v)
#define HEXAGON_V64_GET_UB5(v)
#define Q6V64_CREATE_H(h3, h2, h1, h0)
#define HEXAGON_V64_CREATE_W(w1, w0)
#define HEXAGON_V64_PUT_H2(v, new)
#define HEXAGON_V32_GET_H1(v)
#define HEXAGON_V32_GET_UB2(v)
#define HEXAGON_V32_PUT_B1(v, new)
int Q6Pred
#define HEXAGON_V64_GET_UB2(v)
#define Q6V64_GET_UB6(v)
#define Q6V32_PUT_W(v, new)
#define Q6V32_GET_UW(v)
#define Q6V32_CREATE_H(h1, h0)
#define HEXAGON_V64_GET_B3(v)
#define HEXAGON_V64_GET_B2(v)
#define HEXAGON_V64_CREATE_H(h3, h2, h1, h0)
#define HEXAGON_V64_GET_UB1(v)
#define HEXAGON_V64_PUT_D(v, new)
#define Q6V64_GET_B0(v)
#define Q6V64_PUT_H2(v, new)
#define HEXAGON_V64_GET_D(v)
Definition: hexagon_types.h:72
#define Q6V64_GET_B4(v)
#define Q6V64_CREATE_W(w1, w0)
#define Q6V32_GET_B3(v)
long long __attribute__((__may_alias__)) HEXAGON_Vect64
Definition: hexagon_types.h:68
#define Q6V64_GET_H0(v)
#define HEXAGON_V64_GET_W1(v)
Definition: hexagon_types.h:86
#define HEXAGON_V64_GET_B7(v)
#define HEXAGON_V64_GET_UW1(v)
#define HEXAGON_V64_PUT_B6(v, new)
#define Q6V64_PUT_H1(v, new)
#define Q6V64_GET_UD(v)
#define Q6V64_PUT_W0(v, new)
#define Q6V64_GET_D(v)
#define HEXAGON_V32_PUT_H0(v, new)
#define Q6V64_GET_UH2(v)
#define HEXAGON_V64_GET_B4(v)
#define HEXAGON_V32_GET_UB1(v)
#define Q6V64_GET_W0(v)
#define Q6V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0)
#define Q6V32_PUT_B1(v, new)
#define Q6V32_GET_UB3(v)
#define Q6V32_GET_W(v)
#define Q6V64_GET_UW0(v)
#define Q6V64_PUT_B2(v, new)
#define HEXAGON_V32_GET_W(v)
struct hexagon_udma_descriptor_type0_s hexagon_udma_descriptor_type0_t
#define HEXAGON_V64_PUT_B3(v, new)
#define HEXAGON_V64_PUT_B2(v, new)
#define HEXAGON_V64_GET_UH0(v)
#define HEXAGON_V64_GET_W0(v)
Definition: hexagon_types.h:77
#define Q6V64_GET_UB7(v)
#define Q6V64_GET_UH3(v)
#define Q6V64_GET_B7(v)
#define HEXAGON_V32_GET_B0(v)
#define HEXAGON_V32_PUT_W(v, new)
#define HEXAGON_V64_GET_H3(v)
#define HEXAGON_V64_GET_H2(v)
#define Q6V32_GET_UB1(v)
#define HEXAGON_V32_GET_UH1(v)
#define Q6V64_GET_UH1(v)
#define Q6V32_CREATE_B(b3, b2, b1, b0)
#define Q6V64_PUT_B1(v, new)
#define HEXAGON_V32_GET_UB3(v)
#define HEXAGON_V32_CREATE_B(b3, b2, b1, b0)
#define Q6V32_GET_H1(v)
#define HEXAGON_V64_GET_UB4(v)
#define Q6V64_GET_H2(v)
#define HEXAGON_V64_PUT_H3(v, new)
#define Q6V32_GET_B2(v)
#define Q6V32_GET_H0(v)
#define HEXAGON_V64_GET_H1(v)
#define HEXAGON_V32_GET_B3(v)
#define Q6V64_PUT_H3(v, new)
#define Q6V64_PUT_D(v, new)
#define HEXAGON_V32_GET_UB0(v)
#define Q6V32_PUT_B0(v, new)
#define Q6V64_GET_B5(v)
#define Q6V64_PUT_B4(v, new)
#define HEXAGON_V64_GET_UW0(v)
Definition: hexagon_types.h:95
#define Q6V64_GET_UB1(v)
#define HEXAGON_V64_PUT_H1(v, new)
#define Q6V64_GET_H3(v)
#define HEXAGON_V64_GET_UH2(v)
#define Q6V32_PUT_H0(v, new)
#define Q6V32_PUT_B2(v, new)
#define Q6V64_PUT_B5(v, new)
#define HEXAGON_V64_PUT_W0(v, new)
#define HEXAGON_V64_PUT_B4(v, new)
#define Q6V32_GET_B1(v)
struct hexagon_udma_descriptor_type1_s hexagon_udma_descriptor_type1_t
#define Q6V64_PUT_B7(v, new)
#define HEXAGON_V64_GET_UB0(v)
#define HEXAGON_V32_CREATE_H(h1, h0)
#define HEXAGON_V64_GET_UB3(v)
int Q6Vect32
#define HEXAGON_V64_GET_H0(v)
#define HEXAGON_V64_GET_UD(v)
Definition: hexagon_types.h:73
#define HEXAGON_V64_PUT_B5(v, new)
#define HEXAGON_V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0)
#define HEXAGON_V32_PUT_B0(v, new)
#define HEXAGON_V64_PUT_W1(v, new)
int HEXAGON_Pred
#define Q6V64_PUT_B6(v, new)
#define Q6V32_PUT_B3(v, new)
#define HEXAGON_V64_GET_UH1(v)
#define HEXAGON_V64_GET_B1(v)
constexpr bool aligned(uintptr_t Value)
Definition: PrimType.h:130