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 68typedef 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 626class HEXAGON_Vect64C { 627public: 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 800private: 801 long long data; 802}; 803 804#endif /* __cplusplus */ 805 806/* 32 Bit Vectors */ 807 808typedef 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 1079class HEXAGON_Vect32C { 1080public: 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 1174private: 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 1231typedef 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 1295typedef 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 1853class Q6Vect64C { 1854public: 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 2027private: 2028 long long data; 2029}; 2030 2031#endif /* __cplusplus */ 2032 2033/* 32 Bit Vectors */ 2034 2035typedef 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 2306class Q6Vect32C { 2307public: 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 2401private: 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) 2410typedef long Q6VecPred128 __attribute__((__vector_size__(128))) 2411 __attribute__((aligned(128))); 2412 2413typedef long Q6Vect1024 __attribute__((__vector_size__(128))) 2414 __attribute__((aligned(128))); 2415 2416typedef 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) 2421typedef long Q6VecPred64 __attribute__((__vector_size__(64))) 2422 __attribute__((aligned(64))); 2423 2424typedef long Q6Vect512 __attribute__((__vector_size__(64))) 2425 __attribute__((aligned(64))); 2426 2427typedef 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 2436typedef 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 2524class HVX_Vect { 2525public: 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 2562private: 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 2583typedef 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 2598typedef 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