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
data(d)629   HEXAGON_Vect64C(long long d = 0) : data(d) {};
HEXAGON_Vect64C(int w1,int w0)630   HEXAGON_Vect64C(int w1, int w0) : data(HEXAGON_V64_CREATE_W(w1, w0)) {};
HEXAGON_Vect64C(short h3,short h2,short h1,short h0)631   HEXAGON_Vect64C(short h3, short h2, short h1, short h0)
632       : data(HEXAGON_V64_CREATE_H(h3, h2, h1, h0)) {};
HEXAGON_Vect64C(signed char b7,signed char b6,signed char b5,signed char b4,signed char b3,signed char b2,signed char b1,signed char b0)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)) {};
HEXAGON_Vect64C(const HEXAGON_Vect64C & v)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
D(void)648   long long D(void) {
649     return HEXAGON_V64_GET_D(data);
650   };
UD(void)651   unsigned long long UD(void) {
652     return HEXAGON_V64_GET_UD(data);
653   };
654 
655   // Extract word methods
W0(void)656   int W0(void) {
657     return HEXAGON_V64_GET_W0(data);
658   };
W1(void)659   int W1(void) {
660     return HEXAGON_V64_GET_W1(data);
661   };
UW0(void)662   unsigned int UW0(void) {
663     return HEXAGON_V64_GET_UW0(data);
664   };
UW1(void)665   unsigned int UW1(void) {
666     return HEXAGON_V64_GET_UW1(data);
667   };
668 
669   // Extract half word methods
H0(void)670   short H0(void) {
671     return HEXAGON_V64_GET_H0(data);
672   };
H1(void)673   short H1(void) {
674     return HEXAGON_V64_GET_H1(data);
675   };
H2(void)676   short H2(void) {
677     return HEXAGON_V64_GET_H2(data);
678   };
H3(void)679   short H3(void) {
680     return HEXAGON_V64_GET_H3(data);
681   };
UH0(void)682   unsigned short UH0(void) {
683     return HEXAGON_V64_GET_UH0(data);
684   };
UH1(void)685   unsigned short UH1(void) {
686     return HEXAGON_V64_GET_UH1(data);
687   };
UH2(void)688   unsigned short UH2(void) {
689     return HEXAGON_V64_GET_UH2(data);
690   };
UH3(void)691   unsigned short UH3(void) {
692     return HEXAGON_V64_GET_UH3(data);
693   };
694 
695   // Extract byte methods
B0(void)696   signed char B0(void) {
697     return HEXAGON_V64_GET_B0(data);
698   };
B1(void)699   signed char B1(void) {
700     return HEXAGON_V64_GET_B1(data);
701   };
B2(void)702   signed char B2(void) {
703     return HEXAGON_V64_GET_B2(data);
704   };
B3(void)705   signed char B3(void) {
706     return HEXAGON_V64_GET_B3(data);
707   };
B4(void)708   signed char B4(void) {
709     return HEXAGON_V64_GET_B4(data);
710   };
B5(void)711   signed char B5(void) {
712     return HEXAGON_V64_GET_B5(data);
713   };
B6(void)714   signed char B6(void) {
715     return HEXAGON_V64_GET_B6(data);
716   };
B7(void)717   signed char B7(void) {
718     return HEXAGON_V64_GET_B7(data);
719   };
UB0(void)720   unsigned char UB0(void) {
721     return HEXAGON_V64_GET_UB0(data);
722   };
UB1(void)723   unsigned char UB1(void) {
724     return HEXAGON_V64_GET_UB1(data);
725   };
UB2(void)726   unsigned char UB2(void) {
727     return HEXAGON_V64_GET_UB2(data);
728   };
UB3(void)729   unsigned char UB3(void) {
730     return HEXAGON_V64_GET_UB3(data);
731   };
UB4(void)732   unsigned char UB4(void) {
733     return HEXAGON_V64_GET_UB4(data);
734   };
UB5(void)735   unsigned char UB5(void) {
736     return HEXAGON_V64_GET_UB5(data);
737   };
UB6(void)738   unsigned char UB6(void) {
739     return HEXAGON_V64_GET_UB6(data);
740   };
UB7(void)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
D(long long d)748   HEXAGON_Vect64C D(long long d) {
749     return HEXAGON_Vect64C(HEXAGON_V64_PUT_D(data, d));
750   };
751 
752   // Set word methods
W0(int w)753   HEXAGON_Vect64C W0(int w) {
754     return HEXAGON_Vect64C(HEXAGON_V64_PUT_W0(data, w));
755   };
W1(int w)756   HEXAGON_Vect64C W1(int w) {
757     return HEXAGON_Vect64C(HEXAGON_V64_PUT_W1(data, w));
758   };
759 
760   // Set half word methods
H0(short h)761   HEXAGON_Vect64C H0(short h) {
762     return HEXAGON_Vect64C(HEXAGON_V64_PUT_H0(data, h));
763   };
H1(short h)764   HEXAGON_Vect64C H1(short h) {
765     return HEXAGON_Vect64C(HEXAGON_V64_PUT_H1(data, h));
766   };
H2(short h)767   HEXAGON_Vect64C H2(short h) {
768     return HEXAGON_Vect64C(HEXAGON_V64_PUT_H2(data, h));
769   };
H3(short h)770   HEXAGON_Vect64C H3(short h) {
771     return HEXAGON_Vect64C(HEXAGON_V64_PUT_H3(data, h));
772   };
773 
774   // Set byte methods
B0(signed char b)775   HEXAGON_Vect64C B0(signed char b) {
776     return HEXAGON_Vect64C(HEXAGON_V64_PUT_B0(data, b));
777   };
B1(signed char b)778   HEXAGON_Vect64C B1(signed char b) {
779     return HEXAGON_Vect64C(HEXAGON_V64_PUT_B1(data, b));
780   };
B2(signed char b)781   HEXAGON_Vect64C B2(signed char b) {
782     return HEXAGON_Vect64C(HEXAGON_V64_PUT_B2(data, b));
783   };
B3(signed char b)784   HEXAGON_Vect64C B3(signed char b) {
785     return HEXAGON_Vect64C(HEXAGON_V64_PUT_B3(data, b));
786   };
B4(signed char b)787   HEXAGON_Vect64C B4(signed char b) {
788     return HEXAGON_Vect64C(HEXAGON_V64_PUT_B4(data, b));
789   };
B5(signed char b)790   HEXAGON_Vect64C B5(signed char b) {
791     return HEXAGON_Vect64C(HEXAGON_V64_PUT_B5(data, b));
792   };
B6(signed char b)793   HEXAGON_Vect64C B6(signed char b) {
794     return HEXAGON_Vect64C(HEXAGON_V64_PUT_B6(data, b));
795   };
B7(signed char b)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
data(w)1082   HEXAGON_Vect32C(int w = 0) : data(w) {};
HEXAGON_Vect32C(short h1,short h0)1083   HEXAGON_Vect32C(short h1, short h0) : data(HEXAGON_V32_CREATE_H(h1, h0)) {};
HEXAGON_Vect32C(signed char b3,signed char b2,signed char b1,signed char b0)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)) {};
HEXAGON_Vect32C(const HEXAGON_Vect32C & v)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
W(void)1098   int W(void) {
1099     return HEXAGON_V32_GET_W(data);
1100   };
UW(void)1101   unsigned int UW(void) {
1102     return HEXAGON_V32_GET_UW(data);
1103   };
1104 
1105   // Extract half word methods
H0(void)1106   short H0(void) {
1107     return HEXAGON_V32_GET_H0(data);
1108   };
H1(void)1109   short H1(void) {
1110     return HEXAGON_V32_GET_H1(data);
1111   };
UH0(void)1112   unsigned short UH0(void) {
1113     return HEXAGON_V32_GET_UH0(data);
1114   };
UH1(void)1115   unsigned short UH1(void) {
1116     return HEXAGON_V32_GET_UH1(data);
1117   };
1118 
1119   // Extract byte methods
B0(void)1120   signed char B0(void) {
1121     return HEXAGON_V32_GET_B0(data);
1122   };
B1(void)1123   signed char B1(void) {
1124     return HEXAGON_V32_GET_B1(data);
1125   };
B2(void)1126   signed char B2(void) {
1127     return HEXAGON_V32_GET_B2(data);
1128   };
B3(void)1129   signed char B3(void) {
1130     return HEXAGON_V32_GET_B3(data);
1131   };
UB0(void)1132   unsigned char UB0(void) {
1133     return HEXAGON_V32_GET_UB0(data);
1134   };
UB1(void)1135   unsigned char UB1(void) {
1136     return HEXAGON_V32_GET_UB1(data);
1137   };
UB2(void)1138   unsigned char UB2(void) {
1139     return HEXAGON_V32_GET_UB2(data);
1140   };
UB3(void)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
W(int w)1148   HEXAGON_Vect32C W(int w) {
1149     return HEXAGON_Vect32C(HEXAGON_V32_PUT_W(data, w));
1150   };
1151 
1152   // Set half word methods
H0(short h)1153   HEXAGON_Vect32C H0(short h) {
1154     return HEXAGON_Vect32C(HEXAGON_V32_PUT_H0(data, h));
1155   };
H1(short h)1156   HEXAGON_Vect32C H1(short h) {
1157     return HEXAGON_Vect32C(HEXAGON_V32_PUT_H1(data, h));
1158   };
1159 
1160   // Set byte methods
B0(signed char b)1161   HEXAGON_Vect32C B0(signed char b) {
1162     return HEXAGON_Vect32C(HEXAGON_V32_PUT_B0(data, b));
1163   };
B1(signed char b)1164   HEXAGON_Vect32C B1(signed char b) {
1165     return HEXAGON_Vect32C(HEXAGON_V32_PUT_B1(data, b));
1166   };
B2(signed char b)1167   HEXAGON_Vect32C B2(signed char b) {
1168     return HEXAGON_Vect32C(HEXAGON_V32_PUT_B2(data, b));
1169   };
B3(signed char b)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 Silver types
1181 #if __Q6S_ARCH__ >= 65
1182   // Silver vector types are 128 bytes, and pairs are 256. The vector predicate
1183   // types are 16 bytes and 32 bytes for pairs.
1184   typedef long HEXAGON_VecPred128 __attribute__((__vector_size__(16)))
1185     __attribute__((aligned(128)));
1186 
1187   typedef long HEXAGON_VecPred256 __attribute__((__vector_size__(32)))
1188     __attribute__((aligned(128)));
1189 
1190   typedef long HEXAGON_Vect1024 __attribute__((__vector_size__(128)))
1191     __attribute__((aligned(128)));
1192 
1193   typedef long HEXAGON_Vect2048 __attribute__((__vector_size__(256)))
1194     __attribute__((aligned(256)));
1195 
1196   typedef long HEXAGON_UVect1024 __attribute__((__vector_size__(128)))
1197     __attribute__((aligned(4)));
1198 
1199   typedef long HEXAGON_UVect2048 __attribute__((__vector_size__(256)))
1200     __attribute__((aligned(4)));
1201 
1202   #define Q6S_VectorPredPair HEXAGON_VecPred256
1203   #define Q6S_VectorPred     HEXAGON_VecPred128
1204   #define Q6S_Vector         HEXAGON_Vect1024
1205   #define Q6S_VectorPair     HEXAGON_Vect2048
1206   #define Q6S_UVector        HEXAGON_UVect1024
1207   #define Q6S_UVectorPair    HEXAGON_UVect2048
1208 
1209 #else /* __Q6S_ARCH__ >= 65 */
1210 
1211 // V65 Vector types
1212 #if __HVX_ARCH__ >= 65
1213 #if defined __HVX__ && (__HVX_LENGTH__ == 128)
1214   typedef long HEXAGON_VecPred128 __attribute__((__vector_size__(128)))
1215     __attribute__((aligned(128)));
1216 
1217   typedef long HEXAGON_Vect1024 __attribute__((__vector_size__(128)))
1218     __attribute__((aligned(128)));
1219 
1220   typedef long HEXAGON_Vect2048 __attribute__((__vector_size__(256)))
1221     __attribute__((aligned(256)));
1222 
1223   typedef long HEXAGON_UVect1024 __attribute__((__vector_size__(128)))
1224     __attribute__((aligned(4)));
1225 
1226   typedef long HEXAGON_UVect2048 __attribute__((__vector_size__(256)))
1227     __attribute__((aligned(4)));
1228 
1229   #define HVX_VectorPred     HEXAGON_VecPred128
1230   #define HVX_Vector         HEXAGON_Vect1024
1231   #define HVX_VectorPair     HEXAGON_Vect2048
1232   #define HVX_UVector        HEXAGON_UVect1024
1233   #define HVX_UVectorPair    HEXAGON_UVect2048
1234 #else /* defined __HVX__ && (__HVX_LENGTH__ == 128) */
1235 #if defined __HVX__ &&  (__HVX_LENGTH__ == 64)
1236   typedef long HEXAGON_VecPred64 __attribute__((__vector_size__(64)))
1237     __attribute__((aligned(64)));
1238 
1239   typedef long HEXAGON_Vect512 __attribute__((__vector_size__(64)))
1240     __attribute__((aligned(64)));
1241 
1242   typedef long HEXAGON_Vect1024 __attribute__((__vector_size__(128)))
1243     __attribute__((aligned(128)));
1244 
1245   typedef long HEXAGON_UVect512 __attribute__((__vector_size__(64)))
1246     __attribute__((aligned(4)));
1247 
1248   typedef long HEXAGON_UVect1024 __attribute__((__vector_size__(128)))
1249     __attribute__((aligned(4)));
1250 
1251   #define HVX_VectorPred     HEXAGON_VecPred64
1252   #define HVX_Vector         HEXAGON_Vect512
1253   #define HVX_VectorPair     HEXAGON_Vect1024
1254   #define HVX_UVector        HEXAGON_UVect512
1255   #define HVX_UVectorPair    HEXAGON_UVect1024
1256 #endif /* defined __HVX__ &&  (__HVX_LENGTH__ == 64) */
1257 #endif /* defined __HVX__ && (__HVX_LENGTH__ == 128) */
1258 #endif /* __HVX_ARCH__ >= 65 */
1259 #endif /* __Q6S_ARCH__ >= 65 */
1260 
1261 /* Predicates */
1262 
1263 typedef int HEXAGON_Pred;
1264 
1265 /***
1266  *** backward compatibility aliases
1267  ***/
1268 
1269 /* Old names */
1270 #define Q6Vect Q6Vect64
1271 #define Q6V_GET_D Q6V64_GET_D
1272 #define Q6V_GET_UD Q6V64_GET_UD
1273 #define Q6V_GET_W0 Q6V64_GET_W0
1274 #define Q6V_GET_W1 Q6V64_GET_W1
1275 #define Q6V_GET_UW0 Q6V64_GET_UW0
1276 #define Q6V_GET_UW1 Q6V64_GET_UW1
1277 #define Q6V_GET_H0 Q6V64_GET_H0
1278 #define Q6V_GET_H1 Q6V64_GET_H1
1279 #define Q6V_GET_H2 Q6V64_GET_H2
1280 #define Q6V_GET_H3 Q6V64_GET_H3
1281 #define Q6V_GET_UH0 Q6V64_GET_UH0
1282 #define Q6V_GET_UH1 Q6V64_GET_UH1
1283 #define Q6V_GET_UH2 Q6V64_GET_UH2
1284 #define Q6V_GET_UH3 Q6V64_GET_UH3
1285 #define Q6V_GET_B0 Q6V64_GET_B0
1286 #define Q6V_GET_B1 Q6V64_GET_B1
1287 #define Q6V_GET_B2 Q6V64_GET_B2
1288 #define Q6V_GET_B3 Q6V64_GET_B3
1289 #define Q6V_GET_B4 Q6V64_GET_B4
1290 #define Q6V_GET_B5 Q6V64_GET_B5
1291 #define Q6V_GET_B6 Q6V64_GET_B6
1292 #define Q6V_GET_B7 Q6V64_GET_B7
1293 #define Q6V_GET_UB0 Q6V64_GET_UB0
1294 #define Q6V_GET_UB1 Q6V64_GET_UB1
1295 #define Q6V_GET_UB2 Q6V64_GET_UB2
1296 #define Q6V_GET_UB3 Q6V64_GET_UB3
1297 #define Q6V_GET_UB4 Q6V64_GET_UB4
1298 #define Q6V_GET_UB5 Q6V64_GET_UB5
1299 #define Q6V_GET_UB6 Q6V64_GET_UB6
1300 #define Q6V_GET_UB7 Q6V64_GET_UB7
1301 #define Q6V_PUT_D Q6V64_PUT_D
1302 #define Q6V_PUT_W0 Q6V64_PUT_W0
1303 #define Q6V_PUT_W1 Q6V64_PUT_W1
1304 #define Q6V_PUT_H0 Q6V64_PUT_H0
1305 #define Q6V_PUT_H1 Q6V64_PUT_H1
1306 #define Q6V_PUT_H2 Q6V64_PUT_H2
1307 #define Q6V_PUT_H3 Q6V64_PUT_H3
1308 #define Q6V_PUT_B0 Q6V64_PUT_B0
1309 #define Q6V_PUT_B1 Q6V64_PUT_B1
1310 #define Q6V_PUT_B2 Q6V64_PUT_B2
1311 #define Q6V_PUT_B3 Q6V64_PUT_B3
1312 #define Q6V_PUT_B4 Q6V64_PUT_B4
1313 #define Q6V_PUT_B5 Q6V64_PUT_B5
1314 #define Q6V_PUT_B6 Q6V64_PUT_B6
1315 #define Q6V_PUT_B7 Q6V64_PUT_B7
1316 #define Q6V_CREATE_D Q6V64_CREATE_D
1317 #define Q6V_CREATE_W Q6V64_CREATE_W
1318 #define Q6V_CREATE_H Q6V64_CREATE_H
1319 #define Q6V_CREATE_B Q6V64_CREATE_B
1320 
1321 #ifdef __cplusplus
1322 #define Q6VectC Q6Vect64C
1323 #endif /* __cplusplus */
1324 
1325 /* 64 Bit Vectors */
1326 
1327 typedef long long __attribute__((__may_alias__)) Q6Vect64;
1328 
1329 /* Extract doubleword macros */
1330 
1331 #define Q6V64_GET_D(v) (v)
1332 #define Q6V64_GET_UD(v) ((unsigned long long)(v))
1333 
1334 /* Extract word macros */
1335 
1336 #define Q6V64_GET_W0(v)                                                        \
1337   __extension__({                                                              \
1338     union {                                                                    \
1339       long long d;                                                             \
1340       int w[2];                                                                \
1341     } _Q6V64_internal_union;                                                   \
1342     _Q6V64_internal_union.d = (v);                                             \
1343     _Q6V64_internal_union.w[0];                                                \
1344   })
1345 #define Q6V64_GET_W1(v)                                                        \
1346   __extension__({                                                              \
1347     union {                                                                    \
1348       long long d;                                                             \
1349       int w[2];                                                                \
1350     } _Q6V64_internal_union;                                                   \
1351     _Q6V64_internal_union.d = (v);                                             \
1352     _Q6V64_internal_union.w[1];                                                \
1353   })
1354 #define Q6V64_GET_UW0(v)                                                       \
1355   __extension__({                                                              \
1356     union {                                                                    \
1357       long long d;                                                             \
1358       unsigned int uw[2];                                                      \
1359     } _Q6V64_internal_union;                                                   \
1360     _Q6V64_internal_union.d = (v);                                             \
1361     _Q6V64_internal_union.uw[0];                                               \
1362   })
1363 #define Q6V64_GET_UW1(v)                                                       \
1364   __extension__({                                                              \
1365     union {                                                                    \
1366       long long d;                                                             \
1367       unsigned int uw[2];                                                      \
1368     } _Q6V64_internal_union;                                                   \
1369     _Q6V64_internal_union.d = (v);                                             \
1370     _Q6V64_internal_union.uw[1];                                               \
1371   })
1372 
1373 /* Extract half word macros */
1374 
1375 #define Q6V64_GET_H0(v)                                                        \
1376   __extension__({                                                              \
1377     union {                                                                    \
1378       long long d;                                                             \
1379       short h[4];                                                              \
1380     } _Q6V64_internal_union;                                                   \
1381     _Q6V64_internal_union.d = (v);                                             \
1382     _Q6V64_internal_union.h[0];                                                \
1383   })
1384 #define Q6V64_GET_H1(v)                                                        \
1385   __extension__({                                                              \
1386     union {                                                                    \
1387       long long d;                                                             \
1388       short h[4];                                                              \
1389     } _Q6V64_internal_union;                                                   \
1390     _Q6V64_internal_union.d = (v);                                             \
1391     _Q6V64_internal_union.h[1];                                                \
1392   })
1393 #define Q6V64_GET_H2(v)                                                        \
1394   __extension__({                                                              \
1395     union {                                                                    \
1396       long long d;                                                             \
1397       short h[4];                                                              \
1398     } _Q6V64_internal_union;                                                   \
1399     _Q6V64_internal_union.d = (v);                                             \
1400     _Q6V64_internal_union.h[2];                                                \
1401   })
1402 #define Q6V64_GET_H3(v)                                                        \
1403   __extension__({                                                              \
1404     union {                                                                    \
1405       long long d;                                                             \
1406       short h[4];                                                              \
1407     } _Q6V64_internal_union;                                                   \
1408     _Q6V64_internal_union.d = (v);                                             \
1409     _Q6V64_internal_union.h[3];                                                \
1410   })
1411 #define Q6V64_GET_UH0(v)                                                       \
1412   __extension__({                                                              \
1413     union {                                                                    \
1414       long long d;                                                             \
1415       unsigned short uh[4];                                                    \
1416     } _Q6V64_internal_union;                                                   \
1417     _Q6V64_internal_union.d = (v);                                             \
1418     _Q6V64_internal_union.uh[0];                                               \
1419   })
1420 #define Q6V64_GET_UH1(v)                                                       \
1421   __extension__({                                                              \
1422     union {                                                                    \
1423       long long d;                                                             \
1424       unsigned short uh[4];                                                    \
1425     } _Q6V64_internal_union;                                                   \
1426     _Q6V64_internal_union.d = (v);                                             \
1427     _Q6V64_internal_union.uh[1];                                               \
1428   })
1429 #define Q6V64_GET_UH2(v)                                                       \
1430   __extension__({                                                              \
1431     union {                                                                    \
1432       long long d;                                                             \
1433       unsigned short uh[4];                                                    \
1434     } _Q6V64_internal_union;                                                   \
1435     _Q6V64_internal_union.d = (v);                                             \
1436     _Q6V64_internal_union.uh[2];                                               \
1437   })
1438 #define Q6V64_GET_UH3(v)                                                       \
1439   __extension__({                                                              \
1440     union {                                                                    \
1441       long long d;                                                             \
1442       unsigned short uh[4];                                                    \
1443     } _Q6V64_internal_union;                                                   \
1444     _Q6V64_internal_union.d = (v);                                             \
1445     _Q6V64_internal_union.uh[3];                                               \
1446   })
1447 
1448 /* Extract byte macros */
1449 
1450 #define Q6V64_GET_B0(v)                                                        \
1451   __extension__({                                                              \
1452     union {                                                                    \
1453       long long d;                                                             \
1454       signed char b[8];                                                        \
1455     } _Q6V64_internal_union;                                                   \
1456     _Q6V64_internal_union.d = (v);                                             \
1457     _Q6V64_internal_union.b[0];                                                \
1458   })
1459 #define Q6V64_GET_B1(v)                                                        \
1460   __extension__({                                                              \
1461     union {                                                                    \
1462       long long d;                                                             \
1463       signed char b[8];                                                        \
1464     } _Q6V64_internal_union;                                                   \
1465     _Q6V64_internal_union.d = (v);                                             \
1466     _Q6V64_internal_union.b[1];                                                \
1467   })
1468 #define Q6V64_GET_B2(v)                                                        \
1469   __extension__({                                                              \
1470     union {                                                                    \
1471       long long d;                                                             \
1472       signed char b[8];                                                        \
1473     } _Q6V64_internal_union;                                                   \
1474     _Q6V64_internal_union.d = (v);                                             \
1475     _Q6V64_internal_union.b[2];                                                \
1476   })
1477 #define Q6V64_GET_B3(v)                                                        \
1478   __extension__({                                                              \
1479     union {                                                                    \
1480       long long d;                                                             \
1481       signed char b[8];                                                        \
1482     } _Q6V64_internal_union;                                                   \
1483     _Q6V64_internal_union.d = (v);                                             \
1484     _Q6V64_internal_union.b[3];                                                \
1485   })
1486 #define Q6V64_GET_B4(v)                                                        \
1487   __extension__({                                                              \
1488     union {                                                                    \
1489       long long d;                                                             \
1490       signed char b[8];                                                        \
1491     } _Q6V64_internal_union;                                                   \
1492     _Q6V64_internal_union.d = (v);                                             \
1493     _Q6V64_internal_union.b[4];                                                \
1494   })
1495 #define Q6V64_GET_B5(v)                                                        \
1496   __extension__({                                                              \
1497     union {                                                                    \
1498       long long d;                                                             \
1499       signed char b[8];                                                        \
1500     } _Q6V64_internal_union;                                                   \
1501     _Q6V64_internal_union.d = (v);                                             \
1502     _Q6V64_internal_union.b[5];                                                \
1503   })
1504 #define Q6V64_GET_B6(v)                                                        \
1505   __extension__({                                                              \
1506     union {                                                                    \
1507       long long d;                                                             \
1508       signed char b[8];                                                        \
1509     } _Q6V64_internal_union;                                                   \
1510     _Q6V64_internal_union.d = (v);                                             \
1511     _Q6V64_internal_union.b[6];                                                \
1512   })
1513 #define Q6V64_GET_B7(v)                                                        \
1514   __extension__({                                                              \
1515     union {                                                                    \
1516       long long d;                                                             \
1517       signed char b[8];                                                        \
1518     } _Q6V64_internal_union;                                                   \
1519     _Q6V64_internal_union.d = (v);                                             \
1520     _Q6V64_internal_union.b[7];                                                \
1521   })
1522 #define Q6V64_GET_UB0(v)                                                       \
1523   __extension__({                                                              \
1524     union {                                                                    \
1525       long long d;                                                             \
1526       unsigned char ub[8];                                                     \
1527     } _Q6V64_internal_union;                                                   \
1528     _Q6V64_internal_union.d = (v);                                             \
1529     _Q6V64_internal_union.ub[0];                                               \
1530   })
1531 #define Q6V64_GET_UB1(v)                                                       \
1532   __extension__({                                                              \
1533     union {                                                                    \
1534       long long d;                                                             \
1535       unsigned char ub[8];                                                     \
1536     } _Q6V64_internal_union;                                                   \
1537     _Q6V64_internal_union.d = (v);                                             \
1538     _Q6V64_internal_union.ub[1];                                               \
1539   })
1540 #define Q6V64_GET_UB2(v)                                                       \
1541   __extension__({                                                              \
1542     union {                                                                    \
1543       long long d;                                                             \
1544       unsigned char ub[8];                                                     \
1545     } _Q6V64_internal_union;                                                   \
1546     _Q6V64_internal_union.d = (v);                                             \
1547     _Q6V64_internal_union.ub[2];                                               \
1548   })
1549 #define Q6V64_GET_UB3(v)                                                       \
1550   __extension__({                                                              \
1551     union {                                                                    \
1552       long long d;                                                             \
1553       unsigned char ub[8];                                                     \
1554     } _Q6V64_internal_union;                                                   \
1555     _Q6V64_internal_union.d = (v);                                             \
1556     _Q6V64_internal_union.ub[3];                                               \
1557   })
1558 #define Q6V64_GET_UB4(v)                                                       \
1559   __extension__({                                                              \
1560     union {                                                                    \
1561       long long d;                                                             \
1562       unsigned char ub[8];                                                     \
1563     } _Q6V64_internal_union;                                                   \
1564     _Q6V64_internal_union.d = (v);                                             \
1565     _Q6V64_internal_union.ub[4];                                               \
1566   })
1567 #define Q6V64_GET_UB5(v)                                                       \
1568   __extension__({                                                              \
1569     union {                                                                    \
1570       long long d;                                                             \
1571       unsigned char ub[8];                                                     \
1572     } _Q6V64_internal_union;                                                   \
1573     _Q6V64_internal_union.d = (v);                                             \
1574     _Q6V64_internal_union.ub[5];                                               \
1575   })
1576 #define Q6V64_GET_UB6(v)                                                       \
1577   __extension__({                                                              \
1578     union {                                                                    \
1579       long long d;                                                             \
1580       unsigned char ub[8];                                                     \
1581     } _Q6V64_internal_union;                                                   \
1582     _Q6V64_internal_union.d = (v);                                             \
1583     _Q6V64_internal_union.ub[6];                                               \
1584   })
1585 #define Q6V64_GET_UB7(v)                                                       \
1586   __extension__({                                                              \
1587     union {                                                                    \
1588       long long d;                                                             \
1589       unsigned char ub[8];                                                     \
1590     } _Q6V64_internal_union;                                                   \
1591     _Q6V64_internal_union.d = (v);                                             \
1592     _Q6V64_internal_union.ub[7];                                               \
1593   })
1594 
1595 /* NOTE: All set macros return a Q6Vect64 type */
1596 
1597 /* Set doubleword macro */
1598 
1599 #define Q6V64_PUT_D(v, new) (new)
1600 
1601 /* Set word macros */
1602 
1603 #ifdef __qdsp6__
1604 
1605 #define Q6V64_PUT_W0(v, new)                                                   \
1606   __extension__({                                                              \
1607     union {                                                                    \
1608       long long d;                                                             \
1609       int w[2];                                                                \
1610     } _Q6V64_internal_union;                                                   \
1611     _Q6V64_internal_union.d = (v);                                             \
1612     _Q6V64_internal_union.w[0] = (new);                                        \
1613     _Q6V64_internal_union.d;                                                   \
1614   })
1615 #define Q6V64_PUT_W1(v, new)                                                   \
1616   __extension__({                                                              \
1617     union {                                                                    \
1618       long long d;                                                             \
1619       int w[2];                                                                \
1620     } _Q6V64_internal_union;                                                   \
1621     _Q6V64_internal_union.d = (v);                                             \
1622     _Q6V64_internal_union.w[1] = (new);                                        \
1623     _Q6V64_internal_union.d;                                                   \
1624   })
1625 
1626 #else /* !__qdsp6__ */
1627 
1628 #define Q6V64_PUT_W0(v, new)                                                   \
1629   (((v) & 0xffffffff00000000LL) | ((Q6Vect64)((unsigned int)(new))))
1630 #define Q6V64_PUT_W1(v, new)                                                   \
1631   (((v) & 0x00000000ffffffffLL) | (((Q6Vect64)(new)) << 32LL))
1632 
1633 #endif /* !__qdsp6__ */
1634 
1635 /* Set half word macros */
1636 
1637 #ifdef __qdsp6__
1638 
1639 #define Q6V64_PUT_H0(v, new)                                                   \
1640   __extension__({                                                              \
1641     union {                                                                    \
1642       long long d;                                                             \
1643       short h[4];                                                              \
1644     } _Q6V64_internal_union;                                                   \
1645     _Q6V64_internal_union.d = (v);                                             \
1646     _Q6V64_internal_union.h[0] = (new);                                        \
1647     _Q6V64_internal_union.d;                                                   \
1648   })
1649 #define Q6V64_PUT_H1(v, new)                                                   \
1650   __extension__({                                                              \
1651     union {                                                                    \
1652       long long d;                                                             \
1653       short h[4];                                                              \
1654     } _Q6V64_internal_union;                                                   \
1655     _Q6V64_internal_union.d = (v);                                             \
1656     _Q6V64_internal_union.h[1] = (new);                                        \
1657     _Q6V64_internal_union.d;                                                   \
1658   })
1659 #define Q6V64_PUT_H2(v, new)                                                   \
1660   __extension__({                                                              \
1661     union {                                                                    \
1662       long long d;                                                             \
1663       short h[4];                                                              \
1664     } _Q6V64_internal_union;                                                   \
1665     _Q6V64_internal_union.d = (v);                                             \
1666     _Q6V64_internal_union.h[2] = (new);                                        \
1667     _Q6V64_internal_union.d;                                                   \
1668   })
1669 #define Q6V64_PUT_H3(v, new)                                                   \
1670   __extension__({                                                              \
1671     union {                                                                    \
1672       long long d;                                                             \
1673       short h[4];                                                              \
1674     } _Q6V64_internal_union;                                                   \
1675     _Q6V64_internal_union.d = (v);                                             \
1676     _Q6V64_internal_union.h[3] = (new);                                        \
1677     _Q6V64_internal_union.d;                                                   \
1678   })
1679 
1680 #else /* !__qdsp6__ */
1681 
1682 #define Q6V64_PUT_H0(v, new)                                                   \
1683   (((v) & 0xffffffffffff0000LL) | ((Q6Vect64)((unsigned short)(new))))
1684 #define Q6V64_PUT_H1(v, new)                                                   \
1685   (((v) & 0xffffffff0000ffffLL) | (((Q6Vect64)((unsigned short)(new))) << 16LL))
1686 #define Q6V64_PUT_H2(v, new)                                                   \
1687   (((v) & 0xffff0000ffffffffLL) | (((Q6Vect64)((unsigned short)(new))) << 32LL))
1688 #define Q6V64_PUT_H3(v, new)                                                   \
1689   (((v) & 0x0000ffffffffffffLL) | (((Q6Vect64)(new)) << 48LL))
1690 
1691 #endif /* !__qdsp6__ */
1692 
1693 /* Set byte macros */
1694 
1695 #ifdef __qdsp6__
1696 
1697 #define Q6V64_PUT_B0(v, new)                                                   \
1698   __extension__({                                                              \
1699     union {                                                                    \
1700       long long d;                                                             \
1701       char b[8];                                                               \
1702     } _Q6V64_internal_union;                                                   \
1703     _Q6V64_internal_union.d = (v);                                             \
1704     _Q6V64_internal_union.b[0] = (new);                                        \
1705     _Q6V64_internal_union.d;                                                   \
1706   })
1707 #define Q6V64_PUT_B1(v, new)                                                   \
1708   __extension__({                                                              \
1709     union {                                                                    \
1710       long long d;                                                             \
1711       char b[8];                                                               \
1712     } _Q6V64_internal_union;                                                   \
1713     _Q6V64_internal_union.d = (v);                                             \
1714     _Q6V64_internal_union.b[1] = (new);                                        \
1715     _Q6V64_internal_union.d;                                                   \
1716   })
1717 #define Q6V64_PUT_B2(v, new)                                                   \
1718   __extension__({                                                              \
1719     union {                                                                    \
1720       long long d;                                                             \
1721       char b[8];                                                               \
1722     } _Q6V64_internal_union;                                                   \
1723     _Q6V64_internal_union.d = (v);                                             \
1724     _Q6V64_internal_union.b[2] = (new);                                        \
1725     _Q6V64_internal_union.d;                                                   \
1726   })
1727 #define Q6V64_PUT_B3(v, new)                                                   \
1728   __extension__({                                                              \
1729     union {                                                                    \
1730       long long d;                                                             \
1731       char b[8];                                                               \
1732     } _Q6V64_internal_union;                                                   \
1733     _Q6V64_internal_union.d = (v);                                             \
1734     _Q6V64_internal_union.b[3] = (new);                                        \
1735     _Q6V64_internal_union.d;                                                   \
1736   })
1737 #define Q6V64_PUT_B4(v, new)                                                   \
1738   __extension__({                                                              \
1739     union {                                                                    \
1740       long long d;                                                             \
1741       char b[8];                                                               \
1742     } _Q6V64_internal_union;                                                   \
1743     _Q6V64_internal_union.d = (v);                                             \
1744     _Q6V64_internal_union.b[4] = (new);                                        \
1745     _Q6V64_internal_union.d;                                                   \
1746   })
1747 #define Q6V64_PUT_B5(v, new)                                                   \
1748   __extension__({                                                              \
1749     union {                                                                    \
1750       long long d;                                                             \
1751       char b[8];                                                               \
1752     } _Q6V64_internal_union;                                                   \
1753     _Q6V64_internal_union.d = (v);                                             \
1754     _Q6V64_internal_union.b[5] = (new);                                        \
1755     _Q6V64_internal_union.d;                                                   \
1756   })
1757 #define Q6V64_PUT_B6(v, new)                                                   \
1758   __extension__({                                                              \
1759     union {                                                                    \
1760       long long d;                                                             \
1761       char b[8];                                                               \
1762     } _Q6V64_internal_union;                                                   \
1763     _Q6V64_internal_union.d = (v);                                             \
1764     _Q6V64_internal_union.b[6] = (new);                                        \
1765     _Q6V64_internal_union.d;                                                   \
1766   })
1767 #define Q6V64_PUT_B7(v, new)                                                   \
1768   __extension__({                                                              \
1769     union {                                                                    \
1770       long long d;                                                             \
1771       char b[8];                                                               \
1772     } _Q6V64_internal_union;                                                   \
1773     _Q6V64_internal_union.d = (v);                                             \
1774     _Q6V64_internal_union.b[7] = (new);                                        \
1775     _Q6V64_internal_union.d;                                                   \
1776   })
1777 
1778 #else /* !__qdsp6__ */
1779 
1780 #define Q6V64_PUT_B0(v, new)                                                   \
1781   (((v) & 0xffffffffffffff00LL) | ((Q6Vect64)((unsigned char)(new))))
1782 #define Q6V64_PUT_B1(v, new)                                                   \
1783   (((v) & 0xffffffffffff00ffLL) | (((Q6Vect64)((unsigned char)(new))) << 8LL))
1784 #define Q6V64_PUT_B2(v, new)                                                   \
1785   (((v) & 0xffffffffff00ffffLL) | (((Q6Vect64)((unsigned char)(new))) << 16LL))
1786 #define Q6V64_PUT_B3(v, new)                                                   \
1787   (((v) & 0xffffffff00ffffffLL) | (((Q6Vect64)((unsigned char)(new))) << 24LL))
1788 #define Q6V64_PUT_B4(v, new)                                                   \
1789   (((v) & 0xffffff00ffffffffLL) | (((Q6Vect64)((unsigned char)(new))) << 32LL))
1790 #define Q6V64_PUT_B5(v, new)                                                   \
1791   (((v) & 0xffff00ffffffffffLL) | (((Q6Vect64)((unsigned char)(new))) << 40LL))
1792 #define Q6V64_PUT_B6(v, new)                                                   \
1793   (((v) & 0xff00ffffffffffffLL) | (((Q6Vect64)((unsigned char)(new))) << 48LL))
1794 #define Q6V64_PUT_B7(v, new)                                                   \
1795   (((v) & 0x00ffffffffffffffLL) | (((Q6Vect64)(new)) << 56LL))
1796 
1797 #endif /* !__qdsp6__ */
1798 
1799 /* NOTE: All create macros return a Q6Vect64 type */
1800 
1801 /* Create from a doubleword */
1802 
1803 #define Q6V64_CREATE_D(d) (d)
1804 
1805 /* Create from words */
1806 
1807 #ifdef __qdsp6__
1808 
1809 #define Q6V64_CREATE_W(w1, w0)                                                 \
1810   __extension__({                                                              \
1811     union {                                                                    \
1812       long long d;                                                             \
1813       int w[2];                                                                \
1814     } _Q6V64_internal_union;                                                   \
1815     _Q6V64_internal_union.w[0] = (w0);                                         \
1816     _Q6V64_internal_union.w[1] = (w1);                                         \
1817     _Q6V64_internal_union.d;                                                   \
1818   })
1819 
1820 #else /* !__qdsp6__ */
1821 
1822 #define Q6V64_CREATE_W(w1, w0)                                                 \
1823   ((((Q6Vect64)(w1)) << 32LL) | ((Q6Vect64)((w0) & 0xffffffff)))
1824 
1825 #endif /* !__qdsp6__ */
1826 
1827 /* Create from half words */
1828 
1829 #ifdef __qdsp6__
1830 
1831 #define Q6V64_CREATE_H(h3, h2, h1, h0)                                         \
1832   __extension__({                                                              \
1833     union {                                                                    \
1834       long long d;                                                             \
1835       short h[4];                                                              \
1836     } _Q6V64_internal_union;                                                   \
1837     _Q6V64_internal_union.h[0] = (h0);                                         \
1838     _Q6V64_internal_union.h[1] = (h1);                                         \
1839     _Q6V64_internal_union.h[2] = (h2);                                         \
1840     _Q6V64_internal_union.h[3] = (h3);                                         \
1841     _Q6V64_internal_union.d;                                                   \
1842   })
1843 
1844 #else /* !__qdsp6__ */
1845 
1846 #define Q6V64_CREATE_H(h3, h2, h1, h0)                                         \
1847   ((((Q6Vect64)(h3)) << 48LL) | (((Q6Vect64)((h2) & 0xffff)) << 32LL) |        \
1848    (((Q6Vect64)((h1) & 0xffff)) << 16LL) | ((Q6Vect64)((h0) & 0xffff)))
1849 
1850 #endif /* !__qdsp6__ */
1851 
1852 /* Create from bytes */
1853 
1854 #ifdef __qdsp6__
1855 
1856 #define Q6V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0)                         \
1857   __extension__({                                                              \
1858     union {                                                                    \
1859       long long d;                                                             \
1860       char b[8];                                                               \
1861     } _Q6V64_internal_union;                                                   \
1862     _Q6V64_internal_union.b[0] = (b0);                                         \
1863     _Q6V64_internal_union.b[1] = (b1);                                         \
1864     _Q6V64_internal_union.b[2] = (b2);                                         \
1865     _Q6V64_internal_union.b[3] = (b3);                                         \
1866     _Q6V64_internal_union.b[4] = (b4);                                         \
1867     _Q6V64_internal_union.b[5] = (b5);                                         \
1868     _Q6V64_internal_union.b[6] = (b6);                                         \
1869     _Q6V64_internal_union.b[7] = (b7);                                         \
1870     _Q6V64_internal_union.d;                                                   \
1871   })
1872 
1873 #else /* !__qdsp6__ */
1874 
1875 #define Q6V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0)                         \
1876   ((((Q6Vect64)(b7)) << 56LL) | (((Q6Vect64)((b6) & 0xff)) << 48LL) |          \
1877    (((Q6Vect64)((b5) & 0xff)) << 40LL) | (((Q6Vect64)((b4) & 0xff)) << 32LL) | \
1878    (((Q6Vect64)((b3) & 0xff)) << 24LL) | (((Q6Vect64)((b2) & 0xff)) << 16LL) | \
1879    (((Q6Vect64)((b1) & 0xff)) << 8LL) | ((Q6Vect64)((b0) & 0xff)))
1880 
1881 #endif /* !__qdsp6__ */
1882 
1883 #ifdef __cplusplus
1884 
1885 class Q6Vect64C {
1886 public:
1887   // Constructors
data(d)1888   Q6Vect64C(long long d = 0) : data(d) {};
Q6Vect64C(int w1,int w0)1889   Q6Vect64C(int w1, int w0) : data(Q6V64_CREATE_W(w1, w0)) {};
Q6Vect64C(short h3,short h2,short h1,short h0)1890   Q6Vect64C(short h3, short h2, short h1, short h0)
1891       : data(Q6V64_CREATE_H(h3, h2, h1, h0)) {};
Q6Vect64C(signed char b7,signed char b6,signed char b5,signed char b4,signed char b3,signed char b2,signed char b1,signed char b0)1892   Q6Vect64C(signed char b7, signed char b6, signed char b5, signed char b4,
1893             signed char b3, signed char b2, signed char b1, signed char b0)
1894       : data(Q6V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0)) {};
Q6Vect64C(const Q6Vect64C & v)1895   Q6Vect64C(const Q6Vect64C &v) : data(v.data) {};
1896 
1897   Q6Vect64C &operator=(const Q6Vect64C &v) {
1898     data = v.data;
1899     return *this;
1900   };
1901 
1902   operator long long() {
1903     return data;
1904   };
1905 
1906   // Extract doubleword methods
D(void)1907   long long D(void) {
1908     return Q6V64_GET_D(data);
1909   };
UD(void)1910   unsigned long long UD(void) {
1911     return Q6V64_GET_UD(data);
1912   };
1913 
1914   // Extract word methods
W0(void)1915   int W0(void) {
1916     return Q6V64_GET_W0(data);
1917   };
W1(void)1918   int W1(void) {
1919     return Q6V64_GET_W1(data);
1920   };
UW0(void)1921   unsigned int UW0(void) {
1922     return Q6V64_GET_UW0(data);
1923   };
UW1(void)1924   unsigned int UW1(void) {
1925     return Q6V64_GET_UW1(data);
1926   };
1927 
1928   // Extract half word methods
H0(void)1929   short H0(void) {
1930     return Q6V64_GET_H0(data);
1931   };
H1(void)1932   short H1(void) {
1933     return Q6V64_GET_H1(data);
1934   };
H2(void)1935   short H2(void) {
1936     return Q6V64_GET_H2(data);
1937   };
H3(void)1938   short H3(void) {
1939     return Q6V64_GET_H3(data);
1940   };
UH0(void)1941   unsigned short UH0(void) {
1942     return Q6V64_GET_UH0(data);
1943   };
UH1(void)1944   unsigned short UH1(void) {
1945     return Q6V64_GET_UH1(data);
1946   };
UH2(void)1947   unsigned short UH2(void) {
1948     return Q6V64_GET_UH2(data);
1949   };
UH3(void)1950   unsigned short UH3(void) {
1951     return Q6V64_GET_UH3(data);
1952   };
1953 
1954   // Extract byte methods
B0(void)1955   signed char B0(void) {
1956     return Q6V64_GET_B0(data);
1957   };
B1(void)1958   signed char B1(void) {
1959     return Q6V64_GET_B1(data);
1960   };
B2(void)1961   signed char B2(void) {
1962     return Q6V64_GET_B2(data);
1963   };
B3(void)1964   signed char B3(void) {
1965     return Q6V64_GET_B3(data);
1966   };
B4(void)1967   signed char B4(void) {
1968     return Q6V64_GET_B4(data);
1969   };
B5(void)1970   signed char B5(void) {
1971     return Q6V64_GET_B5(data);
1972   };
B6(void)1973   signed char B6(void) {
1974     return Q6V64_GET_B6(data);
1975   };
B7(void)1976   signed char B7(void) {
1977     return Q6V64_GET_B7(data);
1978   };
UB0(void)1979   unsigned char UB0(void) {
1980     return Q6V64_GET_UB0(data);
1981   };
UB1(void)1982   unsigned char UB1(void) {
1983     return Q6V64_GET_UB1(data);
1984   };
UB2(void)1985   unsigned char UB2(void) {
1986     return Q6V64_GET_UB2(data);
1987   };
UB3(void)1988   unsigned char UB3(void) {
1989     return Q6V64_GET_UB3(data);
1990   };
UB4(void)1991   unsigned char UB4(void) {
1992     return Q6V64_GET_UB4(data);
1993   };
UB5(void)1994   unsigned char UB5(void) {
1995     return Q6V64_GET_UB5(data);
1996   };
UB6(void)1997   unsigned char UB6(void) {
1998     return Q6V64_GET_UB6(data);
1999   };
UB7(void)2000   unsigned char UB7(void) {
2001     return Q6V64_GET_UB7(data);
2002   };
2003 
2004   // NOTE: All set methods return a Q6Vect64C type
2005 
2006   // Set doubleword method
D(long long d)2007   Q6Vect64C D(long long d) {
2008     return Q6Vect64C(Q6V64_PUT_D(data, d));
2009   };
2010 
2011   // Set word methods
W0(int w)2012   Q6Vect64C W0(int w) {
2013     return Q6Vect64C(Q6V64_PUT_W0(data, w));
2014   };
W1(int w)2015   Q6Vect64C W1(int w) {
2016     return Q6Vect64C(Q6V64_PUT_W1(data, w));
2017   };
2018 
2019   // Set half word methods
H0(short h)2020   Q6Vect64C H0(short h) {
2021     return Q6Vect64C(Q6V64_PUT_H0(data, h));
2022   };
H1(short h)2023   Q6Vect64C H1(short h) {
2024     return Q6Vect64C(Q6V64_PUT_H1(data, h));
2025   };
H2(short h)2026   Q6Vect64C H2(short h) {
2027     return Q6Vect64C(Q6V64_PUT_H2(data, h));
2028   };
H3(short h)2029   Q6Vect64C H3(short h) {
2030     return Q6Vect64C(Q6V64_PUT_H3(data, h));
2031   };
2032 
2033   // Set byte methods
B0(signed char b)2034   Q6Vect64C B0(signed char b) {
2035     return Q6Vect64C(Q6V64_PUT_B0(data, b));
2036   };
B1(signed char b)2037   Q6Vect64C B1(signed char b) {
2038     return Q6Vect64C(Q6V64_PUT_B1(data, b));
2039   };
B2(signed char b)2040   Q6Vect64C B2(signed char b) {
2041     return Q6Vect64C(Q6V64_PUT_B2(data, b));
2042   };
B3(signed char b)2043   Q6Vect64C B3(signed char b) {
2044     return Q6Vect64C(Q6V64_PUT_B3(data, b));
2045   };
B4(signed char b)2046   Q6Vect64C B4(signed char b) {
2047     return Q6Vect64C(Q6V64_PUT_B4(data, b));
2048   };
B5(signed char b)2049   Q6Vect64C B5(signed char b) {
2050     return Q6Vect64C(Q6V64_PUT_B5(data, b));
2051   };
B6(signed char b)2052   Q6Vect64C B6(signed char b) {
2053     return Q6Vect64C(Q6V64_PUT_B6(data, b));
2054   };
B7(signed char b)2055   Q6Vect64C B7(signed char b) {
2056     return Q6Vect64C(Q6V64_PUT_B7(data, b));
2057   };
2058 
2059 private:
2060   long long data;
2061 };
2062 
2063 #endif /* __cplusplus */
2064 
2065 /* 32 Bit Vectors */
2066 
2067 typedef int Q6Vect32;
2068 
2069 /* Extract word macros */
2070 
2071 #define Q6V32_GET_W(v) (v)
2072 #define Q6V32_GET_UW(v) ((unsigned int)(v))
2073 
2074 /* Extract half word macros */
2075 
2076 #define Q6V32_GET_H0(v)                                                        \
2077   __extension__({                                                              \
2078     union {                                                                    \
2079       int w;                                                                   \
2080       short h[2];                                                              \
2081     } _Q6V32_internal_union;                                                   \
2082     _Q6V32_internal_union.w = (v);                                             \
2083     _Q6V32_internal_union.h[0];                                                \
2084   })
2085 #define Q6V32_GET_H1(v)                                                        \
2086   __extension__({                                                              \
2087     union {                                                                    \
2088       int w;                                                                   \
2089       short h[2];                                                              \
2090     } _Q6V32_internal_union;                                                   \
2091     _Q6V32_internal_union.w = (v);                                             \
2092     _Q6V32_internal_union.h[1];                                                \
2093   })
2094 #define Q6V32_GET_UH0(v)                                                       \
2095   __extension__({                                                              \
2096     union {                                                                    \
2097       int w;                                                                   \
2098       unsigned short uh[2];                                                    \
2099     } _Q6V32_internal_union;                                                   \
2100     _Q6V32_internal_union.w = (v);                                             \
2101     _Q6V32_internal_union.uh[0];                                               \
2102   })
2103 #define Q6V32_GET_UH1(v)                                                       \
2104   __extension__({                                                              \
2105     union {                                                                    \
2106       int w;                                                                   \
2107       unsigned short uh[2];                                                    \
2108     } _Q6V32_internal_union;                                                   \
2109     _Q6V32_internal_union.w = (v);                                             \
2110     _Q6V32_internal_union.uh[1];                                               \
2111   })
2112 
2113 /* Extract byte macros */
2114 
2115 #define Q6V32_GET_B0(v)                                                        \
2116   __extension__({                                                              \
2117     union {                                                                    \
2118       int w;                                                                   \
2119       signed char b[4];                                                        \
2120     } _Q6V32_internal_union;                                                   \
2121     _Q6V32_internal_union.w = (v);                                             \
2122     _Q6V32_internal_union.b[0];                                                \
2123   })
2124 #define Q6V32_GET_B1(v)                                                        \
2125   __extension__({                                                              \
2126     union {                                                                    \
2127       int w;                                                                   \
2128       signed char b[4];                                                        \
2129     } _Q6V32_internal_union;                                                   \
2130     _Q6V32_internal_union.w = (v);                                             \
2131     _Q6V32_internal_union.b[1];                                                \
2132   })
2133 #define Q6V32_GET_B2(v)                                                        \
2134   __extension__({                                                              \
2135     union {                                                                    \
2136       int w;                                                                   \
2137       signed char b[4];                                                        \
2138     } _Q6V32_internal_union;                                                   \
2139     _Q6V32_internal_union.w = (v);                                             \
2140     _Q6V32_internal_union.b[2];                                                \
2141   })
2142 #define Q6V32_GET_B3(v)                                                        \
2143   __extension__({                                                              \
2144     union {                                                                    \
2145       int w;                                                                   \
2146       signed char b[4];                                                        \
2147     } _Q6V32_internal_union;                                                   \
2148     _Q6V32_internal_union.w = (v);                                             \
2149     _Q6V32_internal_union.b[3];                                                \
2150   })
2151 #define Q6V32_GET_UB0(v)                                                       \
2152   __extension__({                                                              \
2153     union {                                                                    \
2154       int w;                                                                   \
2155       unsigned char ub[4];                                                     \
2156     } _Q6V32_internal_union;                                                   \
2157     _Q6V32_internal_union.w = (v);                                             \
2158     _Q6V32_internal_union.ub[0];                                               \
2159   })
2160 #define Q6V32_GET_UB1(v)                                                       \
2161   __extension__({                                                              \
2162     union {                                                                    \
2163       int w;                                                                   \
2164       unsigned char ub[4];                                                     \
2165     } _Q6V32_internal_union;                                                   \
2166     _Q6V32_internal_union.w = (v);                                             \
2167     _Q6V32_internal_union.ub[1];                                               \
2168   })
2169 #define Q6V32_GET_UB2(v)                                                       \
2170   __extension__({                                                              \
2171     union {                                                                    \
2172       int w;                                                                   \
2173       unsigned char ub[4];                                                     \
2174     } _Q6V32_internal_union;                                                   \
2175     _Q6V32_internal_union.w = (v);                                             \
2176     _Q6V32_internal_union.ub[2];                                               \
2177   })
2178 #define Q6V32_GET_UB3(v)                                                       \
2179   __extension__({                                                              \
2180     union {                                                                    \
2181       int w;                                                                   \
2182       unsigned char ub[4];                                                     \
2183     } _Q6V32_internal_union;                                                   \
2184     _Q6V32_internal_union.w = (v);                                             \
2185     _Q6V32_internal_union.ub[3];                                               \
2186   })
2187 
2188 /* NOTE: All set macros return a Q6Vect32 type */
2189 
2190 /* Set word macro */
2191 
2192 #define Q6V32_PUT_W(v, new) (new)
2193 
2194 /* Set half word macros */
2195 
2196 #ifdef __qdsp6__
2197 
2198 #define Q6V32_PUT_H0(v, new)                                                   \
2199   __extension__({                                                              \
2200     union {                                                                    \
2201       int w;                                                                   \
2202       short h[2];                                                              \
2203     } _Q6V32_internal_union;                                                   \
2204     _Q6V32_internal_union.w = (v);                                             \
2205     _Q6V32_internal_union.h[0] = (new);                                        \
2206     _Q6V32_internal_union.w;                                                   \
2207   })
2208 #define Q6V32_PUT_H1(v, new)                                                   \
2209   __extension__({                                                              \
2210     union {                                                                    \
2211       int w;                                                                   \
2212       short h[2];                                                              \
2213     } _Q6V32_internal_union;                                                   \
2214     _Q6V32_internal_union.w = (v);                                             \
2215     _Q6V32_internal_union.h[1] = (new);                                        \
2216     _Q6V32_internal_union.w;                                                   \
2217   })
2218 
2219 #else /* !__qdsp6__ */
2220 
2221 #define Q6V32_PUT_H0(v, new)                                                   \
2222   (((v) & 0xffff0000) | ((Q6Vect32)((unsigned short)(new))))
2223 #define Q6V32_PUT_H1(v, new) (((v) & 0x0000ffff) | (((Q6Vect32)(new)) << 16))
2224 
2225 #endif /* !__qdsp6__ */
2226 
2227 /* Set byte macros */
2228 
2229 #ifdef __qdsp6__
2230 
2231 #define Q6V32_PUT_B0(v, new)                                                   \
2232   __extension__({                                                              \
2233     union {                                                                    \
2234       int w;                                                                   \
2235       char b[4];                                                               \
2236     } _Q6V32_internal_union;                                                   \
2237     _Q6V32_internal_union.w = (v);                                             \
2238     _Q6V32_internal_union.b[0] = (new);                                        \
2239     _Q6V32_internal_union.w;                                                   \
2240   })
2241 #define Q6V32_PUT_B1(v, new)                                                   \
2242   __extension__({                                                              \
2243     union {                                                                    \
2244       int w;                                                                   \
2245       char b[4];                                                               \
2246     } _Q6V32_internal_union;                                                   \
2247     _Q6V32_internal_union.w = (v);                                             \
2248     _Q6V32_internal_union.b[1] = (new);                                        \
2249     _Q6V32_internal_union.w;                                                   \
2250   })
2251 #define Q6V32_PUT_B2(v, new)                                                   \
2252   __extension__({                                                              \
2253     union {                                                                    \
2254       int w;                                                                   \
2255       char b[4];                                                               \
2256     } _Q6V32_internal_union;                                                   \
2257     _Q6V32_internal_union.w = (v);                                             \
2258     _Q6V32_internal_union.b[2] = (new);                                        \
2259     _Q6V32_internal_union.w;                                                   \
2260   })
2261 #define Q6V32_PUT_B3(v, new)                                                   \
2262   __extension__({                                                              \
2263     union {                                                                    \
2264       int w;                                                                   \
2265       char b[4];                                                               \
2266     } _Q6V32_internal_union;                                                   \
2267     _Q6V32_internal_union.w = (v);                                             \
2268     _Q6V32_internal_union.b[3] = (new);                                        \
2269     _Q6V32_internal_union.w;                                                   \
2270   })
2271 
2272 #else /* !__qdsp6__ */
2273 
2274 #define Q6V32_PUT_B0(v, new)                                                   \
2275   (((v) & 0xffffff00) | ((Q6Vect32)((unsigned char)(new))))
2276 #define Q6V32_PUT_B1(v, new)                                                   \
2277   (((v) & 0xffff00ff) | (((Q6Vect32)((unsigned char)(new))) << 8))
2278 #define Q6V32_PUT_B2(v, new)                                                   \
2279   (((v) & 0xff00ffff) | (((Q6Vect32)((unsigned char)(new))) << 16))
2280 #define Q6V32_PUT_B3(v, new) (((v) & 0x00ffffff) | (((Q6Vect32)(new)) << 24))
2281 
2282 #endif /* !__qdsp6__ */
2283 
2284 /* NOTE: All create macros return a Q6Vect32 type */
2285 
2286 /* Create from a word */
2287 
2288 #define Q6V32_CREATE_W(w) (w)
2289 
2290 /* Create from half words */
2291 
2292 #ifdef __qdsp6__
2293 
2294 #define Q6V32_CREATE_H(h1, h0)                                                 \
2295   __extension__({                                                              \
2296     union {                                                                    \
2297       long long d;                                                             \
2298       short h[2];                                                              \
2299     } _Q6V32_internal_union;                                                   \
2300     _Q6V32_internal_union.h[0] = (h0);                                         \
2301     _Q6V32_internal_union.h[1] = (h1);                                         \
2302     _Q6V32_internal_union.d;                                                   \
2303   })
2304 
2305 #else /* !__qdsp6__ */
2306 
2307 #define Q6V32_CREATE_H(h1, h0)                                                 \
2308   ((((Q6Vect32)(h1)) << 16) | ((Q6Vect32)((h0) & 0xffff)))
2309 
2310 #endif /* !__qdsp6__ */
2311 
2312 /* Create from bytes */
2313 #ifdef __qdsp6__
2314 
2315 #define Q6V32_CREATE_B(b3, b2, b1, b0)                                         \
2316   __extension__({                                                              \
2317     union {                                                                    \
2318       long long d;                                                             \
2319       char b[4];                                                               \
2320     } _Q6V32_internal_union;                                                   \
2321     _Q6V32_internal_union.b[0] = (b0);                                         \
2322     _Q6V32_internal_union.b[1] = (b1);                                         \
2323     _Q6V32_internal_union.b[2] = (b2);                                         \
2324     _Q6V32_internal_union.b[3] = (b3);                                         \
2325     _Q6V32_internal_union.d;                                                   \
2326   })
2327 
2328 #else /* !__qdsp6__ */
2329 
2330 #define Q6V32_CREATE_B(b3, b2, b1, b0)                                         \
2331   ((((Q6Vect32)(b3)) << 24) | (((Q6Vect32)((b2) & 0xff)) << 16) |              \
2332    (((Q6Vect32)((b1) & 0xff)) << 8) | ((Q6Vect32)((b0) & 0xff)))
2333 
2334 #endif /* !__qdsp6__ */
2335 
2336 #ifdef __cplusplus
2337 
2338 class Q6Vect32C {
2339 public:
2340   // Constructors
data(w)2341   Q6Vect32C(int w = 0) : data(w) {};
Q6Vect32C(short h1,short h0)2342   Q6Vect32C(short h1, short h0) : data(Q6V32_CREATE_H(h1, h0)) {};
Q6Vect32C(signed char b3,signed char b2,signed char b1,signed char b0)2343   Q6Vect32C(signed char b3, signed char b2, signed char b1, signed char b0)
2344       : data(Q6V32_CREATE_B(b3, b2, b1, b0)) {};
Q6Vect32C(const Q6Vect32C & v)2345   Q6Vect32C(const Q6Vect32C &v) : data(v.data) {};
2346 
2347   Q6Vect32C &operator=(const Q6Vect32C &v) {
2348     data = v.data;
2349     return *this;
2350   };
2351 
2352   operator int() {
2353     return data;
2354   };
2355 
2356   // Extract word methods
W(void)2357   int W(void) {
2358     return Q6V32_GET_W(data);
2359   };
UW(void)2360   unsigned int UW(void) {
2361     return Q6V32_GET_UW(data);
2362   };
2363 
2364   // Extract half word methods
H0(void)2365   short H0(void) {
2366     return Q6V32_GET_H0(data);
2367   };
H1(void)2368   short H1(void) {
2369     return Q6V32_GET_H1(data);
2370   };
UH0(void)2371   unsigned short UH0(void) {
2372     return Q6V32_GET_UH0(data);
2373   };
UH1(void)2374   unsigned short UH1(void) {
2375     return Q6V32_GET_UH1(data);
2376   };
2377 
2378   // Extract byte methods
B0(void)2379   signed char B0(void) {
2380     return Q6V32_GET_B0(data);
2381   };
B1(void)2382   signed char B1(void) {
2383     return Q6V32_GET_B1(data);
2384   };
B2(void)2385   signed char B2(void) {
2386     return Q6V32_GET_B2(data);
2387   };
B3(void)2388   signed char B3(void) {
2389     return Q6V32_GET_B3(data);
2390   };
UB0(void)2391   unsigned char UB0(void) {
2392     return Q6V32_GET_UB0(data);
2393   };
UB1(void)2394   unsigned char UB1(void) {
2395     return Q6V32_GET_UB1(data);
2396   };
UB2(void)2397   unsigned char UB2(void) {
2398     return Q6V32_GET_UB2(data);
2399   };
UB3(void)2400   unsigned char UB3(void) {
2401     return Q6V32_GET_UB3(data);
2402   };
2403 
2404   // NOTE: All set methods return a Q6Vect32C type
2405 
2406   // Set word method
W(int w)2407   Q6Vect32C W(int w) {
2408     return Q6Vect32C(Q6V32_PUT_W(data, w));
2409   };
2410 
2411   // Set half word methods
H0(short h)2412   Q6Vect32C H0(short h) {
2413     return Q6Vect32C(Q6V32_PUT_H0(data, h));
2414   };
H1(short h)2415   Q6Vect32C H1(short h) {
2416     return Q6Vect32C(Q6V32_PUT_H1(data, h));
2417   };
2418 
2419   // Set byte methods
B0(signed char b)2420   Q6Vect32C B0(signed char b) {
2421     return Q6Vect32C(Q6V32_PUT_B0(data, b));
2422   };
B1(signed char b)2423   Q6Vect32C B1(signed char b) {
2424     return Q6Vect32C(Q6V32_PUT_B1(data, b));
2425   };
B2(signed char b)2426   Q6Vect32C B2(signed char b) {
2427     return Q6Vect32C(Q6V32_PUT_B2(data, b));
2428   };
B3(signed char b)2429   Q6Vect32C B3(signed char b) {
2430     return Q6Vect32C(Q6V32_PUT_B3(data, b));
2431   };
2432 
2433 private:
2434   int data;
2435 };
2436 
2437 #endif /* __cplusplus */
2438 
2439 // V65 Vector types
2440 #if __HVX_ARCH__ >= 65
2441 #if defined __HVX__ && (__HVX_LENGTH__ == 128)
2442 typedef long Q6VecPred128 __attribute__((__vector_size__(128)))
2443     __attribute__((aligned(128)));
2444 
2445 typedef long Q6Vect1024 __attribute__((__vector_size__(128)))
2446     __attribute__((aligned(128)));
2447 
2448 typedef long Q6Vect2048 __attribute__((__vector_size__(256)))
2449     __attribute__((aligned(256)));
2450 
2451 #else /* defined __HVX__ && (__HVX_LENGTH__ == 128) */
2452 #if defined __HVX__ &&  (__HVX_LENGTH__ == 64)
2453 typedef long Q6VecPred64 __attribute__((__vector_size__(64)))
2454     __attribute__((aligned(64)));
2455 
2456 typedef long Q6Vect512 __attribute__((__vector_size__(64)))
2457     __attribute__((aligned(64)));
2458 
2459 typedef long Q6Vect1024 __attribute__((__vector_size__(128)))
2460     __attribute__((aligned(128)));
2461 
2462 #endif /* defined __HVX__ &&  (__HVX_LENGTH__ == 64) */
2463 #endif /* defined __HVX__ && (__HVX_LENGTH__ == 128) */
2464 #endif /* __HVX_ARCH__ >= 65 */
2465 
2466 /* Predicates */
2467 
2468 typedef int Q6Pred;
2469 
2470 
2471 #ifdef __HVX__
2472 
2473 // Extract HVX VectorPair macro.
2474 #define HEXAGON_HVX_GET_W(v) (v)
2475 
2476 // Extract HVX Vector macros.
2477 #define HEXAGON_HVX_GET_V0(v)                                                  \
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];                                          \
2485   })
2486 #define HEXAGON_HVX_GET_V1(v)                                                  \
2487   __extension__({                                                              \
2488     union {                                                                    \
2489       HVX_VectorPair W;                                                        \
2490       HVX_Vector V[2];                                                         \
2491     } _HEXAGON_HVX_internal_union;                                             \
2492     _HEXAGON_HVX_internal_union.W = (v);                                       \
2493     _HEXAGON_HVX_internal_union.V[1];                                          \
2494   })
2495 #define HEXAGON_HVX_GET_P(v)                                                   \
2496   __extension__({                                                              \
2497     union {                                                                    \
2498       HVX_VectorPair W;                                                        \
2499       HVX_VectorPred P[2];                                                     \
2500     } _HEXAGON_HVX_internal_union;                                             \
2501     _HEXAGON_HVX_internal_union.W = (v);                                       \
2502     _HEXAGON_HVX_internal_union.P[0];                                          \
2503   })
2504 
2505 // Set HVX VectorPair macro.
2506 #define HEXAGON_HVX_PUT_W(v, new) (new)
2507 
2508 // Set HVX Vector macros.
2509 #define HEXAGON_HVX_PUT_V0(v, new)                                             \
2510   __extension__({                                                              \
2511     union {                                                                    \
2512       HVX_VectorPair W;                                                        \
2513       HVX_Vector V[2];                                                         \
2514     } _HEXAGON_HVX_internal_union;                                             \
2515     _HEXAGON_HVX_internal_union.W = (v);                                       \
2516     _HEXAGON_HVX_internal_union.V[0] = (new);                                  \
2517     _HEXAGON_HVX_internal_union.W;                                             \
2518   })
2519 
2520 #define HEXAGON_HVX_PUT_V1(v, new)                                             \
2521   __extension__({                                                              \
2522     union {                                                                    \
2523       HVX_VectorPair W;                                                        \
2524       HVX_Vector V[2];                                                         \
2525     } _HEXAGON_HVX_internal_union;                                             \
2526     _HEXAGON_HVX_internal_union.W = (v);                                       \
2527     _HEXAGON_HVX_internal_union.V[1] = (new);                                  \
2528     _HEXAGON_HVX_internal_union.W;                                             \
2529   })
2530 
2531 #define HEXAGON_HVX_PUT_P(v, new)                                              \
2532   __extension__({                                                              \
2533     union {                                                                    \
2534       HVX_VectorPair W;                                                        \
2535       HVX_VectorPred P[2];                                                     \
2536     } _HEXAGON_HVX_internal_union;                                             \
2537     _HEXAGON_HVX_internal_union.W = (v);                                       \
2538     _HEXAGON_HVX_internal_union.P[0] = (new);                                  \
2539     _HEXAGON_HVX_internal_union.W;                                             \
2540   })
2541 
2542 
2543 #define HEXAGON_HVX_CREATE_W(v1, v0)                                           \
2544   __extension__({                                                              \
2545     union {                                                                    \
2546       HVX_VectorPair W;                                                        \
2547       HVX_Vector V[2];                                                         \
2548     } _HEXAGON_HVX_internal_union;                                             \
2549     _HEXAGON_HVX_internal_union.V[0] = (v0);                                   \
2550     _HEXAGON_HVX_internal_union.V[1] = (v1);                                   \
2551     _HEXAGON_HVX_internal_union.W;                                             \
2552   })
2553 
2554 #ifdef __cplusplus
2555 
2556 class HVX_Vect {
2557 public:
2558   // Constructors.
2559   // Default.
HVX_Vect()2560   HVX_Vect() : data(Q6_W_vcombine_VV(Q6_V_vzero(), Q6_V_vzero())){};
2561 
2562   // Custom constructors.
HVX_Vect(HVX_VectorPair W)2563   HVX_Vect(HVX_VectorPair W) : data(W){};
HVX_Vect(HVX_Vector v1,HVX_Vector v0)2564   HVX_Vect(HVX_Vector v1, HVX_Vector v0) : data(HEXAGON_HVX_CREATE_W(v1, v0)){};
2565 
2566   // Copy constructor.
2567   HVX_Vect(const HVX_Vect &W) = default;
2568 
2569   // Move constructor.
2570   HVX_Vect(HVX_Vect &&W) = default;
2571 
2572   // Assignment operator.
2573   HVX_Vect &operator=(const HVX_Vect &W) = default;
2574 
HVX_VectorPair()2575   operator HVX_VectorPair() { return data; };
2576 
2577   // Extract VectorPair method.
W(void)2578   HVX_VectorPair W(void) { return HEXAGON_HVX_GET_W(data); };
2579 
2580   // Extract Vector methods.
V0(void)2581   HVX_Vector V0(void) { return HEXAGON_HVX_GET_V0(data); };
V1(void)2582   HVX_Vector V1(void) { return HEXAGON_HVX_GET_V1(data); };
P(void)2583   HVX_VectorPred P(void) { return HEXAGON_HVX_GET_P(data); };
2584 
2585   // NOTE: All set methods return a HVX_Vect type.
2586   // Set HVX VectorPair method.
W(HVX_VectorPair w)2587   HVX_Vect W(HVX_VectorPair w) { return HVX_Vect(HEXAGON_HVX_PUT_W(data, w)); };
2588 
2589   // Set HVX Vector methods.
V0(HVX_Vector v)2590   HVX_Vect V0(HVX_Vector v) { return HVX_Vect(HEXAGON_HVX_PUT_V0(data, v)); };
V1(HVX_Vector v)2591   HVX_Vect V1(HVX_Vector v) { return HVX_Vect(HEXAGON_HVX_PUT_V1(data, v)); };
P(HVX_VectorPred p)2592   HVX_Vect P(HVX_VectorPred p) { return HVX_Vect(HEXAGON_HVX_PUT_P(data, p)); };
2593 
2594 private:
2595   HVX_VectorPair data;
2596 };
2597 
2598 #endif /* __cplusplus */
2599 #endif /* __HVX__ */
2600 
2601 #define HEXAGON_UDMA_DM0_STATUS_IDLE             0x00000000
2602 #define HEXAGON_UDMA_DM0_STATUS_RUN              0x00000001
2603 #define HEXAGON_UDMA_DM0_STATUS_ERROR            0x00000002
2604 #define HEXAGON_UDMA_DESC_DSTATE_INCOMPLETE      0
2605 #define HEXAGON_UDMA_DESC_DSTATE_COMPLETE        1
2606 #define HEXAGON_UDMA_DESC_ORDER_NOORDER          0
2607 #define HEXAGON_UDMA_DESC_ORDER_ORDER            1
2608 #define HEXAGON_UDMA_DESC_BYPASS_OFF             0
2609 #define HEXAGON_UDMA_DESC_BYPASS_ON              1
2610 #define HEXAGON_UDMA_DESC_COMP_NONE              0
2611 #define HEXAGON_UDMA_DESC_COMP_DLBC              1
2612 #define HEXAGON_UDMA_DESC_DESCTYPE_TYPE0         0
2613 #define HEXAGON_UDMA_DESC_DESCTYPE_TYPE1         1
2614 
2615 typedef struct hexagon_udma_descriptor_type0_s
2616 {
2617     void *next;
2618     unsigned int length:24;
2619     unsigned int desctype:2;
2620     unsigned int dstcomp:1;
2621     unsigned int srccomp:1;
2622     unsigned int dstbypass:1;
2623     unsigned int srcbypass:1;
2624     unsigned int order:1;
2625     unsigned int dstate:1;
2626     void *src;
2627     void *dst;
2628 } hexagon_udma_descriptor_type0_t;
2629 
2630 typedef struct hexagon_udma_descriptor_type1_s
2631 {
2632     void *next;
2633     unsigned int length:24;
2634     unsigned int desctype:2;
2635     unsigned int dstcomp:1;
2636     unsigned int srccomp:1;
2637     unsigned int dstbypass:1;
2638     unsigned int srcbypass:1;
2639     unsigned int order:1;
2640     unsigned int dstate:1;
2641     void *src;
2642     void *dst;
2643     unsigned int allocation:28;
2644     unsigned int padding:4;
2645     unsigned int roiwidth:16;
2646     unsigned int roiheight:16;
2647     unsigned int srcstride:16;
2648     unsigned int dststride:16;
2649     unsigned int srcwidthoffset:16;
2650     unsigned int dstwidthoffset:16;
2651 } hexagon_udma_descriptor_type1_t;
2652 
2653 #endif /* !HEXAGON_TYPES_H */
2654