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