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