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