1 /******************************************************************************/ 2 /* (c) 2020 Qualcomm Innovation Center, Inc. All rights reserved. */ 3 /* */ 4 /******************************************************************************/ 5 #ifndef HEXAGON_TYPES_H 6 #define HEXAGON_TYPES_H 7 8 #include <hexagon_protos.h> 9 10 /* Hexagon names */ 11 #define HEXAGON_Vect HEXAGON_Vect64 12 #define HEXAGON_V_GET_D HEXAGON_V64_GET_D 13 #define HEXAGON_V_GET_UD HEXAGON_V64_GET_UD 14 #define HEXAGON_V_GET_W0 HEXAGON_V64_GET_W0 15 #define HEXAGON_V_GET_W1 HEXAGON_V64_GET_W1 16 #define HEXAGON_V_GET_UW0 HEXAGON_V64_GET_UW0 17 #define HEXAGON_V_GET_UW1 HEXAGON_V64_GET_UW1 18 #define HEXAGON_V_GET_H0 HEXAGON_V64_GET_H0 19 #define HEXAGON_V_GET_H1 HEXAGON_V64_GET_H1 20 #define HEXAGON_V_GET_H2 HEXAGON_V64_GET_H2 21 #define HEXAGON_V_GET_H3 HEXAGON_V64_GET_H3 22 #define HEXAGON_V_GET_UH0 HEXAGON_V64_GET_UH0 23 #define HEXAGON_V_GET_UH1 HEXAGON_V64_GET_UH1 24 #define HEXAGON_V_GET_UH2 HEXAGON_V64_GET_UH2 25 #define HEXAGON_V_GET_UH3 HEXAGON_V64_GET_UH3 26 #define HEXAGON_V_GET_B0 HEXAGON_V64_GET_B0 27 #define HEXAGON_V_GET_B1 HEXAGON_V64_GET_B1 28 #define HEXAGON_V_GET_B2 HEXAGON_V64_GET_B2 29 #define HEXAGON_V_GET_B3 HEXAGON_V64_GET_B3 30 #define HEXAGON_V_GET_B4 HEXAGON_V64_GET_B4 31 #define HEXAGON_V_GET_B5 HEXAGON_V64_GET_B5 32 #define HEXAGON_V_GET_B6 HEXAGON_V64_GET_B6 33 #define HEXAGON_V_GET_B7 HEXAGON_V64_GET_B7 34 #define HEXAGON_V_GET_UB0 HEXAGON_V64_GET_UB0 35 #define HEXAGON_V_GET_UB1 HEXAGON_V64_GET_UB1 36 #define HEXAGON_V_GET_UB2 HEXAGON_V64_GET_UB2 37 #define HEXAGON_V_GET_UB3 HEXAGON_V64_GET_UB3 38 #define HEXAGON_V_GET_UB4 HEXAGON_V64_GET_UB4 39 #define HEXAGON_V_GET_UB5 HEXAGON_V64_GET_UB5 40 #define HEXAGON_V_GET_UB6 HEXAGON_V64_GET_UB6 41 #define HEXAGON_V_GET_UB7 HEXAGON_V64_GET_UB7 42 #define HEXAGON_V_PUT_D HEXAGON_V64_PUT_D 43 #define HEXAGON_V_PUT_W0 HEXAGON_V64_PUT_W0 44 #define HEXAGON_V_PUT_W1 HEXAGON_V64_PUT_W1 45 #define HEXAGON_V_PUT_H0 HEXAGON_V64_PUT_H0 46 #define HEXAGON_V_PUT_H1 HEXAGON_V64_PUT_H1 47 #define HEXAGON_V_PUT_H2 HEXAGON_V64_PUT_H2 48 #define HEXAGON_V_PUT_H3 HEXAGON_V64_PUT_H3 49 #define HEXAGON_V_PUT_B0 HEXAGON_V64_PUT_B0 50 #define HEXAGON_V_PUT_B1 HEXAGON_V64_PUT_B1 51 #define HEXAGON_V_PUT_B2 HEXAGON_V64_PUT_B2 52 #define HEXAGON_V_PUT_B3 HEXAGON_V64_PUT_B3 53 #define HEXAGON_V_PUT_B4 HEXAGON_V64_PUT_B4 54 #define HEXAGON_V_PUT_B5 HEXAGON_V64_PUT_B5 55 #define HEXAGON_V_PUT_B6 HEXAGON_V64_PUT_B6 56 #define HEXAGON_V_PUT_B7 HEXAGON_V64_PUT_B7 57 #define HEXAGON_V_CREATE_D HEXAGON_V64_CREATE_D 58 #define HEXAGON_V_CREATE_W HEXAGON_V64_CREATE_W 59 #define HEXAGON_V_CREATE_H HEXAGON_V64_CREATE_H 60 #define HEXAGON_V_CREATE_B HEXAGON_V64_CREATE_B 61 62 #ifdef __cplusplus 63 #define HEXAGON_VectC HEXAGON_Vect64C 64 #endif /* __cplusplus */ 65 66 /* 64 Bit Vectors */ 67 68 typedef long long __attribute__((__may_alias__)) HEXAGON_Vect64; 69 70 /* Extract doubleword macros */ 71 72 #define HEXAGON_V64_GET_D(v) (v) 73 #define HEXAGON_V64_GET_UD(v) ((unsigned long long)(v)) 74 75 /* Extract word macros */ 76 77 #define HEXAGON_V64_GET_W0(v) \ 78 __extension__({ \ 79 union { \ 80 long long d; \ 81 int w[2]; \ 82 } _HEXAGON_V64_internal_union; \ 83 _HEXAGON_V64_internal_union.d = (v); \ 84 _HEXAGON_V64_internal_union.w[0]; \ 85 }) 86 #define HEXAGON_V64_GET_W1(v) \ 87 __extension__({ \ 88 union { \ 89 long long d; \ 90 int w[2]; \ 91 } _HEXAGON_V64_internal_union; \ 92 _HEXAGON_V64_internal_union.d = (v); \ 93 _HEXAGON_V64_internal_union.w[1]; \ 94 }) 95 #define HEXAGON_V64_GET_UW0(v) \ 96 __extension__({ \ 97 union { \ 98 long long d; \ 99 unsigned int uw[2]; \ 100 } _HEXAGON_V64_internal_union; \ 101 _HEXAGON_V64_internal_union.d = (v); \ 102 _HEXAGON_V64_internal_union.uw[0]; \ 103 }) 104 #define HEXAGON_V64_GET_UW1(v) \ 105 __extension__({ \ 106 union { \ 107 long long d; \ 108 unsigned int uw[2]; \ 109 } _HEXAGON_V64_internal_union; \ 110 _HEXAGON_V64_internal_union.d = (v); \ 111 _HEXAGON_V64_internal_union.uw[1]; \ 112 }) 113 114 /* Extract half word macros */ 115 116 #define HEXAGON_V64_GET_H0(v) \ 117 __extension__({ \ 118 union { \ 119 long long d; \ 120 short h[4]; \ 121 } _HEXAGON_V64_internal_union; \ 122 _HEXAGON_V64_internal_union.d = (v); \ 123 _HEXAGON_V64_internal_union.h[0]; \ 124 }) 125 #define HEXAGON_V64_GET_H1(v) \ 126 __extension__({ \ 127 union { \ 128 long long d; \ 129 short h[4]; \ 130 } _HEXAGON_V64_internal_union; \ 131 _HEXAGON_V64_internal_union.d = (v); \ 132 _HEXAGON_V64_internal_union.h[1]; \ 133 }) 134 #define HEXAGON_V64_GET_H2(v) \ 135 __extension__({ \ 136 union { \ 137 long long d; \ 138 short h[4]; \ 139 } _HEXAGON_V64_internal_union; \ 140 _HEXAGON_V64_internal_union.d = (v); \ 141 _HEXAGON_V64_internal_union.h[2]; \ 142 }) 143 #define HEXAGON_V64_GET_H3(v) \ 144 __extension__({ \ 145 union { \ 146 long long d; \ 147 short h[4]; \ 148 } _HEXAGON_V64_internal_union; \ 149 _HEXAGON_V64_internal_union.d = (v); \ 150 _HEXAGON_V64_internal_union.h[3]; \ 151 }) 152 #define HEXAGON_V64_GET_UH0(v) \ 153 __extension__({ \ 154 union { \ 155 long long d; \ 156 unsigned short uh[4]; \ 157 } _HEXAGON_V64_internal_union; \ 158 _HEXAGON_V64_internal_union.d = (v); \ 159 _HEXAGON_V64_internal_union.uh[0]; \ 160 }) 161 #define HEXAGON_V64_GET_UH1(v) \ 162 __extension__({ \ 163 union { \ 164 long long d; \ 165 unsigned short uh[4]; \ 166 } _HEXAGON_V64_internal_union; \ 167 _HEXAGON_V64_internal_union.d = (v); \ 168 _HEXAGON_V64_internal_union.uh[1]; \ 169 }) 170 #define HEXAGON_V64_GET_UH2(v) \ 171 __extension__({ \ 172 union { \ 173 long long d; \ 174 unsigned short uh[4]; \ 175 } _HEXAGON_V64_internal_union; \ 176 _HEXAGON_V64_internal_union.d = (v); \ 177 _HEXAGON_V64_internal_union.uh[2]; \ 178 }) 179 #define HEXAGON_V64_GET_UH3(v) \ 180 __extension__({ \ 181 union { \ 182 long long d; \ 183 unsigned short uh[4]; \ 184 } _HEXAGON_V64_internal_union; \ 185 _HEXAGON_V64_internal_union.d = (v); \ 186 _HEXAGON_V64_internal_union.uh[3]; \ 187 }) 188 189 /* Extract byte macros */ 190 191 #define HEXAGON_V64_GET_B0(v) \ 192 __extension__({ \ 193 union { \ 194 long long d; \ 195 signed char b[8]; \ 196 } _HEXAGON_V64_internal_union; \ 197 _HEXAGON_V64_internal_union.d = (v); \ 198 _HEXAGON_V64_internal_union.b[0]; \ 199 }) 200 #define HEXAGON_V64_GET_B1(v) \ 201 __extension__({ \ 202 union { \ 203 long long d; \ 204 signed char b[8]; \ 205 } _HEXAGON_V64_internal_union; \ 206 _HEXAGON_V64_internal_union.d = (v); \ 207 _HEXAGON_V64_internal_union.b[1]; \ 208 }) 209 #define HEXAGON_V64_GET_B2(v) \ 210 __extension__({ \ 211 union { \ 212 long long d; \ 213 signed char b[8]; \ 214 } _HEXAGON_V64_internal_union; \ 215 _HEXAGON_V64_internal_union.d = (v); \ 216 _HEXAGON_V64_internal_union.b[2]; \ 217 }) 218 #define HEXAGON_V64_GET_B3(v) \ 219 __extension__({ \ 220 union { \ 221 long long d; \ 222 signed char b[8]; \ 223 } _HEXAGON_V64_internal_union; \ 224 _HEXAGON_V64_internal_union.d = (v); \ 225 _HEXAGON_V64_internal_union.b[3]; \ 226 }) 227 #define HEXAGON_V64_GET_B4(v) \ 228 __extension__({ \ 229 union { \ 230 long long d; \ 231 signed char b[8]; \ 232 } _HEXAGON_V64_internal_union; \ 233 _HEXAGON_V64_internal_union.d = (v); \ 234 _HEXAGON_V64_internal_union.b[4]; \ 235 }) 236 #define HEXAGON_V64_GET_B5(v) \ 237 __extension__({ \ 238 union { \ 239 long long d; \ 240 signed char b[8]; \ 241 } _HEXAGON_V64_internal_union; \ 242 _HEXAGON_V64_internal_union.d = (v); \ 243 _HEXAGON_V64_internal_union.b[5]; \ 244 }) 245 #define HEXAGON_V64_GET_B6(v) \ 246 __extension__({ \ 247 union { \ 248 long long d; \ 249 signed char b[8]; \ 250 } _HEXAGON_V64_internal_union; \ 251 _HEXAGON_V64_internal_union.d = (v); \ 252 _HEXAGON_V64_internal_union.b[6]; \ 253 }) 254 #define HEXAGON_V64_GET_B7(v) \ 255 __extension__({ \ 256 union { \ 257 long long d; \ 258 signed char b[8]; \ 259 } _HEXAGON_V64_internal_union; \ 260 _HEXAGON_V64_internal_union.d = (v); \ 261 _HEXAGON_V64_internal_union.b[7]; \ 262 }) 263 #define HEXAGON_V64_GET_UB0(v) \ 264 __extension__({ \ 265 union { \ 266 long long d; \ 267 unsigned char ub[8]; \ 268 } _HEXAGON_V64_internal_union; \ 269 _HEXAGON_V64_internal_union.d = (v); \ 270 _HEXAGON_V64_internal_union.ub[0]; \ 271 }) 272 #define HEXAGON_V64_GET_UB1(v) \ 273 __extension__({ \ 274 union { \ 275 long long d; \ 276 unsigned char ub[8]; \ 277 } _HEXAGON_V64_internal_union; \ 278 _HEXAGON_V64_internal_union.d = (v); \ 279 _HEXAGON_V64_internal_union.ub[1]; \ 280 }) 281 #define HEXAGON_V64_GET_UB2(v) \ 282 __extension__({ \ 283 union { \ 284 long long d; \ 285 unsigned char ub[8]; \ 286 } _HEXAGON_V64_internal_union; \ 287 _HEXAGON_V64_internal_union.d = (v); \ 288 _HEXAGON_V64_internal_union.ub[2]; \ 289 }) 290 #define HEXAGON_V64_GET_UB3(v) \ 291 __extension__({ \ 292 union { \ 293 long long d; \ 294 unsigned char ub[8]; \ 295 } _HEXAGON_V64_internal_union; \ 296 _HEXAGON_V64_internal_union.d = (v); \ 297 _HEXAGON_V64_internal_union.ub[3]; \ 298 }) 299 #define HEXAGON_V64_GET_UB4(v) \ 300 __extension__({ \ 301 union { \ 302 long long d; \ 303 unsigned char ub[8]; \ 304 } _HEXAGON_V64_internal_union; \ 305 _HEXAGON_V64_internal_union.d = (v); \ 306 _HEXAGON_V64_internal_union.ub[4]; \ 307 }) 308 #define HEXAGON_V64_GET_UB5(v) \ 309 __extension__({ \ 310 union { \ 311 long long d; \ 312 unsigned char ub[8]; \ 313 } _HEXAGON_V64_internal_union; \ 314 _HEXAGON_V64_internal_union.d = (v); \ 315 _HEXAGON_V64_internal_union.ub[5]; \ 316 }) 317 #define HEXAGON_V64_GET_UB6(v) \ 318 __extension__({ \ 319 union { \ 320 long long d; \ 321 unsigned char ub[8]; \ 322 } _HEXAGON_V64_internal_union; \ 323 _HEXAGON_V64_internal_union.d = (v); \ 324 _HEXAGON_V64_internal_union.ub[6]; \ 325 }) 326 #define HEXAGON_V64_GET_UB7(v) \ 327 __extension__({ \ 328 union { \ 329 long long d; \ 330 unsigned char ub[8]; \ 331 } _HEXAGON_V64_internal_union; \ 332 _HEXAGON_V64_internal_union.d = (v); \ 333 _HEXAGON_V64_internal_union.ub[7]; \ 334 }) 335 336 /* NOTE: All set macros return a HEXAGON_Vect64 type */ 337 338 /* Set doubleword macro */ 339 340 #define HEXAGON_V64_PUT_D(v, new) (new) 341 342 /* Set word macros */ 343 344 #ifdef __hexagon__ 345 346 #define HEXAGON_V64_PUT_W0(v, new) \ 347 __extension__({ \ 348 union { \ 349 long long d; \ 350 int w[2]; \ 351 } _HEXAGON_V64_internal_union; \ 352 _HEXAGON_V64_internal_union.d = (v); \ 353 _HEXAGON_V64_internal_union.w[0] = (new); \ 354 _HEXAGON_V64_internal_union.d; \ 355 }) 356 #define HEXAGON_V64_PUT_W1(v, new) \ 357 __extension__({ \ 358 union { \ 359 long long d; \ 360 int w[2]; \ 361 } _HEXAGON_V64_internal_union; \ 362 _HEXAGON_V64_internal_union.d = (v); \ 363 _HEXAGON_V64_internal_union.w[1] = (new); \ 364 _HEXAGON_V64_internal_union.d; \ 365 }) 366 367 #else /* !__hexagon__ */ 368 369 #define HEXAGON_V64_PUT_W0(v, new) \ 370 (((v) & 0xffffffff00000000LL) | ((HEXAGON_Vect64)((unsigned int)(new)))) 371 #define HEXAGON_V64_PUT_W1(v, new) \ 372 (((v) & 0x00000000ffffffffLL) | (((HEXAGON_Vect64)(new)) << 32LL)) 373 374 #endif /* !__hexagon__ */ 375 376 /* Set half word macros */ 377 378 #ifdef __hexagon__ 379 380 #define HEXAGON_V64_PUT_H0(v, new) \ 381 __extension__({ \ 382 union { \ 383 long long d; \ 384 short h[4]; \ 385 } _HEXAGON_V64_internal_union; \ 386 _HEXAGON_V64_internal_union.d = (v); \ 387 _HEXAGON_V64_internal_union.h[0] = (new); \ 388 _HEXAGON_V64_internal_union.d; \ 389 }) 390 #define HEXAGON_V64_PUT_H1(v, new) \ 391 __extension__({ \ 392 union { \ 393 long long d; \ 394 short h[4]; \ 395 } _HEXAGON_V64_internal_union; \ 396 _HEXAGON_V64_internal_union.d = (v); \ 397 _HEXAGON_V64_internal_union.h[1] = (new); \ 398 _HEXAGON_V64_internal_union.d; \ 399 }) 400 #define HEXAGON_V64_PUT_H2(v, new) \ 401 __extension__({ \ 402 union { \ 403 long long d; \ 404 short h[4]; \ 405 } _HEXAGON_V64_internal_union; \ 406 _HEXAGON_V64_internal_union.d = (v); \ 407 _HEXAGON_V64_internal_union.h[2] = (new); \ 408 _HEXAGON_V64_internal_union.d; \ 409 }) 410 #define HEXAGON_V64_PUT_H3(v, new) \ 411 __extension__({ \ 412 union { \ 413 long long d; \ 414 short h[4]; \ 415 } _HEXAGON_V64_internal_union; \ 416 _HEXAGON_V64_internal_union.d = (v); \ 417 _HEXAGON_V64_internal_union.h[3] = (new); \ 418 _HEXAGON_V64_internal_union.d; \ 419 }) 420 421 #else /* !__hexagon__ */ 422 423 #define HEXAGON_V64_PUT_H0(v, new) \ 424 (((v) & 0xffffffffffff0000LL) | ((HEXAGON_Vect64)((unsigned short)(new)))) 425 #define HEXAGON_V64_PUT_H1(v, new) \ 426 (((v) & 0xffffffff0000ffffLL) | (((HEXAGON_Vect64)((unsigned short)(new))) << 16LL)) 427 #define HEXAGON_V64_PUT_H2(v, new) \ 428 (((v) & 0xffff0000ffffffffLL) | (((HEXAGON_Vect64)((unsigned short)(new))) << 32LL)) 429 #define HEXAGON_V64_PUT_H3(v, new) \ 430 (((v) & 0x0000ffffffffffffLL) | (((HEXAGON_Vect64)(new)) << 48LL)) 431 432 #endif /* !__hexagon__ */ 433 434 /* Set byte macros */ 435 436 #ifdef __hexagon__ 437 438 #define HEXAGON_V64_PUT_B0(v, new) \ 439 __extension__({ \ 440 union { \ 441 long long d; \ 442 char b[8]; \ 443 } _HEXAGON_V64_internal_union; \ 444 _HEXAGON_V64_internal_union.d = (v); \ 445 _HEXAGON_V64_internal_union.b[0] = (new); \ 446 _HEXAGON_V64_internal_union.d; \ 447 }) 448 #define HEXAGON_V64_PUT_B1(v, new) \ 449 __extension__({ \ 450 union { \ 451 long long d; \ 452 char b[8]; \ 453 } _HEXAGON_V64_internal_union; \ 454 _HEXAGON_V64_internal_union.d = (v); \ 455 _HEXAGON_V64_internal_union.b[1] = (new); \ 456 _HEXAGON_V64_internal_union.d; \ 457 }) 458 #define HEXAGON_V64_PUT_B2(v, new) \ 459 __extension__({ \ 460 union { \ 461 long long d; \ 462 char b[8]; \ 463 } _HEXAGON_V64_internal_union; \ 464 _HEXAGON_V64_internal_union.d = (v); \ 465 _HEXAGON_V64_internal_union.b[2] = (new); \ 466 _HEXAGON_V64_internal_union.d; \ 467 }) 468 #define HEXAGON_V64_PUT_B3(v, new) \ 469 __extension__({ \ 470 union { \ 471 long long d; \ 472 char b[8]; \ 473 } _HEXAGON_V64_internal_union; \ 474 _HEXAGON_V64_internal_union.d = (v); \ 475 _HEXAGON_V64_internal_union.b[3] = (new); \ 476 _HEXAGON_V64_internal_union.d; \ 477 }) 478 #define HEXAGON_V64_PUT_B4(v, new) \ 479 __extension__({ \ 480 union { \ 481 long long d; \ 482 char b[8]; \ 483 } _HEXAGON_V64_internal_union; \ 484 _HEXAGON_V64_internal_union.d = (v); \ 485 _HEXAGON_V64_internal_union.b[4] = (new); \ 486 _HEXAGON_V64_internal_union.d; \ 487 }) 488 #define HEXAGON_V64_PUT_B5(v, new) \ 489 __extension__({ \ 490 union { \ 491 long long d; \ 492 char b[8]; \ 493 } _HEXAGON_V64_internal_union; \ 494 _HEXAGON_V64_internal_union.d = (v); \ 495 _HEXAGON_V64_internal_union.b[5] = (new); \ 496 _HEXAGON_V64_internal_union.d; \ 497 }) 498 #define HEXAGON_V64_PUT_B6(v, new) \ 499 __extension__({ \ 500 union { \ 501 long long d; \ 502 char b[8]; \ 503 } _HEXAGON_V64_internal_union; \ 504 _HEXAGON_V64_internal_union.d = (v); \ 505 _HEXAGON_V64_internal_union.b[6] = (new); \ 506 _HEXAGON_V64_internal_union.d; \ 507 }) 508 #define HEXAGON_V64_PUT_B7(v, new) \ 509 __extension__({ \ 510 union { \ 511 long long d; \ 512 char b[8]; \ 513 } _HEXAGON_V64_internal_union; \ 514 _HEXAGON_V64_internal_union.d = (v); \ 515 _HEXAGON_V64_internal_union.b[7] = (new); \ 516 _HEXAGON_V64_internal_union.d; \ 517 }) 518 519 #else /* !__hexagon__ */ 520 521 #define HEXAGON_V64_PUT_B0(v, new) \ 522 (((v) & 0xffffffffffffff00LL) | ((HEXAGON_Vect64)((unsigned char)(new)))) 523 #define HEXAGON_V64_PUT_B1(v, new) \ 524 (((v) & 0xffffffffffff00ffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 8LL)) 525 #define HEXAGON_V64_PUT_B2(v, new) \ 526 (((v) & 0xffffffffff00ffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 16LL)) 527 #define HEXAGON_V64_PUT_B3(v, new) \ 528 (((v) & 0xffffffff00ffffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 24LL)) 529 #define HEXAGON_V64_PUT_B4(v, new) \ 530 (((v) & 0xffffff00ffffffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 32LL)) 531 #define HEXAGON_V64_PUT_B5(v, new) \ 532 (((v) & 0xffff00ffffffffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 40LL)) 533 #define HEXAGON_V64_PUT_B6(v, new) \ 534 (((v) & 0xff00ffffffffffffLL) | (((HEXAGON_Vect64)((unsigned char)(new))) << 48LL)) 535 #define HEXAGON_V64_PUT_B7(v, new) \ 536 (((v) & 0x00ffffffffffffffLL) | (((HEXAGON_Vect64)(new)) << 56LL)) 537 538 #endif /* !__hexagon__ */ 539 540 /* NOTE: All create macros return a HEXAGON_Vect64 type */ 541 542 /* Create from a doubleword */ 543 544 #define HEXAGON_V64_CREATE_D(d) (d) 545 546 /* Create from words */ 547 548 #ifdef __hexagon__ 549 550 #define HEXAGON_V64_CREATE_W(w1, w0) \ 551 __extension__({ \ 552 union { \ 553 long long d; \ 554 int w[2]; \ 555 } _HEXAGON_V64_internal_union; \ 556 _HEXAGON_V64_internal_union.w[0] = (w0); \ 557 _HEXAGON_V64_internal_union.w[1] = (w1); \ 558 _HEXAGON_V64_internal_union.d; \ 559 }) 560 561 #else /* !__hexagon__ */ 562 563 #define HEXAGON_V64_CREATE_W(w1, w0) \ 564 ((((HEXAGON_Vect64)(w1)) << 32LL) | ((HEXAGON_Vect64)((w0) & 0xffffffff))) 565 566 #endif /* !__hexagon__ */ 567 568 /* Create from half words */ 569 570 #ifdef __hexagon__ 571 572 #define HEXAGON_V64_CREATE_H(h3, h2, h1, h0) \ 573 __extension__({ \ 574 union { \ 575 long long d; \ 576 short h[4]; \ 577 } _HEXAGON_V64_internal_union; \ 578 _HEXAGON_V64_internal_union.h[0] = (h0); \ 579 _HEXAGON_V64_internal_union.h[1] = (h1); \ 580 _HEXAGON_V64_internal_union.h[2] = (h2); \ 581 _HEXAGON_V64_internal_union.h[3] = (h3); \ 582 _HEXAGON_V64_internal_union.d; \ 583 }) 584 585 #else /* !__hexagon__ */ 586 587 #define HEXAGON_V64_CREATE_H(h3, h2, h1, h0) \ 588 ((((HEXAGON_Vect64)(h3)) << 48LL) | (((HEXAGON_Vect64)((h2) & 0xffff)) << 32LL) | \ 589 (((HEXAGON_Vect64)((h1) & 0xffff)) << 16LL) | ((HEXAGON_Vect64)((h0) & 0xffff))) 590 591 #endif /* !__hexagon__ */ 592 593 /* Create from bytes */ 594 595 #ifdef __hexagon__ 596 597 #define HEXAGON_V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0) \ 598 __extension__({ \ 599 union { \ 600 long long d; \ 601 char b[8]; \ 602 } _HEXAGON_V64_internal_union; \ 603 _HEXAGON_V64_internal_union.b[0] = (b0); \ 604 _HEXAGON_V64_internal_union.b[1] = (b1); \ 605 _HEXAGON_V64_internal_union.b[2] = (b2); \ 606 _HEXAGON_V64_internal_union.b[3] = (b3); \ 607 _HEXAGON_V64_internal_union.b[4] = (b4); \ 608 _HEXAGON_V64_internal_union.b[5] = (b5); \ 609 _HEXAGON_V64_internal_union.b[6] = (b6); \ 610 _HEXAGON_V64_internal_union.b[7] = (b7); \ 611 _HEXAGON_V64_internal_union.d; \ 612 }) 613 614 #else /* !__hexagon__ */ 615 616 #define HEXAGON_V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0) \ 617 ((((HEXAGON_Vect64)(b7)) << 56LL) | (((HEXAGON_Vect64)((b6) & 0xff)) << 48LL) | \ 618 (((HEXAGON_Vect64)((b5) & 0xff)) << 40LL) | (((HEXAGON_Vect64)((b4) & 0xff)) << 32LL) | \ 619 (((HEXAGON_Vect64)((b3) & 0xff)) << 24LL) | (((HEXAGON_Vect64)((b2) & 0xff)) << 16LL) | \ 620 (((HEXAGON_Vect64)((b1) & 0xff)) << 8LL) | ((HEXAGON_Vect64)((b0) & 0xff))) 621 622 #endif /* !__hexagon__ */ 623 624 #ifdef __cplusplus 625 626 class HEXAGON_Vect64C { 627 public: 628 // Constructors data(d)629 HEXAGON_Vect64C(long long d = 0) : data(d) {}; HEXAGON_Vect64C(int w1,int w0)630 HEXAGON_Vect64C(int w1, int w0) : data(HEXAGON_V64_CREATE_W(w1, w0)) {}; HEXAGON_Vect64C(short h3,short h2,short h1,short h0)631 HEXAGON_Vect64C(short h3, short h2, short h1, short h0) 632 : data(HEXAGON_V64_CREATE_H(h3, h2, h1, h0)) {}; HEXAGON_Vect64C(signed char b7,signed char b6,signed char b5,signed char b4,signed char b3,signed char b2,signed char b1,signed char b0)633 HEXAGON_Vect64C(signed char b7, signed char b6, signed char b5, signed char b4, 634 signed char b3, signed char b2, signed char b1, signed char b0) 635 : data(HEXAGON_V64_CREATE_B(b7, b6, b5, b4, b3, b2, b1, b0)) {}; HEXAGON_Vect64C(const HEXAGON_Vect64C & v)636 HEXAGON_Vect64C(const HEXAGON_Vect64C &v) : data(v.data) {}; 637 638 HEXAGON_Vect64C &operator=(const HEXAGON_Vect64C &v) { 639 data = v.data; 640 return *this; 641 }; 642 643 operator long long() { 644 return data; 645 }; 646 647 // Extract doubleword methods D(void)648 long long D(void) { 649 return HEXAGON_V64_GET_D(data); 650 }; UD(void)651 unsigned long long UD(void) { 652 return HEXAGON_V64_GET_UD(data); 653 }; 654 655 // Extract word methods W0(void)656 int W0(void) { 657 return HEXAGON_V64_GET_W0(data); 658 }; W1(void)659 int W1(void) { 660 return HEXAGON_V64_GET_W1(data); 661 }; UW0(void)662 unsigned int UW0(void) { 663 return HEXAGON_V64_GET_UW0(data); 664 }; UW1(void)665 unsigned int UW1(void) { 666 return HEXAGON_V64_GET_UW1(data); 667 }; 668 669 // Extract half word methods H0(void)670 short H0(void) { 671 return HEXAGON_V64_GET_H0(data); 672 }; H1(void)673 short H1(void) { 674 return HEXAGON_V64_GET_H1(data); 675 }; H2(void)676 short H2(void) { 677 return HEXAGON_V64_GET_H2(data); 678 }; H3(void)679 short H3(void) { 680 return HEXAGON_V64_GET_H3(data); 681 }; UH0(void)682 unsigned short UH0(void) { 683 return HEXAGON_V64_GET_UH0(data); 684 }; UH1(void)685 unsigned short UH1(void) { 686 return HEXAGON_V64_GET_UH1(data); 687 }; UH2(void)688 unsigned short UH2(void) { 689 return HEXAGON_V64_GET_UH2(data); 690 }; UH3(void)691 unsigned short UH3(void) { 692 return HEXAGON_V64_GET_UH3(data); 693 }; 694 695 // Extract byte methods B0(void)696 signed char B0(void) { 697 return HEXAGON_V64_GET_B0(data); 698 }; B1(void)699 signed char B1(void) { 700 return HEXAGON_V64_GET_B1(data); 701 }; B2(void)702 signed char B2(void) { 703 return HEXAGON_V64_GET_B2(data); 704 }; B3(void)705 signed char B3(void) { 706 return HEXAGON_V64_GET_B3(data); 707 }; B4(void)708 signed char B4(void) { 709 return HEXAGON_V64_GET_B4(data); 710 }; B5(void)711 signed char B5(void) { 712 return HEXAGON_V64_GET_B5(data); 713 }; B6(void)714 signed char B6(void) { 715 return HEXAGON_V64_GET_B6(data); 716 }; B7(void)717 signed char B7(void) { 718 return HEXAGON_V64_GET_B7(data); 719 }; UB0(void)720 unsigned char UB0(void) { 721 return HEXAGON_V64_GET_UB0(data); 722 }; UB1(void)723 unsigned char UB1(void) { 724 return HEXAGON_V64_GET_UB1(data); 725 }; UB2(void)726 unsigned char UB2(void) { 727 return HEXAGON_V64_GET_UB2(data); 728 }; UB3(void)729 unsigned char UB3(void) { 730 return HEXAGON_V64_GET_UB3(data); 731 }; UB4(void)732 unsigned char UB4(void) { 733 return HEXAGON_V64_GET_UB4(data); 734 }; UB5(void)735 unsigned char UB5(void) { 736 return HEXAGON_V64_GET_UB5(data); 737 }; UB6(void)738 unsigned char UB6(void) { 739 return HEXAGON_V64_GET_UB6(data); 740 }; UB7(void)741 unsigned char UB7(void) { 742 return HEXAGON_V64_GET_UB7(data); 743 }; 744 745 // NOTE: All set methods return a HEXAGON_Vect64C type 746 747 // Set doubleword method D(long long d)748 HEXAGON_Vect64C D(long long d) { 749 return HEXAGON_Vect64C(HEXAGON_V64_PUT_D(data, d)); 750 }; 751 752 // Set word methods W0(int w)753 HEXAGON_Vect64C W0(int w) { 754 return HEXAGON_Vect64C(HEXAGON_V64_PUT_W0(data, w)); 755 }; W1(int w)756 HEXAGON_Vect64C W1(int w) { 757 return HEXAGON_Vect64C(HEXAGON_V64_PUT_W1(data, w)); 758 }; 759 760 // Set half word methods H0(short h)761 HEXAGON_Vect64C H0(short h) { 762 return HEXAGON_Vect64C(HEXAGON_V64_PUT_H0(data, h)); 763 }; H1(short h)764 HEXAGON_Vect64C H1(short h) { 765 return HEXAGON_Vect64C(HEXAGON_V64_PUT_H1(data, h)); 766 }; H2(short h)767 HEXAGON_Vect64C H2(short h) { 768 return HEXAGON_Vect64C(HEXAGON_V64_PUT_H2(data, h)); 769 }; H3(short h)770 HEXAGON_Vect64C H3(short h) { 771 return HEXAGON_Vect64C(HEXAGON_V64_PUT_H3(data, h)); 772 }; 773 774 // Set byte methods B0(signed char b)775 HEXAGON_Vect64C B0(signed char b) { 776 return HEXAGON_Vect64C(HEXAGON_V64_PUT_B0(data, b)); 777 }; B1(signed char b)778 HEXAGON_Vect64C B1(signed char b) { 779 return HEXAGON_Vect64C(HEXAGON_V64_PUT_B1(data, b)); 780 }; B2(signed char b)781 HEXAGON_Vect64C B2(signed char b) { 782 return HEXAGON_Vect64C(HEXAGON_V64_PUT_B2(data, b)); 783 }; B3(signed char b)784 HEXAGON_Vect64C B3(signed char b) { 785 return HEXAGON_Vect64C(HEXAGON_V64_PUT_B3(data, b)); 786 }; B4(signed char b)787 HEXAGON_Vect64C B4(signed char b) { 788 return HEXAGON_Vect64C(HEXAGON_V64_PUT_B4(data, b)); 789 }; B5(signed char b)790 HEXAGON_Vect64C B5(signed char b) { 791 return HEXAGON_Vect64C(HEXAGON_V64_PUT_B5(data, b)); 792 }; B6(signed char b)793 HEXAGON_Vect64C B6(signed char b) { 794 return HEXAGON_Vect64C(HEXAGON_V64_PUT_B6(data, b)); 795 }; B7(signed char b)796 HEXAGON_Vect64C B7(signed char b) { 797 return HEXAGON_Vect64C(HEXAGON_V64_PUT_B7(data, b)); 798 }; 799 800 private: 801 long long data; 802 }; 803 804 #endif /* __cplusplus */ 805 806 /* 32 Bit Vectors */ 807 808 typedef int HEXAGON_Vect32; 809 810 /* Extract word macros */ 811 812 #define HEXAGON_V32_GET_W(v) (v) 813 #define HEXAGON_V32_GET_UW(v) ((unsigned int)(v)) 814 815 /* Extract half word macros */ 816 817 #define HEXAGON_V32_GET_H0(v) \ 818 __extension__({ \ 819 union { \ 820 int w; \ 821 short h[2]; \ 822 } _HEXAGON_V32_internal_union; \ 823 _HEXAGON_V32_internal_union.w = (v); \ 824 _HEXAGON_V32_internal_union.h[0]; \ 825 }) 826 #define HEXAGON_V32_GET_H1(v) \ 827 __extension__({ \ 828 union { \ 829 int w; \ 830 short h[2]; \ 831 } _HEXAGON_V32_internal_union; \ 832 _HEXAGON_V32_internal_union.w = (v); \ 833 _HEXAGON_V32_internal_union.h[1]; \ 834 }) 835 #define HEXAGON_V32_GET_UH0(v) \ 836 __extension__({ \ 837 union { \ 838 int w; \ 839 unsigned short uh[2]; \ 840 } _HEXAGON_V32_internal_union; \ 841 _HEXAGON_V32_internal_union.w = (v); \ 842 _HEXAGON_V32_internal_union.uh[0]; \ 843 }) 844 #define HEXAGON_V32_GET_UH1(v) \ 845 __extension__({ \ 846 union { \ 847 int w; \ 848 unsigned short uh[2]; \ 849 } _HEXAGON_V32_internal_union; \ 850 _HEXAGON_V32_internal_union.w = (v); \ 851 _HEXAGON_V32_internal_union.uh[1]; \ 852 }) 853 854 /* Extract byte macros */ 855 856 #define HEXAGON_V32_GET_B0(v) \ 857 __extension__({ \ 858 union { \ 859 int w; \ 860 signed char b[4]; \ 861 } _HEXAGON_V32_internal_union; \ 862 _HEXAGON_V32_internal_union.w = (v); \ 863 _HEXAGON_V32_internal_union.b[0]; \ 864 }) 865 #define HEXAGON_V32_GET_B1(v) \ 866 __extension__({ \ 867 union { \ 868 int w; \ 869 signed char b[4]; \ 870 } _HEXAGON_V32_internal_union; \ 871 _HEXAGON_V32_internal_union.w = (v); \ 872 _HEXAGON_V32_internal_union.b[1]; \ 873 }) 874 #define HEXAGON_V32_GET_B2(v) \ 875 __extension__({ \ 876 union { \ 877 int w; \ 878 signed char b[4]; \ 879 } _HEXAGON_V32_internal_union; \ 880 _HEXAGON_V32_internal_union.w = (v); \ 881 _HEXAGON_V32_internal_union.b[2]; \ 882 }) 883 #define HEXAGON_V32_GET_B3(v) \ 884 __extension__({ \ 885 union { \ 886 int w; \ 887 signed char b[4]; \ 888 } _HEXAGON_V32_internal_union; \ 889 _HEXAGON_V32_internal_union.w = (v); \ 890 _HEXAGON_V32_internal_union.b[3]; \ 891 }) 892 #define HEXAGON_V32_GET_UB0(v) \ 893 __extension__({ \ 894 union { \ 895 int w; \ 896 unsigned char ub[4]; \ 897 } _HEXAGON_V32_internal_union; \ 898 _HEXAGON_V32_internal_union.w = (v); \ 899 _HEXAGON_V32_internal_union.ub[0]; \ 900 }) 901 #define HEXAGON_V32_GET_UB1(v) \ 902 __extension__({ \ 903 union { \ 904 int w; \ 905 unsigned char ub[4]; \ 906 } _HEXAGON_V32_internal_union; \ 907 _HEXAGON_V32_internal_union.w = (v); \ 908 _HEXAGON_V32_internal_union.ub[1]; \ 909 }) 910 #define HEXAGON_V32_GET_UB2(v) \ 911 __extension__({ \ 912 union { \ 913 int w; \ 914 unsigned char ub[4]; \ 915 } _HEXAGON_V32_internal_union; \ 916 _HEXAGON_V32_internal_union.w = (v); \ 917 _HEXAGON_V32_internal_union.ub[2]; \ 918 }) 919 #define HEXAGON_V32_GET_UB3(v) \ 920 __extension__({ \ 921 union { \ 922 int w; \ 923 unsigned char ub[4]; \ 924 } _HEXAGON_V32_internal_union; \ 925 _HEXAGON_V32_internal_union.w = (v); \ 926 _HEXAGON_V32_internal_union.ub[3]; \ 927 }) 928 929 /* NOTE: All set macros return a HEXAGON_Vect32 type */ 930 931 /* Set word macro */ 932 933 #define HEXAGON_V32_PUT_W(v, new) (new) 934 935 /* Set half word macros */ 936 937 #ifdef __hexagon__ 938 939 #define HEXAGON_V32_PUT_H0(v, new) \ 940 __extension__({ \ 941 union { \ 942 int w; \ 943 short h[2]; \ 944 } _HEXAGON_V32_internal_union; \ 945 _HEXAGON_V32_internal_union.w = (v); \ 946 _HEXAGON_V32_internal_union.h[0] = (new); \ 947 _HEXAGON_V32_internal_union.w; \ 948 }) 949 #define HEXAGON_V32_PUT_H1(v, new) \ 950 __extension__({ \ 951 union { \ 952 int w; \ 953 short h[2]; \ 954 } _HEXAGON_V32_internal_union; \ 955 _HEXAGON_V32_internal_union.w = (v); \ 956 _HEXAGON_V32_internal_union.h[1] = (new); \ 957 _HEXAGON_V32_internal_union.w; \ 958 }) 959 960 #else /* !__hexagon__ */ 961 962 #define HEXAGON_V32_PUT_H0(v, new) \ 963 (((v) & 0xffff0000) | ((HEXAGON_Vect32)((unsigned short)(new)))) 964 #define HEXAGON_V32_PUT_H1(v, new) (((v) & 0x0000ffff) | (((HEXAGON_Vect32)(new)) << 16)) 965 966 #endif /* !__hexagon__ */ 967 968 /* Set byte macros */ 969 970 #ifdef __hexagon__ 971 972 #define HEXAGON_V32_PUT_B0(v, new) \ 973 __extension__({ \ 974 union { \ 975 int w; \ 976 char b[4]; \ 977 } _HEXAGON_V32_internal_union; \ 978 _HEXAGON_V32_internal_union.w = (v); \ 979 _HEXAGON_V32_internal_union.b[0] = (new); \ 980 _HEXAGON_V32_internal_union.w; \ 981 }) 982 #define HEXAGON_V32_PUT_B1(v, new) \ 983 __extension__({ \ 984 union { \ 985 int w; \ 986 char b[4]; \ 987 } _HEXAGON_V32_internal_union; \ 988 _HEXAGON_V32_internal_union.w = (v); \ 989 _HEXAGON_V32_internal_union.b[1] = (new); \ 990 _HEXAGON_V32_internal_union.w; \ 991 }) 992 #define HEXAGON_V32_PUT_B2(v, new) \ 993 __extension__({ \ 994 union { \ 995 int w; \ 996 char b[4]; \ 997 } _HEXAGON_V32_internal_union; \ 998 _HEXAGON_V32_internal_union.w = (v); \ 999 _HEXAGON_V32_internal_union.b[2] = (new); \ 1000 _HEXAGON_V32_internal_union.w; \ 1001 }) 1002 #define HEXAGON_V32_PUT_B3(v, new) \ 1003 __extension__({ \ 1004 union { \ 1005 int w; \ 1006 char b[4]; \ 1007 } _HEXAGON_V32_internal_union; \ 1008 _HEXAGON_V32_internal_union.w = (v); \ 1009 _HEXAGON_V32_internal_union.b[3] = (new); \ 1010 _HEXAGON_V32_internal_union.w; \ 1011 }) 1012 1013 #else /* !__hexagon__ */ 1014 1015 #define HEXAGON_V32_PUT_B0(v, new) \ 1016 (((v) & 0xffffff00) | ((HEXAGON_Vect32)((unsigned char)(new)))) 1017 #define HEXAGON_V32_PUT_B1(v, new) \ 1018 (((v) & 0xffff00ff) | (((HEXAGON_Vect32)((unsigned char)(new))) << 8)) 1019 #define HEXAGON_V32_PUT_B2(v, new) \ 1020 (((v) & 0xff00ffff) | (((HEXAGON_Vect32)((unsigned char)(new))) << 16)) 1021 #define HEXAGON_V32_PUT_B3(v, new) (((v) & 0x00ffffff) | (((HEXAGON_Vect32)(new)) << 24)) 1022 1023 #endif /* !__hexagon__ */ 1024 1025 /* NOTE: All create macros return a HEXAGON_Vect32 type */ 1026 1027 /* Create from a word */ 1028 1029 #define HEXAGON_V32_CREATE_W(w) (w) 1030 1031 /* Create from half words */ 1032 1033 #ifdef __hexagon__ 1034 1035 #define HEXAGON_V32_CREATE_H(h1, h0) \ 1036 __extension__({ \ 1037 union { \ 1038 long long d; \ 1039 short h[2]; \ 1040 } _HEXAGON_V32_internal_union; \ 1041 _HEXAGON_V32_internal_union.h[0] = (h0); \ 1042 _HEXAGON_V32_internal_union.h[1] = (h1); \ 1043 _HEXAGON_V32_internal_union.d; \ 1044 }) 1045 1046 #else /* !__hexagon__ */ 1047 1048 #define HEXAGON_V32_CREATE_H(h1, h0) \ 1049 ((((HEXAGON_Vect32)(h1)) << 16) | ((HEXAGON_Vect32)((h0) & 0xffff))) 1050 1051 #endif /* !__hexagon__ */ 1052 1053 /* Create from bytes */ 1054 #ifdef __hexagon__ 1055 1056 #define HEXAGON_V32_CREATE_B(b3, b2, b1, b0) \ 1057 __extension__({ \ 1058 union { \ 1059 long long d; \ 1060 char b[4]; \ 1061 } _HEXAGON_V32_internal_union; \ 1062 _HEXAGON_V32_internal_union.b[0] = (b0); \ 1063 _HEXAGON_V32_internal_union.b[1] = (b1); \ 1064 _HEXAGON_V32_internal_union.b[2] = (b2); \ 1065 _HEXAGON_V32_internal_union.b[3] = (b3); \ 1066 _HEXAGON_V32_internal_union.d; \ 1067 }) 1068 1069 #else /* !__hexagon__ */ 1070 1071 #define HEXAGON_V32_CREATE_B(b3, b2, b1, b0) \ 1072 ((((HEXAGON_Vect32)(b3)) << 24) | (((HEXAGON_Vect32)((b2) & 0xff)) << 16) | \ 1073 (((HEXAGON_Vect32)((b1) & 0xff)) << 8) | ((HEXAGON_Vect32)((b0) & 0xff))) 1074 1075 #endif /* !__hexagon__ */ 1076 1077 #ifdef __cplusplus 1078 1079 class HEXAGON_Vect32C { 1080 public: 1081 // Constructors data(w)1082 HEXAGON_Vect32C(int w = 0) : data(w) {}; HEXAGON_Vect32C(short h1,short h0)1083 HEXAGON_Vect32C(short h1, short h0) : data(HEXAGON_V32_CREATE_H(h1, h0)) {}; HEXAGON_Vect32C(signed char b3,signed char b2,signed char b1,signed char b0)1084 HEXAGON_Vect32C(signed char b3, signed char b2, signed char b1, signed char b0) 1085 : data(HEXAGON_V32_CREATE_B(b3, b2, b1, b0)) {}; HEXAGON_Vect32C(const HEXAGON_Vect32C & v)1086 HEXAGON_Vect32C(const HEXAGON_Vect32C &v) : data(v.data) {}; 1087 1088 HEXAGON_Vect32C &operator=(const HEXAGON_Vect32C &v) { 1089 data = v.data; 1090 return *this; 1091 }; 1092 1093 operator int() { 1094 return data; 1095 }; 1096 1097 // Extract word methods W(void)1098 int W(void) { 1099 return HEXAGON_V32_GET_W(data); 1100 }; UW(void)1101 unsigned int UW(void) { 1102 return HEXAGON_V32_GET_UW(data); 1103 }; 1104 1105 // Extract half word methods H0(void)1106 short H0(void) { 1107 return HEXAGON_V32_GET_H0(data); 1108 }; H1(void)1109 short H1(void) { 1110 return HEXAGON_V32_GET_H1(data); 1111 }; UH0(void)1112 unsigned short UH0(void) { 1113 return HEXAGON_V32_GET_UH0(data); 1114 }; UH1(void)1115 unsigned short UH1(void) { 1116 return HEXAGON_V32_GET_UH1(data); 1117 }; 1118 1119 // Extract byte methods B0(void)1120 signed char B0(void) { 1121 return HEXAGON_V32_GET_B0(data); 1122 }; B1(void)1123 signed char B1(void) { 1124 return HEXAGON_V32_GET_B1(data); 1125 }; B2(void)1126 signed char B2(void) { 1127 return HEXAGON_V32_GET_B2(data); 1128 }; B3(void)1129 signed char B3(void) { 1130 return HEXAGON_V32_GET_B3(data); 1131 }; UB0(void)1132 unsigned char UB0(void) { 1133 return HEXAGON_V32_GET_UB0(data); 1134 }; UB1(void)1135 unsigned char UB1(void) { 1136 return HEXAGON_V32_GET_UB1(data); 1137 }; UB2(void)1138 unsigned char UB2(void) { 1139 return HEXAGON_V32_GET_UB2(data); 1140 }; UB3(void)1141 unsigned char UB3(void) { 1142 return HEXAGON_V32_GET_UB3(data); 1143 }; 1144 1145 // NOTE: All set methods return a HEXAGON_Vect32C type 1146 1147 // Set word method W(int w)1148 HEXAGON_Vect32C W(int w) { 1149 return HEXAGON_Vect32C(HEXAGON_V32_PUT_W(data, w)); 1150 }; 1151 1152 // Set half word methods H0(short h)1153 HEXAGON_Vect32C H0(short h) { 1154 return HEXAGON_Vect32C(HEXAGON_V32_PUT_H0(data, h)); 1155 }; H1(short h)1156 HEXAGON_Vect32C H1(short h) { 1157 return HEXAGON_Vect32C(HEXAGON_V32_PUT_H1(data, h)); 1158 }; 1159 1160 // Set byte methods B0(signed char b)1161 HEXAGON_Vect32C B0(signed char b) { 1162 return HEXAGON_Vect32C(HEXAGON_V32_PUT_B0(data, b)); 1163 }; B1(signed char b)1164 HEXAGON_Vect32C B1(signed char b) { 1165 return HEXAGON_Vect32C(HEXAGON_V32_PUT_B1(data, b)); 1166 }; B2(signed char b)1167 HEXAGON_Vect32C B2(signed char b) { 1168 return HEXAGON_Vect32C(HEXAGON_V32_PUT_B2(data, b)); 1169 }; B3(signed char b)1170 HEXAGON_Vect32C B3(signed char b) { 1171 return HEXAGON_Vect32C(HEXAGON_V32_PUT_B3(data, b)); 1172 }; 1173 1174 private: 1175 int data; 1176 }; 1177 1178 #endif /* __cplusplus */ 1179 1180 // V65 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 data(d)1856 Q6Vect64C(long long d = 0) : data(d) {}; Q6Vect64C(int w1,int w0)1857 Q6Vect64C(int w1, int w0) : data(Q6V64_CREATE_W(w1, w0)) {}; Q6Vect64C(short h3,short h2,short h1,short h0)1858 Q6Vect64C(short h3, short h2, short h1, short h0) 1859 : data(Q6V64_CREATE_H(h3, h2, h1, h0)) {}; Q6Vect64C(signed char b7,signed char b6,signed char b5,signed char b4,signed char b3,signed char b2,signed char b1,signed char b0)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)) {}; Q6Vect64C(const Q6Vect64C & v)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 D(void)1875 long long D(void) { 1876 return Q6V64_GET_D(data); 1877 }; UD(void)1878 unsigned long long UD(void) { 1879 return Q6V64_GET_UD(data); 1880 }; 1881 1882 // Extract word methods W0(void)1883 int W0(void) { 1884 return Q6V64_GET_W0(data); 1885 }; W1(void)1886 int W1(void) { 1887 return Q6V64_GET_W1(data); 1888 }; UW0(void)1889 unsigned int UW0(void) { 1890 return Q6V64_GET_UW0(data); 1891 }; UW1(void)1892 unsigned int UW1(void) { 1893 return Q6V64_GET_UW1(data); 1894 }; 1895 1896 // Extract half word methods H0(void)1897 short H0(void) { 1898 return Q6V64_GET_H0(data); 1899 }; H1(void)1900 short H1(void) { 1901 return Q6V64_GET_H1(data); 1902 }; H2(void)1903 short H2(void) { 1904 return Q6V64_GET_H2(data); 1905 }; H3(void)1906 short H3(void) { 1907 return Q6V64_GET_H3(data); 1908 }; UH0(void)1909 unsigned short UH0(void) { 1910 return Q6V64_GET_UH0(data); 1911 }; UH1(void)1912 unsigned short UH1(void) { 1913 return Q6V64_GET_UH1(data); 1914 }; UH2(void)1915 unsigned short UH2(void) { 1916 return Q6V64_GET_UH2(data); 1917 }; UH3(void)1918 unsigned short UH3(void) { 1919 return Q6V64_GET_UH3(data); 1920 }; 1921 1922 // Extract byte methods B0(void)1923 signed char B0(void) { 1924 return Q6V64_GET_B0(data); 1925 }; B1(void)1926 signed char B1(void) { 1927 return Q6V64_GET_B1(data); 1928 }; B2(void)1929 signed char B2(void) { 1930 return Q6V64_GET_B2(data); 1931 }; B3(void)1932 signed char B3(void) { 1933 return Q6V64_GET_B3(data); 1934 }; B4(void)1935 signed char B4(void) { 1936 return Q6V64_GET_B4(data); 1937 }; B5(void)1938 signed char B5(void) { 1939 return Q6V64_GET_B5(data); 1940 }; B6(void)1941 signed char B6(void) { 1942 return Q6V64_GET_B6(data); 1943 }; B7(void)1944 signed char B7(void) { 1945 return Q6V64_GET_B7(data); 1946 }; UB0(void)1947 unsigned char UB0(void) { 1948 return Q6V64_GET_UB0(data); 1949 }; UB1(void)1950 unsigned char UB1(void) { 1951 return Q6V64_GET_UB1(data); 1952 }; UB2(void)1953 unsigned char UB2(void) { 1954 return Q6V64_GET_UB2(data); 1955 }; UB3(void)1956 unsigned char UB3(void) { 1957 return Q6V64_GET_UB3(data); 1958 }; UB4(void)1959 unsigned char UB4(void) { 1960 return Q6V64_GET_UB4(data); 1961 }; UB5(void)1962 unsigned char UB5(void) { 1963 return Q6V64_GET_UB5(data); 1964 }; UB6(void)1965 unsigned char UB6(void) { 1966 return Q6V64_GET_UB6(data); 1967 }; UB7(void)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 D(long long d)1975 Q6Vect64C D(long long d) { 1976 return Q6Vect64C(Q6V64_PUT_D(data, d)); 1977 }; 1978 1979 // Set word methods W0(int w)1980 Q6Vect64C W0(int w) { 1981 return Q6Vect64C(Q6V64_PUT_W0(data, w)); 1982 }; W1(int w)1983 Q6Vect64C W1(int w) { 1984 return Q6Vect64C(Q6V64_PUT_W1(data, w)); 1985 }; 1986 1987 // Set half word methods H0(short h)1988 Q6Vect64C H0(short h) { 1989 return Q6Vect64C(Q6V64_PUT_H0(data, h)); 1990 }; H1(short h)1991 Q6Vect64C H1(short h) { 1992 return Q6Vect64C(Q6V64_PUT_H1(data, h)); 1993 }; H2(short h)1994 Q6Vect64C H2(short h) { 1995 return Q6Vect64C(Q6V64_PUT_H2(data, h)); 1996 }; H3(short h)1997 Q6Vect64C H3(short h) { 1998 return Q6Vect64C(Q6V64_PUT_H3(data, h)); 1999 }; 2000 2001 // Set byte methods B0(signed char b)2002 Q6Vect64C B0(signed char b) { 2003 return Q6Vect64C(Q6V64_PUT_B0(data, b)); 2004 }; B1(signed char b)2005 Q6Vect64C B1(signed char b) { 2006 return Q6Vect64C(Q6V64_PUT_B1(data, b)); 2007 }; B2(signed char b)2008 Q6Vect64C B2(signed char b) { 2009 return Q6Vect64C(Q6V64_PUT_B2(data, b)); 2010 }; B3(signed char b)2011 Q6Vect64C B3(signed char b) { 2012 return Q6Vect64C(Q6V64_PUT_B3(data, b)); 2013 }; B4(signed char b)2014 Q6Vect64C B4(signed char b) { 2015 return Q6Vect64C(Q6V64_PUT_B4(data, b)); 2016 }; B5(signed char b)2017 Q6Vect64C B5(signed char b) { 2018 return Q6Vect64C(Q6V64_PUT_B5(data, b)); 2019 }; B6(signed char b)2020 Q6Vect64C B6(signed char b) { 2021 return Q6Vect64C(Q6V64_PUT_B6(data, b)); 2022 }; B7(signed char b)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 data(w)2309 Q6Vect32C(int w = 0) : data(w) {}; Q6Vect32C(short h1,short h0)2310 Q6Vect32C(short h1, short h0) : data(Q6V32_CREATE_H(h1, h0)) {}; Q6Vect32C(signed char b3,signed char b2,signed char b1,signed char b0)2311 Q6Vect32C(signed char b3, signed char b2, signed char b1, signed char b0) 2312 : data(Q6V32_CREATE_B(b3, b2, b1, b0)) {}; Q6Vect32C(const Q6Vect32C & v)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 W(void)2325 int W(void) { 2326 return Q6V32_GET_W(data); 2327 }; UW(void)2328 unsigned int UW(void) { 2329 return Q6V32_GET_UW(data); 2330 }; 2331 2332 // Extract half word methods H0(void)2333 short H0(void) { 2334 return Q6V32_GET_H0(data); 2335 }; H1(void)2336 short H1(void) { 2337 return Q6V32_GET_H1(data); 2338 }; UH0(void)2339 unsigned short UH0(void) { 2340 return Q6V32_GET_UH0(data); 2341 }; UH1(void)2342 unsigned short UH1(void) { 2343 return Q6V32_GET_UH1(data); 2344 }; 2345 2346 // Extract byte methods B0(void)2347 signed char B0(void) { 2348 return Q6V32_GET_B0(data); 2349 }; B1(void)2350 signed char B1(void) { 2351 return Q6V32_GET_B1(data); 2352 }; B2(void)2353 signed char B2(void) { 2354 return Q6V32_GET_B2(data); 2355 }; B3(void)2356 signed char B3(void) { 2357 return Q6V32_GET_B3(data); 2358 }; UB0(void)2359 unsigned char UB0(void) { 2360 return Q6V32_GET_UB0(data); 2361 }; UB1(void)2362 unsigned char UB1(void) { 2363 return Q6V32_GET_UB1(data); 2364 }; UB2(void)2365 unsigned char UB2(void) { 2366 return Q6V32_GET_UB2(data); 2367 }; UB3(void)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 W(int w)2375 Q6Vect32C W(int w) { 2376 return Q6Vect32C(Q6V32_PUT_W(data, w)); 2377 }; 2378 2379 // Set half word methods H0(short h)2380 Q6Vect32C H0(short h) { 2381 return Q6Vect32C(Q6V32_PUT_H0(data, h)); 2382 }; H1(short h)2383 Q6Vect32C H1(short h) { 2384 return Q6Vect32C(Q6V32_PUT_H1(data, h)); 2385 }; 2386 2387 // Set byte methods B0(signed char b)2388 Q6Vect32C B0(signed char b) { 2389 return Q6Vect32C(Q6V32_PUT_B0(data, b)); 2390 }; B1(signed char b)2391 Q6Vect32C B1(signed char b) { 2392 return Q6Vect32C(Q6V32_PUT_B1(data, b)); 2393 }; B2(signed char b)2394 Q6Vect32C B2(signed char b) { 2395 return Q6Vect32C(Q6V32_PUT_B2(data, b)); 2396 }; B3(signed char b)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. HVX_Vect()2528 HVX_Vect() : data(Q6_W_vcombine_VV(Q6_V_vzero(), Q6_V_vzero())){}; 2529 2530 // Custom constructors. HVX_Vect(HVX_VectorPair W)2531 HVX_Vect(HVX_VectorPair W) : data(W){}; HVX_Vect(HVX_Vector v1,HVX_Vector v0)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 HVX_VectorPair()2543 operator HVX_VectorPair() { return data; }; 2544 2545 // Extract VectorPair method. W(void)2546 HVX_VectorPair W(void) { return HEXAGON_HVX_GET_W(data); }; 2547 2548 // Extract Vector methods. V0(void)2549 HVX_Vector V0(void) { return HEXAGON_HVX_GET_V0(data); }; V1(void)2550 HVX_Vector V1(void) { return HEXAGON_HVX_GET_V1(data); }; P(void)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. W(HVX_VectorPair w)2555 HVX_Vect W(HVX_VectorPair w) { return HVX_Vect(HEXAGON_HVX_PUT_W(data, w)); }; 2556 2557 // Set HVX Vector methods. V0(HVX_Vector v)2558 HVX_Vect V0(HVX_Vector v) { return HVX_Vect(HEXAGON_HVX_PUT_V0(data, v)); }; V1(HVX_Vector v)2559 HVX_Vect V1(HVX_Vector v) { return HVX_Vect(HEXAGON_HVX_PUT_V1(data, v)); }; P(HVX_VectorPred p)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