Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

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