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 
2583 typedef struct hexagon_udma_descriptor_type0_s
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;
2596 } hexagon_udma_descriptor_type0_t;
2597 
2598 typedef struct hexagon_udma_descriptor_type1_s
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;
2619 } hexagon_udma_descriptor_type1_t;
2620 
2621 #endif /* !HEXAGON_TYPES_H */
2622