1/* Cell SPU 2 VMX intrinsics header 2 Copyright (C) 2007-2020 Free Software Foundation, Inc. 3 4 This file is free software; you can redistribute it and/or modify it under 5 the terms of the GNU General Public License as published by the Free 6 Software Foundation; either version 3 of the License, or (at your option) 7 any later version. 8 9 This file is distributed in the hope that it will be useful, but WITHOUT 10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 for more details. 13 14 Under Section 7 of GPL version 3, you are granted additional 15 permissions described in the GCC Runtime Library Exception, version 16 3.1, as published by the Free Software Foundation. 17 18 You should have received a copy of the GNU General Public License and 19 a copy of the GCC Runtime Library Exception along with this program; 20 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 21 <http://www.gnu.org/licenses/>. */ 22 23#ifndef _SPU2VMX_H_ 24#define _SPU2VMX_H_ 1 25 26#ifdef __cplusplus 27 28#ifndef __SPU__ 29 30#include <si2vmx.h> 31 32/* spu_absd (absolute difference) 33 * ======== 34 */ 35static __inline vec_uchar16 spu_absd(vec_uchar16 a, vec_uchar16 b) 36{ 37 return ((vec_uchar16)(si_absdb((qword)(a), (qword)(b)))); 38 39} 40 41 42/* spu_add 43 * ======= 44 */ 45static __inline vec_uint4 spu_add(vec_uint4 a, vec_uint4 b) 46{ 47 return ((vec_uint4)(si_a((qword)(a), (qword)(b)))); 48} 49 50static __inline vec_int4 spu_add(vec_int4 a, vec_int4 b) 51{ 52 return ((vec_int4)(si_a((qword)(a), (qword)(b)))); 53} 54 55static __inline vec_ushort8 spu_add(vec_ushort8 a, vec_ushort8 b) 56{ 57 return ((vec_ushort8)(si_ah((qword)(a), (qword)(b)))); 58} 59 60static __inline vec_short8 spu_add(vec_short8 a, vec_short8 b) 61{ 62 return ((vec_short8)(si_ah((qword)(a), (qword)(b)))); 63} 64 65static __inline vec_uint4 spu_add(vec_uint4 a, unsigned int b) 66{ 67 return ((vec_uint4)(si_ai((qword)(a), (int)(b)))); 68} 69 70static __inline vec_int4 spu_add(vec_int4 a, int b) 71{ 72 return ((vec_int4)(si_ai((qword)(a), b))); 73} 74 75static __inline vec_ushort8 spu_add(vec_ushort8 a, unsigned short b) 76{ 77 return ((vec_ushort8)(si_ahi((qword)(a), (short)(b)))); 78} 79 80static __inline vec_short8 spu_add(vec_short8 a, short b) 81{ 82 return ((vec_short8)(si_ahi((qword)(a), b))); 83} 84 85static __inline vec_float4 spu_add(vec_float4 a, vec_float4 b) 86{ 87 return ((vec_float4)(si_fa((qword)(a), (qword)(b)))); 88} 89 90static __inline vec_double2 spu_add(vec_double2 a, vec_double2 b) 91{ 92 return ((vec_double2)(si_dfa((qword)(a), (qword)(b)))); 93} 94 95 96/* spu_addx 97 * ======== 98 */ 99static __inline vec_uint4 spu_addx(vec_uint4 a, vec_uint4 b, vec_uint4 c) 100{ 101 return ((vec_uint4)(si_addx((qword)(a), (qword)(b), (qword)(c)))); 102} 103 104static __inline vec_int4 spu_addx(vec_int4 a, vec_int4 b, vec_int4 c) 105{ 106 return ((vec_int4)(si_addx((qword)(a), (qword)(b), (qword)(c)))); 107} 108 109 110/* spu_and 111 * ======= 112 */ 113static __inline vec_uchar16 spu_and(vec_uchar16 a, vec_uchar16 b) 114{ 115 return ((vec_uchar16)(si_and((qword)(a), (qword)(b)))); 116} 117 118static __inline vec_char16 spu_and(vec_char16 a, vec_char16 b) 119{ 120 return ((vec_char16)(si_and((qword)(a), (qword)(b)))); 121} 122 123static __inline vec_ushort8 spu_and(vec_ushort8 a, vec_ushort8 b) 124{ 125 return ((vec_ushort8)(si_and((qword)(a), (qword)(b)))); 126} 127 128static __inline vec_short8 spu_and(vec_short8 a, vec_short8 b) 129{ 130 return ((vec_short8)(si_and((qword)(a), (qword)(b)))); 131} 132 133static __inline vec_uint4 spu_and(vec_uint4 a, vec_uint4 b) 134{ 135 return ((vec_uint4)(si_and((qword)(a), (qword)(b)))); 136} 137 138static __inline vec_int4 spu_and(vec_int4 a, vec_int4 b) 139{ 140 return ((vec_int4)(si_and((qword)(a), (qword)(b)))); 141} 142 143static __inline vec_float4 spu_and(vec_float4 a, vec_float4 b) 144{ 145 return ((vec_float4)(si_and((qword)(a), (qword)(b)))); 146} 147 148static __inline vec_ullong2 spu_and(vec_ullong2 a, vec_ullong2 b) 149{ 150 return ((vec_ullong2)(si_and((qword)(a), (qword)(b)))); 151} 152 153static __inline vec_llong2 spu_and(vec_llong2 a, vec_llong2 b) 154{ 155 return ((vec_llong2)(si_and((qword)(a), (qword)(b)))); 156} 157 158static __inline vec_double2 spu_and(vec_double2 a, vec_double2 b) 159{ 160 return ((vec_double2)(si_and((qword)(a), (qword)(b)))); 161} 162 163static __inline vec_uchar16 spu_and(vec_uchar16 a, unsigned char b) 164{ 165 return ((vec_uchar16)(si_andbi((qword)(a), (signed char)(b)))); 166} 167 168 169static __inline vec_char16 spu_and(vec_char16 a, signed char b) 170{ 171 return ((vec_char16)(si_andbi((qword)(a), b))); 172} 173 174static __inline vec_ushort8 spu_and(vec_ushort8 a, unsigned short b) 175{ 176 return ((vec_ushort8)(si_andhi((qword)(a), (signed short)(b)))); 177} 178 179static __inline vec_short8 spu_and(vec_short8 a, signed short b) 180{ 181 return ((vec_short8)(si_andhi((qword)(a), b))); 182} 183 184static __inline vec_uint4 spu_and(vec_uint4 a, unsigned int b) 185{ 186 return ((vec_uint4)(si_andi((qword)(a), (signed int)(b)))); 187} 188 189static __inline vec_int4 spu_and(vec_int4 a, signed int b) 190{ 191 return ((vec_int4)(si_andi((qword)(a), b))); 192} 193 194 195/* spu_andc 196 * ======== 197 */ 198#define spu_andc(_a, _b) vec_andc(_a, _b) 199 200 201/* spu_avg 202 * ======= 203 */ 204#define spu_avg(_a, _b) vec_avg(_a, _b) 205 206 207/* spu_bisled 208 * spu_bisled_d 209 * spu_bisled_e 210 * ============ 211 */ 212#define spu_bisled(_func) /* not mappable */ 213#define spu_bisled_d(_func) /* not mappable */ 214#define spu_bisled_e(_func) /* not mappable */ 215 216/* spu_cmpabseq 217 * ============ 218 */ 219static __inline vec_uint4 spu_cmpabseq(vec_float4 a, vec_float4 b) 220{ 221 return ((vec_uint4)(si_fcmeq((qword)(a), (qword)(b)))); 222 223} 224 225static __inline vec_ullong2 spu_cmpabseq(vec_double2 a, vec_double2 b) 226{ 227 return ((vec_ullong2)(si_dfcmeq((qword)(a), (qword)(b)))); 228} 229 230 231/* spu_cmpabsgt 232 * ============ 233 */ 234static __inline vec_uint4 spu_cmpabsgt(vec_float4 a, vec_float4 b) 235{ 236 return ((vec_uint4)(si_fcmgt((qword)(a), (qword)(b)))); 237} 238 239static __inline vec_ullong2 spu_cmpabsgt(vec_double2 a, vec_double2 b) 240{ 241 return ((vec_ullong2)(si_dfcmgt((qword)(a), (qword)(b)))); 242} 243 244 245/* spu_cmpeq 246 * ======== 247 */ 248static __inline vec_uchar16 spu_cmpeq(vec_uchar16 a, vec_uchar16 b) 249{ 250 return ((vec_uchar16)(si_ceqb((qword)(a), (qword)(b)))); 251} 252 253static __inline vec_uchar16 spu_cmpeq(vec_char16 a, vec_char16 b) 254{ 255 return ((vec_uchar16)(si_ceqb((qword)(a), (qword)(b)))); 256} 257 258static __inline vec_ushort8 spu_cmpeq(vec_ushort8 a, vec_ushort8 b) 259{ 260 return ((vec_ushort8)(si_ceqh((qword)(a), (qword)(b)))); 261} 262 263static __inline vec_ushort8 spu_cmpeq(vec_short8 a, vec_short8 b) 264{ 265 return ((vec_ushort8)(si_ceqh((qword)(a), (qword)(b)))); 266} 267 268static __inline vec_uint4 spu_cmpeq(vec_uint4 a, vec_uint4 b) 269{ 270 return ((vec_uint4)(si_ceq((qword)(a), (qword)(b)))); 271} 272 273static __inline vec_uint4 spu_cmpeq(vec_int4 a, vec_int4 b) 274{ 275 return ((vec_uint4)(si_ceq((qword)(a), (qword)(b)))); 276} 277 278static __inline vec_uint4 spu_cmpeq(vec_float4 a, vec_float4 b) 279{ 280 return ((vec_uint4)(si_fceq((qword)(a), (qword)(b)))); 281} 282 283static __inline vec_uchar16 spu_cmpeq(vec_uchar16 a, unsigned char b) 284{ 285 return ((vec_uchar16)(si_ceqbi((qword)(a), (signed char)(b)))); 286} 287 288static __inline vec_uchar16 spu_cmpeq(vec_char16 a, signed char b) 289{ 290 return ((vec_uchar16)(si_ceqbi((qword)(a), b))); 291} 292 293static __inline vec_ushort8 spu_cmpeq(vec_ushort8 a, unsigned short b) 294{ 295 return ((vec_ushort8)(si_ceqhi((qword)(a), (signed short)(b)))); 296} 297 298static __inline vec_ushort8 spu_cmpeq(vec_short8 a, signed short b) 299{ 300 return ((vec_ushort8)(si_ceqhi((qword)(a), b))); 301} 302 303static __inline vec_uint4 spu_cmpeq(vec_uint4 a, unsigned int b) 304{ 305 return ((vec_uint4)(si_ceqi((qword)(a), (signed int)(b)))); 306} 307 308static __inline vec_uint4 spu_cmpeq(vec_int4 a, signed int b) 309{ 310 return ((vec_uint4)(si_ceqi((qword)(a), b))); 311} 312 313static __inline vec_ullong2 spu_cmpeq(vec_double2 a, vec_double2 b) 314{ 315 return ((vec_ullong2)(si_dfceq((qword)(a), (qword)(b)))); 316} 317 318 319/* spu_cmpgt 320 * ======== 321 */ 322static __inline vec_uchar16 spu_cmpgt(vec_uchar16 a, vec_uchar16 b) 323{ 324 return ((vec_uchar16)(si_clgtb((qword)(a), (qword)(b)))); 325} 326 327static __inline vec_uchar16 spu_cmpgt(vec_char16 a, vec_char16 b) 328{ 329 return ((vec_uchar16)(si_cgtb((qword)(a), (qword)(b)))); 330} 331 332static __inline vec_ushort8 spu_cmpgt(vec_ushort8 a, vec_ushort8 b) 333{ 334 return ((vec_ushort8)(si_clgth((qword)(a), (qword)(b)))); 335} 336 337static __inline vec_ushort8 spu_cmpgt(vec_short8 a, vec_short8 b) 338{ 339 return ((vec_ushort8)(si_cgth((qword)(a), (qword)(b)))); 340} 341 342static __inline vec_uint4 spu_cmpgt(vec_uint4 a, vec_uint4 b) 343{ 344 return ((vec_uint4)(si_clgt((qword)(a), (qword)(b)))); 345} 346 347static __inline vec_uint4 spu_cmpgt(vec_int4 a, vec_int4 b) 348{ 349 return ((vec_uint4)(si_cgt((qword)(a), (qword)(b)))); 350} 351 352static __inline vec_uint4 spu_cmpgt(vec_float4 a, vec_float4 b) 353{ 354 return ((vec_uint4)(si_fcgt((qword)(a), (qword)(b)))); 355} 356 357static __inline vec_uchar16 spu_cmpgt(vec_uchar16 a, unsigned char b) 358{ 359 return ((vec_uchar16)(si_clgtbi((qword)(a), b))); 360} 361 362static __inline vec_uchar16 spu_cmpgt(vec_char16 a, signed char b) 363{ 364 return ((vec_uchar16)(si_cgtbi((qword)(a), b))); 365} 366 367static __inline vec_ushort8 spu_cmpgt(vec_ushort8 a, unsigned short b) 368{ 369 return ((vec_ushort8)(si_clgthi((qword)(a), b))); 370} 371 372static __inline vec_ushort8 spu_cmpgt(vec_short8 a, signed short b) 373{ 374 return ((vec_ushort8)(si_cgthi((qword)(a), b))); 375} 376 377static __inline vec_uint4 spu_cmpgt(vec_uint4 a, unsigned int b) 378{ 379 return ((vec_uint4)(si_clgti((qword)(a), b))); 380} 381 382static __inline vec_uint4 spu_cmpgt(vec_int4 a, signed int b) 383{ 384 return ((vec_uint4)(si_cgti((qword)(a), b))); 385} 386 387static __inline vec_ullong2 spu_cmpgt(vec_double2 a, vec_double2 b) 388{ 389 return ((vec_ullong2)(si_dfcgt((qword)(a), (qword)(b)))); 390} 391 392 393/* spu_cntb 394 * ======== 395 */ 396static __inline vec_uchar16 spu_cntb(vec_uchar16 a) 397{ 398 return ((vec_uchar16)(si_cntb((qword)(a)))); 399} 400 401 402static __inline vec_uchar16 spu_cntb(vec_char16 a) 403{ 404 return ((vec_uchar16)(si_cntb((qword)(a)))); 405} 406 407/* spu_cntlz 408 * ========= 409 */ 410static __inline vec_uint4 spu_cntlz(vec_uint4 a) 411{ 412 return ((vec_uint4)(si_clz((qword)(a)))); 413} 414 415static __inline vec_uint4 spu_cntlz(vec_int4 a) 416{ 417 return ((vec_uint4)(si_clz((qword)(a)))); 418} 419 420static __inline vec_uint4 spu_cntlz(vec_float4 a) 421{ 422 return ((vec_uint4)(si_clz((qword)(a)))); 423} 424 425/* spu_testsv 426 * ========== 427 */ 428static __inline vec_ullong2 spu_testsv(vec_double2 a, char b) 429{ 430 return ((vec_ullong2)(si_dftsv((qword)(a), b))); 431} 432 433/* spu_convtf 434 * ========== 435 */ 436#define spu_convtf(_a, _b) (vec_ctf(_a, _b)) 437 438/* spu_convts 439 * ========== 440 */ 441#define spu_convts(_a, _b) (vec_cts(_a, _b)) 442 443/* spu_convtu 444 * ========== 445 */ 446#define spu_convtu(_a, _b) (vec_ctu(_a, _b)) 447 448 449/* spu_dsync 450 * ======== 451 */ 452#define spu_dsync() 453 454/* spu_eqv 455 * ======= 456 */ 457static __inline vec_uchar16 spu_eqv(vec_uchar16 a, vec_uchar16 b) 458{ 459 return ((vec_uchar16)(si_eqv((qword)(a), (qword)(b)))); 460} 461 462static __inline vec_char16 spu_eqv(vec_char16 a, vec_char16 b) 463{ 464 return ((vec_char16)(si_eqv((qword)(a), (qword)(b)))); 465} 466 467static __inline vec_ushort8 spu_eqv(vec_ushort8 a, vec_ushort8 b) 468{ 469 return ((vec_ushort8)(si_eqv((qword)(a), (qword)(b)))); 470} 471 472static __inline vec_short8 spu_eqv(vec_short8 a, vec_short8 b) 473{ 474 return ((vec_short8)(si_eqv((qword)(a), (qword)(b)))); 475} 476 477static __inline vec_uint4 spu_eqv(vec_uint4 a, vec_uint4 b) 478{ 479 return ((vec_uint4)(si_eqv((qword)(a), (qword)(b)))); 480} 481 482static __inline vec_int4 spu_eqv(vec_int4 a, vec_int4 b) 483{ 484 return ((vec_int4)(si_eqv((qword)(a), (qword)(b)))); 485} 486 487static __inline vec_float4 spu_eqv(vec_float4 a, vec_float4 b) 488{ 489 return ((vec_float4)(si_eqv((qword)(a), (qword)(b)))); 490} 491 492static __inline vec_ullong2 spu_eqv(vec_ullong2 a, vec_ullong2 b) 493{ 494 return ((vec_ullong2)(si_eqv((qword)(a), (qword)(b)))); 495} 496 497static __inline vec_llong2 spu_eqv(vec_llong2 a, vec_llong2 b) 498{ 499 return ((vec_llong2)(si_eqv((qword)(a), (qword)(b)))); 500} 501 502static __inline vec_double2 spu_eqv(vec_double2 a, vec_double2 b) 503{ 504 return ((vec_double2)(si_eqv((qword)(a), (qword)(b)))); 505} 506 507/* spu_extend 508 * ======== 509 */ 510static __inline vec_short8 spu_extend(vec_char16 a) 511{ 512 return ((vec_short8)(si_xsbh((qword)(a)))); 513} 514 515 516static __inline vec_int4 spu_extend(vec_short8 a) 517{ 518 return ((vec_int4)(si_xshw((qword)(a)))); 519} 520 521static __inline vec_llong2 spu_extend(vec_int4 a) 522{ 523 return ((vec_llong2)(si_xswd((qword)(a)))); 524} 525 526 527static __inline vec_double2 spu_extend(vec_float4 a) 528{ 529 return ((vec_double2)(si_fesd((qword)(a)))); 530} 531 532 533/* spu_extract 534 * ======== 535 */ 536static __inline unsigned char spu_extract(vec_uchar16 a, int element) 537{ 538 union { 539 vec_uchar16 v; 540 unsigned char c[16]; 541 } in; 542 543 in.v = a; 544 return (in.c[element & 15]); 545} 546 547static __inline signed char spu_extract(vec_char16 a, int element) 548{ 549 union { 550 vec_char16 v; 551 signed char c[16]; 552 } in; 553 554 in.v = a; 555 return (in.c[element & 15]); 556} 557 558static __inline unsigned short spu_extract(vec_ushort8 a, int element) 559{ 560 union { 561 vec_ushort8 v; 562 unsigned short s[8]; 563 } in; 564 565 in.v = a; 566 return (in.s[element & 7]); 567} 568 569static __inline signed short spu_extract(vec_short8 a, int element) 570{ 571 union { 572 vec_short8 v; 573 signed short s[8]; 574 } in; 575 576 in.v = a; 577 return (in.s[element & 7]); 578} 579 580static __inline unsigned int spu_extract(vec_uint4 a, int element) 581{ 582 union { 583 vec_uint4 v; 584 unsigned int i[4]; 585 } in; 586 587 in.v = a; 588 return (in.i[element & 3]); 589} 590 591static __inline signed int spu_extract(vec_int4 a, int element) 592{ 593 union { 594 vec_int4 v; 595 signed int i[4]; 596 } in; 597 598 in.v = a; 599 return (in.i[element & 3]); 600} 601 602static __inline float spu_extract(vec_float4 a, int element) 603{ 604 union { 605 vec_float4 v; 606 float f[4]; 607 } in; 608 609 in.v = a; 610 return (in.f[element & 3]); 611} 612 613static __inline unsigned long long spu_extract(vec_ullong2 a, int element) 614{ 615 union { 616 vec_ullong2 v; 617 unsigned long long l[2]; 618 } in; 619 620 in.v = a; 621 return (in.l[element & 1]); 622} 623 624static __inline signed long long spu_extract(vec_llong2 a, int element) 625{ 626 union { 627 vec_llong2 v; 628 signed long long l[2]; 629 } in; 630 631 in.v = a; 632 return (in.l[element & 1]); 633} 634 635static __inline double spu_extract(vec_double2 a, int element) 636{ 637 union { 638 vec_double2 v; 639 double d[2]; 640 } in; 641 642 in.v = a; 643 return (in.d[element & 1]); 644} 645 646/* spu_gather 647 * ======== 648 */ 649static __inline vec_uint4 spu_gather(vec_uchar16 a) 650{ 651 return ((vec_uint4)(si_gbb((qword)(a)))); 652} 653 654 655static __inline vec_uint4 spu_gather(vec_char16 a) 656{ 657 return ((vec_uint4)(si_gbb((qword)(a)))); 658} 659 660static __inline vec_uint4 spu_gather(vec_ushort8 a) 661{ 662 return ((vec_uint4)(si_gbh((qword)(a)))); 663} 664 665static __inline vec_uint4 spu_gather(vec_short8 a) 666{ 667 return ((vec_uint4)(si_gbh((qword)(a)))); 668} 669 670 671static __inline vec_uint4 spu_gather(vec_uint4 a) 672{ 673 return ((vec_uint4)(si_gb((qword)(a)))); 674} 675 676static __inline vec_uint4 spu_gather(vec_int4 a) 677{ 678 return ((vec_uint4)(si_gb((qword)(a)))); 679} 680 681static __inline vec_uint4 spu_gather(vec_float4 a) 682{ 683 return ((vec_uint4)(si_gb((qword)(a)))); 684} 685 686/* spu_genb 687 * ======== 688 */ 689static __inline vec_uint4 spu_genb(vec_uint4 a, vec_uint4 b) 690{ 691 return ((vec_uint4)(si_bg((qword)(b), (qword)(a)))); 692} 693 694static __inline vec_int4 spu_genb(vec_int4 a, vec_int4 b) 695{ 696 return ((vec_int4)(si_bg((qword)(b), (qword)(a)))); 697} 698 699/* spu_genbx 700 * ========= 701 */ 702static __inline vec_uint4 spu_genbx(vec_uint4 a, vec_uint4 b, vec_uint4 c) 703{ 704 return ((vec_uint4)(si_bgx((qword)(b), (qword)(a), (qword)(c)))); 705} 706 707static __inline vec_int4 spu_genbx(vec_int4 a, vec_int4 b, vec_int4 c) 708{ 709 return ((vec_int4)(si_bgx((qword)(b), (qword)(a), (qword)(c)))); 710} 711 712 713/* spu_genc 714 * ======== 715 */ 716static __inline vec_uint4 spu_genc(vec_uint4 a, vec_uint4 b) 717{ 718 return ((vec_uint4)(si_cg((qword)(a), (qword)(b)))); 719} 720 721static __inline vec_int4 spu_genc(vec_int4 a, vec_int4 b) 722{ 723 return ((vec_int4)(si_cg((qword)(a), (qword)(b)))); 724} 725 726/* spu_gencx 727 * ========= 728 */ 729static __inline vec_uint4 spu_gencx(vec_uint4 a, vec_uint4 b, vec_uint4 c) 730{ 731 return ((vec_uint4)(si_cgx((qword)(a), (qword)(b), (qword)(c)))); 732} 733 734static __inline vec_int4 spu_gencx(vec_int4 a, vec_int4 b, vec_int4 c) 735{ 736 return ((vec_int4)(si_cgx((qword)(a), (qword)(b), (qword)(c)))); 737} 738 739 740/* spu_hcmpeq 741 * ======== 742 */ 743#define spu_hcmpeq(_a, _b) if (_a == _b) { SPU_HALT_ACTION; }; 744 745 746/* spu_hcmpgt 747 * ======== 748 */ 749#define spu_hcmpgt(_a, _b) if (_a > _b) { SPU_HALT_ACTION; }; 750 751 752/* spu_idisable 753 * ============ 754 */ 755#define spu_idisable() SPU_UNSUPPORTED_ACTION 756 757 758/* spu_ienable 759 * =========== 760 */ 761#define spu_ienable() SPU_UNSUPPORTED_ACTION 762 763 764/* spu_insert 765 * ======== 766 */ 767static __inline vec_uchar16 spu_insert(unsigned char a, vec_uchar16 b, int element) 768{ 769 union { 770 vec_uchar16 v; 771 unsigned char c[16]; 772 } in; 773 774 in.v = b; 775 in.c[element & 15] = a; 776 return (in.v); 777} 778 779static __inline vec_char16 spu_insert(signed char a, vec_char16 b, int element) 780{ 781 return ((vec_char16)spu_insert((unsigned char)(a), (vec_uchar16)(b), element)); 782} 783 784static __inline vec_ushort8 spu_insert(unsigned short a, vec_ushort8 b, int element) 785{ 786 union { 787 vec_ushort8 v; 788 unsigned short s[8]; 789 } in; 790 791 in.v = b; 792 in.s[element & 7] = a; 793 return (in.v); 794} 795 796static __inline vec_short8 spu_insert(signed short a, vec_short8 b, int element) 797{ 798 return ((vec_short8)spu_insert((unsigned short)(a), (vec_ushort8)(b), element)); 799} 800 801static __inline vec_uint4 spu_insert(unsigned int a, vec_uint4 b, int element) 802{ 803 union { 804 vec_uint4 v; 805 unsigned int i[4]; 806 } in; 807 808 in.v = b; 809 in.i[element & 3] = a; 810 return (in.v); 811} 812 813static __inline vec_int4 spu_insert(signed int a, vec_int4 b, int element) 814{ 815 return ((vec_int4)spu_insert((unsigned int)(a), (vec_uint4)(b), element)); 816} 817 818static __inline vec_float4 spu_insert(float a, vec_float4 b, int element) 819{ 820 union { 821 vec_float4 v; 822 float f[4]; 823 } in; 824 825 in.v = b; 826 in.f[element & 3] = a; 827 return (in.v); 828} 829 830static __inline vec_ullong2 spu_insert(unsigned long long a, vec_ullong2 b, int element) 831{ 832 union { 833 vec_ullong2 v; 834 unsigned long long l[2]; 835 } in; 836 837 in.v = b; 838 in.l[element & 1] = a; 839 return (in.v); 840} 841 842static __inline vec_llong2 spu_insert(signed long long a, vec_llong2 b, int element) 843{ 844 return ((vec_llong2)spu_insert((unsigned long long)(a), (vec_ullong2)(b), element)); 845} 846 847static __inline vec_double2 spu_insert(double a, vec_double2 b, int element) 848{ 849 union { 850 vec_double2 v; 851 double d[2]; 852 } in; 853 854 in.v = b; 855 in.d[element & 1] = a; 856 return (in.v); 857} 858 859 860/* spu_madd 861 * ======== 862 */ 863static __inline vec_int4 spu_madd(vec_short8 a, vec_short8 b, vec_int4 c) 864{ 865 return ((vec_int4)(si_mpya((qword)(a), (qword)(b), (qword)(c)))); 866} 867 868static __inline vec_float4 spu_madd(vec_float4 a, vec_float4 b, vec_float4 c) 869{ 870 return ((vec_float4)(si_fma((qword)(a), (qword)(b), (qword)(c)))); 871} 872 873static __inline vec_double2 spu_madd(vec_double2 a, vec_double2 b, vec_double2 c) 874{ 875 return ((vec_double2)(si_dfma((qword)(a), (qword)(b), (qword)(c)))); 876} 877 878 879/* spu_maskb 880 * ======== 881 */ 882#define spu_maskb(_a) (vec_uchar16)(si_fsmb(si_from_int((int)(_a)))) 883 884/* spu_maskh 885 * ======== 886 */ 887#define spu_maskh(_a) (vec_ushort8)(si_fsmh(si_from_int((int)(_a)))) 888 889 890/* spu_maskw 891 * ======== 892 */ 893#define spu_maskw(_a) (vec_uint4)(si_fsm(si_from_int((int)(_a)))) 894 895 896/* spu_mfcdma32 897 * ======== 898 */ 899#define spu_mfcdma32(_ls, _ea, _size, _tagid, _cmd) 900 901 902/* spu_mfcdma64 903 * ======== 904 */ 905#define spu_mfcdma64(_ls, _eahi, _ealow, _size, _tagid, _cmd) 906 907/* spu_mfcstat 908 * ======== 909 */ 910#define spu_mfcstat(_type) 0xFFFFFFFF 911 912 913 914/* spu_mffpscr 915 * =========== 916 */ 917#define spu_mffpscr() (vec_uint4)(si_fscrrd()) 918 919 920/* spu_mfspr 921 * ======== 922 */ 923 924#define spu_mfspr(_reg) si_to_uint(si_mfspr(_reg)) 925 926 927 928/* spu_mhhadd 929 * ========== 930 */ 931static __inline vec_int4 spu_mhhadd(vec_short8 a, vec_short8 b, vec_int4 c) 932{ 933 return ((vec_int4)(si_mpyhha((qword)(a), (qword)(b), (qword)(c)))); 934} 935 936 937static __inline vec_uint4 spu_mhhadd(vec_ushort8 a, vec_ushort8 b, vec_uint4 c) 938{ 939 return ((vec_uint4)(si_mpyhhau((qword)(a), (qword)(b), (qword)(c)))); 940} 941 942 943/* spu_msub 944 * ======== 945 */ 946static __inline vec_float4 spu_msub(vec_float4 a, vec_float4 b, vec_float4 c) 947{ 948 return ((vec_float4)(si_fms((qword)(a), (qword)(b), (qword)(c)))); 949} 950 951static __inline vec_double2 spu_msub(vec_double2 a, vec_double2 b, vec_double2 c) 952{ 953 return ((vec_double2)(si_dfms((qword)(a), (qword)(b), (qword)(c)))); 954} 955 956 957/* spu_mtfpscr 958 * =========== 959 */ 960#define spu_mtfpscr(_a) 961 962 963/* spu_mtspr 964 * ======== 965 */ 966#define spu_mtspr(_reg, _a) 967 968 969/* spu_mul 970 * ======== 971 */ 972static __inline vec_float4 spu_mul(vec_float4 a, vec_float4 b) 973{ 974 return ((vec_float4)(si_fm((qword)(a), (qword)(b)))); 975} 976 977static __inline vec_double2 spu_mul(vec_double2 a, vec_double2 b) 978{ 979 return ((vec_double2)(si_dfm((qword)(a), (qword)(b)))); 980} 981 982 983/* spu_mulh 984 * ======== 985 */ 986static __inline vec_int4 spu_mulh(vec_short8 a, vec_short8 b) 987{ 988 return ((vec_int4)(si_mpyh((qword)(a), (qword)(b)))); 989} 990 991/* spu_mule 992 * ========= 993 */ 994#define spu_mule(_a, _b) vec_mule(_a, _b) 995 996 997 998/* spu_mulo 999 * ======== 1000 */ 1001static __inline vec_int4 spu_mulo(vec_short8 a, vec_short8 b) 1002{ 1003 return ((vec_int4)(si_mpy((qword)(a), (qword)(b)))); 1004} 1005 1006 1007static __inline vec_uint4 spu_mulo(vec_ushort8 a, vec_ushort8 b) 1008{ 1009 return ((vec_uint4)(si_mpyu((qword)(a), (qword)(b)))); 1010} 1011 1012 1013static __inline vec_int4 spu_mulo(vec_short8 a, short b) 1014{ 1015 return ((vec_int4)(si_mpyi((qword)(a), b))); 1016} 1017 1018static __inline vec_uint4 spu_mulo(vec_ushort8 a, unsigned short b) 1019{ 1020 return ((vec_uint4)(si_mpyui((qword)(a), b))); 1021} 1022 1023 1024/* spu_mulsr 1025 * ========= 1026 */ 1027static __inline vec_int4 spu_mulsr(vec_short8 a, vec_short8 b) 1028{ 1029 return ((vec_int4)(si_mpys((qword)(a), (qword)(b)))); 1030} 1031 1032 1033/* spu_nand 1034 * ======== 1035 */ 1036static __inline vec_uchar16 spu_nand(vec_uchar16 a, vec_uchar16 b) 1037{ 1038 return ((vec_uchar16)(si_nand((qword)(a), (qword)(b)))); 1039} 1040 1041static __inline vec_char16 spu_nand(vec_char16 a, vec_char16 b) 1042{ 1043 return ((vec_char16)(si_nand((qword)(a), (qword)(b)))); 1044} 1045 1046static __inline vec_ushort8 spu_nand(vec_ushort8 a, vec_ushort8 b) 1047{ 1048 return ((vec_ushort8)(si_nand((qword)(a), (qword)(b)))); 1049} 1050 1051static __inline vec_short8 spu_nand(vec_short8 a, vec_short8 b) 1052{ 1053 return ((vec_short8)(si_nand((qword)(a), (qword)(b)))); 1054} 1055 1056static __inline vec_uint4 spu_nand(vec_uint4 a, vec_uint4 b) 1057{ 1058 return ((vec_uint4)(si_nand((qword)(a), (qword)(b)))); 1059} 1060 1061static __inline vec_int4 spu_nand(vec_int4 a, vec_int4 b) 1062{ 1063 return ((vec_int4)(si_nand((qword)(a), (qword)(b)))); 1064} 1065 1066static __inline vec_float4 spu_nand(vec_float4 a, vec_float4 b) 1067{ 1068 return ((vec_float4)(si_nand((qword)(a), (qword)(b)))); 1069} 1070 1071static __inline vec_ullong2 spu_nand(vec_ullong2 a, vec_ullong2 b) 1072{ 1073 return ((vec_ullong2)(si_nand((qword)(a), (qword)(b)))); 1074} 1075 1076static __inline vec_llong2 spu_nand(vec_llong2 a, vec_llong2 b) 1077{ 1078 return ((vec_llong2)(si_nand((qword)(a), (qword)(b)))); 1079} 1080 1081static __inline vec_double2 spu_nand(vec_double2 a, vec_double2 b) 1082{ 1083 return ((vec_double2)(si_nand((qword)(a), (qword)(b)))); 1084} 1085 1086 1087/* spu_nmadd 1088 * ========= 1089 */ 1090static __inline vec_double2 spu_nmadd(vec_double2 a, vec_double2 b, vec_double2 c) 1091{ 1092 return ((vec_double2)(si_dfnma((qword)(a), (qword)(b), (qword)(c)))); 1093} 1094 1095 1096/* spu_nmsub 1097 * ========= 1098 */ 1099static __inline vec_float4 spu_nmsub(vec_float4 a, vec_float4 b, vec_float4 c) 1100{ 1101 return ((vec_float4)(si_fnms((qword)(a), (qword)(b), (qword)(c)))); 1102} 1103 1104static __inline vec_double2 spu_nmsub(vec_double2 a, vec_double2 b, vec_double2 c) 1105{ 1106 return ((vec_double2)(si_dfnms((qword)(a), (qword)(b), (qword)(c)))); 1107} 1108 1109 1110/* spu_nor 1111 * ======= 1112 */ 1113#define spu_nor(_a, _b) vec_nor(_a, _b) 1114 1115 1116/* spu_or 1117 * ====== 1118 */ 1119static __inline vec_uchar16 spu_or(vec_uchar16 a, vec_uchar16 b) 1120{ 1121 return ((vec_uchar16)(si_or((qword)(a), (qword)(b)))); 1122} 1123 1124static __inline vec_char16 spu_or(vec_char16 a, vec_char16 b) 1125{ 1126 return ((vec_char16)(si_or((qword)(a), (qword)(b)))); 1127} 1128 1129static __inline vec_ushort8 spu_or(vec_ushort8 a, vec_ushort8 b) 1130{ 1131 return ((vec_ushort8)(si_or((qword)(a), (qword)(b)))); 1132} 1133 1134static __inline vec_short8 spu_or(vec_short8 a, vec_short8 b) 1135{ 1136 return ((vec_short8)(si_or((qword)(a), (qword)(b)))); 1137} 1138 1139static __inline vec_uint4 spu_or(vec_uint4 a, vec_uint4 b) 1140{ 1141 return ((vec_uint4)(si_or((qword)(a), (qword)(b)))); 1142} 1143 1144static __inline vec_int4 spu_or(vec_int4 a, vec_int4 b) 1145{ 1146 return ((vec_int4)(si_or((qword)(a), (qword)(b)))); 1147} 1148 1149static __inline vec_float4 spu_or(vec_float4 a, vec_float4 b) 1150{ 1151 return ((vec_float4)(si_or((qword)(a), (qword)(b)))); 1152} 1153 1154static __inline vec_ullong2 spu_or(vec_ullong2 a, vec_ullong2 b) 1155{ 1156 return ((vec_ullong2)(si_or((qword)(a), (qword)(b)))); 1157} 1158 1159static __inline vec_llong2 spu_or(vec_llong2 a, vec_llong2 b) 1160{ 1161 return ((vec_llong2)(si_or((qword)(a), (qword)(b)))); 1162} 1163 1164static __inline vec_double2 spu_or(vec_double2 a, vec_double2 b) 1165{ 1166 return ((vec_double2)(si_or((qword)(a), (qword)(b)))); 1167} 1168 1169 1170static __inline vec_uchar16 spu_or(vec_uchar16 a, unsigned char b) 1171{ 1172 return ((vec_uchar16)(si_orbi((qword)(a), b))); 1173} 1174 1175static __inline vec_char16 spu_or(vec_char16 a, signed char b) 1176{ 1177 return ((vec_char16)(si_orbi((qword)(a), (unsigned char)(b)))); 1178} 1179 1180static __inline vec_ushort8 spu_or(vec_ushort8 a, unsigned short b) 1181{ 1182 return ((vec_ushort8)(si_orhi((qword)(a), b))); 1183} 1184 1185static __inline vec_short8 spu_or(vec_short8 a, signed short b) 1186{ 1187 return ((vec_short8)(si_orhi((qword)(a), (unsigned short)(b)))); 1188} 1189 1190static __inline vec_uint4 spu_or(vec_uint4 a, unsigned int b) 1191{ 1192 return ((vec_uint4)(si_ori((qword)(a), b))); 1193} 1194 1195static __inline vec_int4 spu_or(vec_int4 a, signed int b) 1196{ 1197 return ((vec_int4)(si_ori((qword)(a), (unsigned int)(b)))); 1198} 1199 1200 1201/* spu_orc 1202 * ======= 1203 */ 1204#define spu_orc(_a, _b) vec_or(_a, vec_nor(_b, _b)) 1205 1206 1207/* spu_orx 1208 * ======= 1209 */ 1210static __inline vec_uint4 spu_orx(vec_uint4 a) 1211{ 1212 return ((vec_uint4)(si_orx((qword)(a)))); 1213} 1214 1215static __inline vec_int4 spu_orx(vec_int4 a) 1216{ 1217 return ((vec_int4)(si_orx((qword)(a)))); 1218} 1219 1220 1221/* spu_promote 1222 * =========== 1223 */ 1224static __inline vec_uchar16 spu_promote(unsigned char a, int element) 1225{ 1226 union { 1227 vec_uchar16 v; 1228 unsigned char c[16]; 1229 } in; 1230 1231 in.c[element & 15] = a; 1232 return (in.v); 1233} 1234 1235static __inline vec_char16 spu_promote(signed char a, int element) 1236{ 1237 union { 1238 vec_char16 v; 1239 signed char c[16]; 1240 } in; 1241 1242 in.c[element & 15] = a; 1243 return (in.v); 1244} 1245 1246static __inline vec_ushort8 spu_promote(unsigned short a, int element) 1247{ 1248 union { 1249 vec_ushort8 v; 1250 unsigned short s[8]; 1251 } in; 1252 1253 in.s[element & 7] = a; 1254 return (in.v); 1255} 1256 1257static __inline vec_short8 spu_promote(signed short a, int element) 1258{ 1259 union { 1260 vec_short8 v; 1261 signed short s[8]; 1262 } in; 1263 1264 in.s[element & 7] = a; 1265 return (in.v); 1266} 1267 1268static __inline vec_uint4 spu_promote(unsigned int a, int element) 1269{ 1270 union { 1271 vec_uint4 v; 1272 unsigned int i[4]; 1273 } in; 1274 1275 in.i[element & 3] = a; 1276 return (in.v); 1277} 1278 1279static __inline vec_int4 spu_promote(signed int a, int element) 1280{ 1281 union { 1282 vec_int4 v; 1283 signed int i[4]; 1284 } in; 1285 1286 in.i[element & 3] = a; 1287 return (in.v); 1288} 1289 1290static __inline vec_float4 spu_promote(float a, int element) 1291{ 1292 union { 1293 vec_float4 v; 1294 float f[4]; 1295 } in; 1296 1297 in.f[element & 3] = a; 1298 return (in.v); 1299} 1300 1301static __inline vec_ullong2 spu_promote(unsigned long long a, int element) 1302{ 1303 union { 1304 vec_ullong2 v; 1305 unsigned long long l[2]; 1306 } in; 1307 1308 in.l[element & 1] = a; 1309 return (in.v); 1310} 1311 1312static __inline vec_llong2 spu_promote(signed long long a, int element) 1313{ 1314 union { 1315 vec_llong2 v; 1316 signed long long l[2]; 1317 } in; 1318 1319 in.l[element & 1] = a; 1320 return (in.v); 1321} 1322 1323static __inline vec_double2 spu_promote(double a, int element) 1324{ 1325 union { 1326 vec_double2 v; 1327 double d[2]; 1328 } in; 1329 1330 in.d[element & 1] = a; 1331 return (in.v); 1332} 1333 1334/* spu_re 1335 * ====== 1336 */ 1337#define spu_re(_a) vec_re(_a) 1338 1339 1340/* spu_readch 1341 * ========== 1342 */ 1343#define spu_readch(_channel) 0 /* not mappable */ 1344 1345 1346/* spu_readchcnt 1347 * ============= 1348 */ 1349#define spu_readchcnt(_channel) 0 /* not mappable */ 1350 1351 1352/* spu_readchqw 1353 * ============ 1354 */ 1355#define spu_readchqw(_channel) __extension__ ({ vec_uint4 result = { 0, 0, 0, 0 }; result; }) 1356 1357/* spu_rl 1358 * ====== 1359 */ 1360static __inline vec_ushort8 spu_rl(vec_ushort8 a, vec_short8 b) 1361{ 1362 return ((vec_ushort8)(si_roth((qword)(a), (qword)(b)))); 1363} 1364 1365static __inline vec_short8 spu_rl(vec_short8 a, vec_short8 b) 1366{ 1367 return ((vec_short8)(si_roth((qword)(a), (qword)(b)))); 1368} 1369 1370static __inline vec_uint4 spu_rl(vec_uint4 a, vec_int4 b) 1371{ 1372 return ((vec_uint4)(si_rot((qword)(a), (qword)(b)))); 1373} 1374 1375static __inline vec_int4 spu_rl(vec_int4 a, vec_int4 b) 1376{ 1377 return ((vec_int4)(si_rot((qword)(a), (qword)(b)))); 1378} 1379 1380static __inline vec_ushort8 spu_rl(vec_ushort8 a, int b) 1381{ 1382 return ((vec_ushort8)(si_rothi((qword)(a), b))); 1383} 1384 1385static __inline vec_short8 spu_rl(vec_short8 a, int b) 1386{ 1387 return ((vec_short8)(si_rothi((qword)(a), b))); 1388} 1389 1390static __inline vec_uint4 spu_rl(vec_uint4 a, int b) 1391{ 1392 return ((vec_uint4)(si_roti((qword)(a), b))); 1393} 1394 1395static __inline vec_int4 spu_rl(vec_int4 a, int b) 1396{ 1397 return ((vec_int4)(si_roti((qword)(a), b))); 1398} 1399 1400 1401/* spu_rlmask 1402 * ========== 1403 */ 1404static __inline vec_ushort8 spu_rlmask(vec_ushort8 a, vec_short8 b) 1405{ 1406 return ((vec_ushort8)(si_rothm((qword)(a), (qword)(b)))); 1407} 1408 1409static __inline vec_short8 spu_rlmask(vec_short8 a, vec_short8 b) 1410{ 1411 return ((vec_short8)(si_rothm((qword)(a), (qword)(b)))); 1412} 1413 1414static __inline vec_uint4 spu_rlmask(vec_uint4 a, vec_int4 b) 1415{ 1416 return ((vec_uint4)(si_rotm((qword)(a), (qword)(b)))); 1417} 1418 1419static __inline vec_int4 spu_rlmask(vec_int4 a, vec_int4 b) 1420{ 1421 return ((vec_int4)(si_rotm((qword)(a), (qword)(b)))); 1422} 1423 1424static __inline vec_ushort8 spu_rlmask(vec_ushort8 a, int b) 1425{ 1426 return ((vec_ushort8)(si_rothmi((qword)(a), b))); 1427} 1428 1429static __inline vec_short8 spu_rlmask(vec_short8 a, int b) 1430{ 1431 return ((vec_short8)(si_rothmi((qword)(a), b))); 1432} 1433 1434 1435static __inline vec_uint4 spu_rlmask(vec_uint4 a, int b) 1436{ 1437 return ((vec_uint4)(si_rotmi((qword)(a), b))); 1438} 1439 1440static __inline vec_int4 spu_rlmask(vec_int4 a, int b) 1441{ 1442 return ((vec_int4)(si_rotmi((qword)(a), b))); 1443} 1444 1445/* spu_rlmaska 1446 * =========== 1447 */ 1448static __inline vec_short8 spu_rlmaska(vec_short8 a, vec_short8 b) 1449{ 1450 return ((vec_short8)(si_rotmah((qword)(a), (qword)(b)))); 1451} 1452 1453static __inline vec_ushort8 spu_rlmaska(vec_ushort8 a, vec_short8 b) 1454{ 1455 return ((vec_ushort8)(si_rotmah((qword)(a), (qword)(b)))); 1456} 1457 1458 1459static __inline vec_int4 spu_rlmaska(vec_int4 a, vec_int4 b) 1460{ 1461 return ((vec_int4)(si_rotma((qword)(a), (qword)(b)))); 1462} 1463 1464static __inline vec_uint4 spu_rlmaska(vec_uint4 a, vec_int4 b) 1465{ 1466 return ((vec_uint4)(si_rotma((qword)(a), (qword)(b)))); 1467} 1468 1469static __inline vec_ushort8 spu_rlmaska(vec_ushort8 a, int b) 1470{ 1471 return ((vec_ushort8)(si_rotmahi((qword)(a), b))); 1472} 1473 1474static __inline vec_short8 spu_rlmaska(vec_short8 a, int b) 1475{ 1476 return ((vec_short8)(si_rotmahi((qword)(a), b))); 1477} 1478 1479static __inline vec_uint4 spu_rlmaska(vec_uint4 a, int b) 1480{ 1481 return ((vec_uint4)(si_rotmai((qword)(a), b))); 1482} 1483 1484static __inline vec_int4 spu_rlmaska(vec_int4 a, int b) 1485{ 1486 return ((vec_int4)(si_rotmai((qword)(a), b))); 1487} 1488 1489 1490/* spu_rlmaskqw 1491 * ============ 1492 */ 1493static __inline vec_uchar16 spu_rlmaskqw(vec_uchar16 a, int count) 1494{ 1495 return ((vec_uchar16)(si_rotqmbi((qword)(a), si_from_int(count)))); 1496} 1497 1498static __inline vec_char16 spu_rlmaskqw(vec_char16 a, int count) 1499{ 1500 return ((vec_char16)(si_rotqmbi((qword)(a), si_from_int(count)))); 1501} 1502 1503static __inline vec_ushort8 spu_rlmaskqw(vec_ushort8 a, int count) 1504{ 1505 return ((vec_ushort8)(si_rotqmbi((qword)(a), si_from_int(count)))); 1506} 1507 1508static __inline vec_short8 spu_rlmaskqw(vec_short8 a, int count) 1509{ 1510 return ((vec_short8)(si_rotqmbi((qword)(a), si_from_int(count)))); 1511} 1512 1513static __inline vec_uint4 spu_rlmaskqw(vec_uint4 a, int count) 1514{ 1515 return ((vec_uint4)(si_rotqmbi((qword)(a), si_from_int(count)))); 1516} 1517 1518static __inline vec_int4 spu_rlmaskqw(vec_int4 a, int count) 1519{ 1520 return ((vec_int4)(si_rotqmbi((qword)(a), si_from_int(count)))); 1521} 1522 1523static __inline vec_float4 spu_rlmaskqw(vec_float4 a, int count) 1524{ 1525 return ((vec_float4)(si_rotqmbi((qword)(a), si_from_int(count)))); 1526} 1527 1528static __inline vec_ullong2 spu_rlmaskqw(vec_ullong2 a, int count) 1529{ 1530 return ((vec_ullong2)(si_rotqmbi((qword)(a), si_from_int(count)))); 1531} 1532 1533static __inline vec_llong2 spu_rlmaskqw(vec_llong2 a, int count) 1534{ 1535 return ((vec_llong2)(si_rotqmbi((qword)(a), si_from_int(count)))); 1536} 1537 1538static __inline vec_double2 spu_rlmaskqw(vec_double2 a, int count) 1539{ 1540 return ((vec_double2)(si_rotqmbi((qword)(a), si_from_int(count)))); 1541} 1542 1543/* spu_rlmaskqwbyte 1544 * ================ 1545 */ 1546static __inline vec_uchar16 spu_rlmaskqwbyte(vec_uchar16 a, int count) 1547{ 1548 return ((vec_uchar16)(si_rotqmby((qword)(a), si_from_int(count)))); 1549} 1550 1551static __inline vec_char16 spu_rlmaskqwbyte(vec_char16 a, int count) 1552{ 1553 return ((vec_char16)(si_rotqmby((qword)(a), si_from_int(count)))); 1554} 1555 1556static __inline vec_ushort8 spu_rlmaskqwbyte(vec_ushort8 a, int count) 1557{ 1558 return ((vec_ushort8)(si_rotqmby((qword)(a), si_from_int(count)))); 1559} 1560 1561static __inline vec_short8 spu_rlmaskqwbyte(vec_short8 a, int count) 1562{ 1563 return ((vec_short8)(si_rotqmby((qword)(a), si_from_int(count)))); 1564} 1565 1566static __inline vec_uint4 spu_rlmaskqwbyte(vec_uint4 a, int count) 1567{ 1568 return ((vec_uint4)(si_rotqmby((qword)(a), si_from_int(count)))); 1569} 1570 1571static __inline vec_int4 spu_rlmaskqwbyte(vec_int4 a, int count) 1572{ 1573 return ((vec_int4)(si_rotqmby((qword)(a), si_from_int(count)))); 1574} 1575 1576static __inline vec_float4 spu_rlmaskqwbyte(vec_float4 a, int count) 1577{ 1578 return ((vec_float4)(si_rotqmby((qword)(a), si_from_int(count)))); 1579} 1580 1581static __inline vec_ullong2 spu_rlmaskqwbyte(vec_ullong2 a, int count) 1582{ 1583 return ((vec_ullong2)(si_rotqmby((qword)(a), si_from_int(count)))); 1584} 1585 1586static __inline vec_llong2 spu_rlmaskqwbyte(vec_llong2 a, int count) 1587{ 1588 return ((vec_llong2)(si_rotqmby((qword)(a), si_from_int(count)))); 1589} 1590 1591static __inline vec_double2 spu_rlmaskqwbyte(vec_double2 a, int count) 1592{ 1593 return ((vec_double2)(si_rotqmby((qword)(a), si_from_int(count)))); 1594} 1595 1596/* spu_rlmaskqwbytebc 1597 * ================== 1598 */ 1599static __inline vec_uchar16 spu_rlmaskqwbytebc(vec_uchar16 a, int count) 1600{ 1601 return ((vec_uchar16)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1602} 1603 1604static __inline vec_char16 spu_rlmaskqwbytebc(vec_char16 a, int count) 1605{ 1606 return ((vec_char16)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1607} 1608 1609static __inline vec_ushort8 spu_rlmaskqwbytebc(vec_ushort8 a, int count) 1610{ 1611 return ((vec_ushort8)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1612} 1613 1614static __inline vec_short8 spu_rlmaskqwbytebc(vec_short8 a, int count) 1615{ 1616 return ((vec_short8)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1617} 1618 1619static __inline vec_uint4 spu_rlmaskqwbytebc(vec_uint4 a, int count) 1620{ 1621 return ((vec_uint4)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1622} 1623 1624static __inline vec_int4 spu_rlmaskqwbytebc(vec_int4 a, int count) 1625{ 1626 return ((vec_int4)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1627} 1628 1629static __inline vec_float4 spu_rlmaskqwbytebc(vec_float4 a, int count) 1630{ 1631 return ((vec_float4)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1632} 1633 1634static __inline vec_ullong2 spu_rlmaskqwbytebc(vec_ullong2 a, int count) 1635{ 1636 return ((vec_ullong2)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1637} 1638 1639static __inline vec_llong2 spu_rlmaskqwbytebc(vec_llong2 a, int count) 1640{ 1641 return ((vec_llong2)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1642} 1643 1644static __inline vec_double2 spu_rlmaskqwbytebc(vec_double2 a, int count) 1645{ 1646 return ((vec_double2)(si_rotqmbybi((qword)(a), si_from_int(count)))); 1647} 1648 1649 1650/* spu_rlqwbyte 1651 * ============ 1652 */ 1653static __inline vec_uchar16 spu_rlqwbyte(vec_uchar16 a, int count) 1654{ 1655 return ((vec_uchar16)(si_rotqby((qword)(a), si_from_int(count)))); 1656} 1657 1658static __inline vec_char16 spu_rlqwbyte(vec_char16 a, int count) 1659{ 1660 return ((vec_char16)(si_rotqby((qword)(a), si_from_int(count)))); 1661} 1662 1663static __inline vec_ushort8 spu_rlqwbyte(vec_ushort8 a, int count) 1664{ 1665 return ((vec_ushort8)(si_rotqby((qword)(a), si_from_int(count)))); 1666} 1667 1668static __inline vec_short8 spu_rlqwbyte(vec_short8 a, int count) 1669{ 1670 return ((vec_short8)(si_rotqby((qword)(a), si_from_int(count)))); 1671} 1672 1673static __inline vec_uint4 spu_rlqwbyte(vec_uint4 a, int count) 1674{ 1675 return ((vec_uint4)(si_rotqby((qword)(a), si_from_int(count)))); 1676} 1677 1678static __inline vec_int4 spu_rlqwbyte(vec_int4 a, int count) 1679{ 1680 return ((vec_int4)(si_rotqby((qword)(a), si_from_int(count)))); 1681} 1682 1683static __inline vec_float4 spu_rlqwbyte(vec_float4 a, int count) 1684{ 1685 return ((vec_float4)(si_rotqby((qword)(a), si_from_int(count)))); 1686} 1687 1688static __inline vec_ullong2 spu_rlqwbyte(vec_ullong2 a, int count) 1689{ 1690 return ((vec_ullong2)(si_rotqby((qword)(a), si_from_int(count)))); 1691} 1692 1693static __inline vec_llong2 spu_rlqwbyte(vec_llong2 a, int count) 1694{ 1695 return ((vec_llong2)(si_rotqby((qword)(a), si_from_int(count)))); 1696} 1697 1698static __inline vec_double2 spu_rlqwbyte(vec_double2 a, int count) 1699{ 1700 return ((vec_double2)(si_rotqby((qword)(a), si_from_int(count)))); 1701} 1702 1703 1704/* spu_rlqwbytebc 1705 * ============== 1706 */ 1707static __inline vec_uchar16 spu_rlqwbytebc(vec_uchar16 a, int count) 1708{ 1709 return ((vec_uchar16)(si_rotqbybi((qword)(a), si_from_int(count)))); 1710} 1711 1712static __inline vec_char16 spu_rlqwbytebc(vec_char16 a, int count) 1713{ 1714 return ((vec_char16)(si_rotqbybi((qword)(a), si_from_int(count)))); 1715} 1716 1717static __inline vec_ushort8 spu_rlqwbytebc(vec_ushort8 a, int count) 1718{ 1719 return ((vec_ushort8)(si_rotqbybi((qword)(a), si_from_int(count)))); 1720} 1721 1722static __inline vec_short8 spu_rlqwbytebc(vec_short8 a, int count) 1723{ 1724 return ((vec_short8)(si_rotqbybi((qword)(a), si_from_int(count)))); 1725} 1726 1727static __inline vec_uint4 spu_rlqwbytebc(vec_uint4 a, int count) 1728{ 1729 return ((vec_uint4)(si_rotqbybi((qword)(a), si_from_int(count)))); 1730} 1731 1732static __inline vec_int4 spu_rlqwbytebc(vec_int4 a, int count) 1733{ 1734 return ((vec_int4)(si_rotqbybi((qword)(a), si_from_int(count)))); 1735} 1736 1737static __inline vec_float4 spu_rlqwbytebc(vec_float4 a, int count) 1738{ 1739 return ((vec_float4)(si_rotqbybi((qword)(a), si_from_int(count)))); 1740} 1741 1742static __inline vec_ullong2 spu_rlqwbytebc(vec_ullong2 a, int count) 1743{ 1744 return ((vec_ullong2)(si_rotqbybi((qword)(a), si_from_int(count)))); 1745} 1746 1747static __inline vec_llong2 spu_rlqwbytebc(vec_llong2 a, int count) 1748{ 1749 return ((vec_llong2)(si_rotqbybi((qword)(a), si_from_int(count)))); 1750} 1751 1752static __inline vec_double2 spu_rlqwbytebc(vec_double2 a, int count) 1753{ 1754 return ((vec_double2)(si_rotqbybi((qword)(a), si_from_int(count)))); 1755} 1756 1757/* spu_rlqw 1758 * ======== 1759 */ 1760static __inline vec_uchar16 spu_rlqw(vec_uchar16 a, int count) 1761{ 1762 return ((vec_uchar16)(si_rotqbi((qword)(a), si_from_int(count)))); 1763} 1764 1765static __inline vec_char16 spu_rlqw(vec_char16 a, int count) 1766{ 1767 return ((vec_char16)(si_rotqbi((qword)(a), si_from_int(count)))); 1768} 1769 1770static __inline vec_ushort8 spu_rlqw(vec_ushort8 a, int count) 1771{ 1772 return ((vec_ushort8)(si_rotqbi((qword)(a), si_from_int(count)))); 1773} 1774 1775static __inline vec_short8 spu_rlqw(vec_short8 a, int count) 1776{ 1777 return ((vec_short8)(si_rotqbi((qword)(a), si_from_int(count)))); 1778} 1779 1780static __inline vec_uint4 spu_rlqw(vec_uint4 a, int count) 1781{ 1782 return ((vec_uint4)(si_rotqbi((qword)(a), si_from_int(count)))); 1783} 1784 1785static __inline vec_int4 spu_rlqw(vec_int4 a, int count) 1786{ 1787 return ((vec_int4)(si_rotqbi((qword)(a), si_from_int(count)))); 1788} 1789 1790static __inline vec_float4 spu_rlqw(vec_float4 a, int count) 1791{ 1792 return ((vec_float4)(si_rotqbi((qword)(a), si_from_int(count)))); 1793} 1794 1795static __inline vec_ullong2 spu_rlqw(vec_ullong2 a, int count) 1796{ 1797 return ((vec_ullong2)(si_rotqbi((qword)(a), si_from_int(count)))); 1798} 1799 1800static __inline vec_llong2 spu_rlqw(vec_llong2 a, int count) 1801{ 1802 return ((vec_llong2)(si_rotqbi((qword)(a), si_from_int(count)))); 1803} 1804 1805static __inline vec_double2 spu_rlqw(vec_double2 a, int count) 1806{ 1807 return ((vec_double2)(si_rotqbi((qword)(a), si_from_int(count)))); 1808} 1809 1810/* spu_roundtf 1811 * =========== 1812 */ 1813static __inline vec_float4 spu_roundtf(vec_double2 a) 1814{ 1815 return ((vec_float4)(si_frds((qword)(a)))); 1816} 1817 1818 1819/* spu_rsqrte 1820 * ========== 1821 */ 1822#define spu_rsqrte(_a) vec_rsqrte(_a) 1823 1824 1825/* spu_sel 1826 * ======= 1827 */ 1828static __inline vec_uchar16 spu_sel(vec_uchar16 a, vec_uchar16 b, vec_uchar16 pattern) 1829{ 1830 return ((vec_uchar16)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1831} 1832 1833static __inline vec_char16 spu_sel(vec_char16 a, vec_char16 b, vec_uchar16 pattern) 1834{ 1835 return ((vec_char16)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1836} 1837 1838static __inline vec_ushort8 spu_sel(vec_ushort8 a, vec_ushort8 b, vec_ushort8 pattern) 1839{ 1840 return ((vec_ushort8)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1841} 1842 1843static __inline vec_short8 spu_sel(vec_short8 a, vec_short8 b, vec_ushort8 pattern) 1844{ 1845 return ((vec_short8)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1846} 1847 1848static __inline vec_uint4 spu_sel(vec_uint4 a, vec_uint4 b, vec_uint4 pattern) 1849{ 1850 return ((vec_uint4)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1851} 1852 1853static __inline vec_int4 spu_sel(vec_int4 a, vec_int4 b, vec_uint4 pattern) 1854{ 1855 return ((vec_int4)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1856} 1857 1858static __inline vec_float4 spu_sel(vec_float4 a, vec_float4 b, vec_uint4 pattern) 1859{ 1860 return ((vec_float4)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1861} 1862 1863static __inline vec_ullong2 spu_sel(vec_ullong2 a, vec_ullong2 b, vec_ullong2 pattern) 1864{ 1865 return ((vec_ullong2)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1866} 1867 1868static __inline vec_llong2 spu_sel(vec_llong2 a, vec_llong2 b, vec_ullong2 pattern) 1869{ 1870 return ((vec_llong2)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1871} 1872 1873static __inline vec_double2 spu_sel(vec_double2 a, vec_double2 b, vec_ullong2 pattern) 1874{ 1875 return ((vec_double2)(si_selb((qword)(a), (qword)(b), (qword)(pattern)))); 1876} 1877 1878 1879 1880/* spu_shuffle 1881 * =========== 1882 */ 1883static __inline vec_uchar16 spu_shuffle(vec_uchar16 a, vec_uchar16 b, vec_uchar16 pattern) 1884{ 1885 return ((vec_uchar16)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1886} 1887 1888static __inline vec_char16 spu_shuffle(vec_char16 a, vec_char16 b, vec_uchar16 pattern) 1889{ 1890 return ((vec_char16)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1891} 1892 1893static __inline vec_ushort8 spu_shuffle(vec_ushort8 a, vec_ushort8 b, vec_uchar16 pattern) 1894{ 1895 return ((vec_ushort8)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1896} 1897 1898static __inline vec_short8 spu_shuffle(vec_short8 a, vec_short8 b, vec_uchar16 pattern) 1899{ 1900 return ((vec_short8)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1901} 1902 1903static __inline vec_uint4 spu_shuffle(vec_uint4 a, vec_uint4 b, vec_uchar16 pattern) 1904{ 1905 return ((vec_uint4)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1906} 1907 1908static __inline vec_int4 spu_shuffle(vec_int4 a, vec_int4 b, vec_uchar16 pattern) 1909{ 1910 return ((vec_int4)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1911} 1912 1913static __inline vec_float4 spu_shuffle(vec_float4 a, vec_float4 b, vec_uchar16 pattern) 1914{ 1915 return ((vec_float4)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1916} 1917 1918static __inline vec_ullong2 spu_shuffle(vec_ullong2 a, vec_ullong2 b, vec_uchar16 pattern) 1919{ 1920 return ((vec_ullong2)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1921} 1922 1923static __inline vec_llong2 spu_shuffle(vec_llong2 a, vec_llong2 b, vec_uchar16 pattern) 1924{ 1925 return ((vec_llong2)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1926} 1927 1928static __inline vec_double2 spu_shuffle(vec_double2 a, vec_double2 b, vec_uchar16 pattern) 1929{ 1930 return ((vec_double2)(si_shufb((qword)(a), (qword)(b), (qword)(pattern)))); 1931} 1932 1933 1934/* spu_sl 1935 * ====== 1936 */ 1937static __inline vec_ushort8 spu_sl(vec_ushort8 a, vec_ushort8 b) 1938{ 1939 return ((vec_ushort8)(si_shlh((qword)(a), (qword)(b)))); 1940} 1941 1942static __inline vec_short8 spu_sl(vec_short8 a, vec_ushort8 b) 1943{ 1944 return ((vec_short8)(si_shlh((qword)(a), (qword)(b)))); 1945} 1946 1947static __inline vec_uint4 spu_sl(vec_uint4 a, vec_uint4 b) 1948{ 1949 return ((vec_uint4)(si_shl((qword)(a), (qword)(b)))); 1950} 1951 1952static __inline vec_int4 spu_sl(vec_int4 a, vec_uint4 b) 1953{ 1954 return ((vec_int4)(si_shl((qword)(a), (qword)(b)))); 1955} 1956 1957static __inline vec_ushort8 spu_sl(vec_ushort8 a, unsigned int b) 1958{ 1959 return ((vec_ushort8)(si_shlhi((qword)(a), b))); 1960} 1961 1962static __inline vec_short8 spu_sl(vec_short8 a, unsigned int b) 1963{ 1964 return ((vec_short8)(si_shlhi((qword)(a), b))); 1965} 1966 1967static __inline vec_uint4 spu_sl(vec_uint4 a, unsigned int b) 1968{ 1969 return ((vec_uint4)(si_shli((qword)(a), b))); 1970} 1971 1972static __inline vec_int4 spu_sl(vec_int4 a, unsigned int b) 1973{ 1974 return ((vec_int4)(si_shli((qword)(a), b))); 1975} 1976 1977 1978/* spu_slqw 1979 * ======== 1980 */ 1981static __inline vec_uchar16 spu_slqw(vec_uchar16 a, unsigned int count) 1982{ 1983 return ((vec_uchar16)(si_shlqbi((qword)(a), si_from_uint(count)))); 1984} 1985 1986static __inline vec_char16 spu_slqw(vec_char16 a, unsigned int count) 1987{ 1988 return ((vec_char16)(si_shlqbi((qword)(a), si_from_uint(count)))); 1989} 1990 1991static __inline vec_ushort8 spu_slqw(vec_ushort8 a, unsigned int count) 1992{ 1993 return ((vec_ushort8)(si_shlqbi((qword)(a), si_from_uint(count)))); 1994} 1995 1996static __inline vec_short8 spu_slqw(vec_short8 a, unsigned int count) 1997{ 1998 return ((vec_short8)(si_shlqbi((qword)(a), si_from_uint(count)))); 1999} 2000 2001static __inline vec_uint4 spu_slqw(vec_uint4 a, unsigned int count) 2002{ 2003 return ((vec_uint4)(si_shlqbi((qword)(a), si_from_uint(count)))); 2004} 2005 2006static __inline vec_int4 spu_slqw(vec_int4 a, unsigned int count) 2007{ 2008 return ((vec_int4)(si_shlqbi((qword)(a), si_from_uint(count)))); 2009} 2010 2011static __inline vec_float4 spu_slqw(vec_float4 a, unsigned int count) 2012{ 2013 return ((vec_float4)(si_shlqbi((qword)(a), si_from_uint(count)))); 2014} 2015 2016static __inline vec_ullong2 spu_slqw(vec_ullong2 a, unsigned int count) 2017{ 2018 return ((vec_ullong2)(si_shlqbi((qword)(a), si_from_uint(count)))); 2019} 2020 2021static __inline vec_llong2 spu_slqw(vec_llong2 a, unsigned int count) 2022{ 2023 return ((vec_llong2)(si_shlqbi((qword)(a), si_from_uint(count)))); 2024} 2025 2026static __inline vec_double2 spu_slqw(vec_double2 a, unsigned int count) 2027{ 2028 return ((vec_double2)(si_shlqbi((qword)(a), si_from_uint(count)))); 2029} 2030 2031/* spu_slqwbyte 2032 * ============ 2033 */ 2034static __inline vec_uchar16 spu_slqwbyte(vec_uchar16 a, unsigned int count) 2035{ 2036 return ((vec_uchar16)(si_shlqby((qword)(a), si_from_uint(count)))); 2037} 2038 2039static __inline vec_char16 spu_slqwbyte(vec_char16 a, unsigned int count) 2040{ 2041 return ((vec_char16)(si_shlqby((qword)(a), si_from_uint(count)))); 2042} 2043 2044static __inline vec_ushort8 spu_slqwbyte(vec_ushort8 a, unsigned int count) 2045{ 2046 return ((vec_ushort8)(si_shlqby((qword)(a), si_from_uint(count)))); 2047} 2048 2049static __inline vec_short8 spu_slqwbyte(vec_short8 a, unsigned int count) 2050{ 2051 return ((vec_short8)(si_shlqby((qword)(a), si_from_uint(count)))); 2052} 2053 2054static __inline vec_uint4 spu_slqwbyte(vec_uint4 a, unsigned int count) 2055{ 2056 return ((vec_uint4)(si_shlqby((qword)(a), si_from_uint(count)))); 2057} 2058 2059static __inline vec_int4 spu_slqwbyte(vec_int4 a, unsigned int count) 2060{ 2061 return ((vec_int4)(si_shlqby((qword)(a), si_from_uint(count)))); 2062} 2063 2064static __inline vec_float4 spu_slqwbyte(vec_float4 a, unsigned int count) 2065{ 2066 return ((vec_float4)(si_shlqby((qword)(a), si_from_uint(count)))); 2067} 2068 2069static __inline vec_ullong2 spu_slqwbyte(vec_ullong2 a, unsigned int count) 2070{ 2071 return ((vec_ullong2)(si_shlqby((qword)(a), si_from_uint(count)))); 2072} 2073 2074static __inline vec_llong2 spu_slqwbyte(vec_llong2 a, unsigned int count) 2075{ 2076 return ((vec_llong2)(si_shlqby((qword)(a), si_from_uint(count)))); 2077} 2078 2079static __inline vec_double2 spu_slqwbyte(vec_double2 a, unsigned int count) 2080{ 2081 return ((vec_double2)(si_shlqby((qword)(a), si_from_uint(count)))); 2082} 2083 2084/* spu_slqwbytebc 2085 * ============== 2086 */ 2087static __inline vec_uchar16 spu_slqwbytebc(vec_uchar16 a, unsigned int count) 2088{ 2089 return ((vec_uchar16)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2090} 2091 2092static __inline vec_char16 spu_slqwbytebc(vec_char16 a, unsigned int count) 2093{ 2094 return ((vec_char16)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2095} 2096 2097static __inline vec_ushort8 spu_slqwbytebc(vec_ushort8 a, unsigned int count) 2098{ 2099 return ((vec_ushort8)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2100} 2101 2102static __inline vec_short8 spu_slqwbytebc(vec_short8 a, unsigned int count) 2103{ 2104 return ((vec_short8)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2105} 2106 2107static __inline vec_uint4 spu_slqwbytebc(vec_uint4 a, unsigned int count) 2108{ 2109 return ((vec_uint4)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2110} 2111 2112static __inline vec_int4 spu_slqwbytebc(vec_int4 a, unsigned int count) 2113{ 2114 return ((vec_int4)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2115} 2116 2117static __inline vec_float4 spu_slqwbytebc(vec_float4 a, unsigned int count) 2118{ 2119 return ((vec_float4)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2120} 2121 2122static __inline vec_ullong2 spu_slqwbytebc(vec_ullong2 a, unsigned int count) 2123{ 2124 return ((vec_ullong2)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2125} 2126 2127static __inline vec_llong2 spu_slqwbytebc(vec_llong2 a, unsigned int count) 2128{ 2129 return ((vec_llong2)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2130} 2131 2132static __inline vec_double2 spu_slqwbytebc(vec_double2 a, unsigned int count) 2133{ 2134 return ((vec_double2)(si_shlqbybi((qword)(a), si_from_uint(count)))); 2135} 2136 2137/* spu_splats 2138 * ========== 2139 */ 2140static __inline vec_uchar16 spu_splats(unsigned char a) 2141{ 2142 union { 2143 vec_uchar16 v; 2144 unsigned char c[16]; 2145 } in; 2146 2147 in.c[0] = a; 2148 return (vec_splat(in.v, 0)); 2149} 2150 2151static __inline vec_char16 spu_splats(signed char a) 2152{ 2153 return ((vec_char16)spu_splats((unsigned char)(a))); 2154} 2155 2156static __inline vec_ushort8 spu_splats(unsigned short a) 2157{ 2158 union { 2159 vec_ushort8 v; 2160 unsigned short s[8]; 2161 } in; 2162 2163 in.s[0] = a; 2164 return (vec_splat(in.v, 0)); 2165} 2166 2167static __inline vec_short8 spu_splats(signed short a) 2168{ 2169 return ((vec_short8)spu_splats((unsigned short)(a))); 2170} 2171 2172static __inline vec_uint4 spu_splats(unsigned int a) 2173{ 2174 union { 2175 vec_uint4 v; 2176 unsigned int i[4]; 2177 } in; 2178 2179 in.i[0] = a; 2180 return (vec_splat(in.v, 0)); 2181} 2182 2183static __inline vec_int4 spu_splats(signed int a) 2184{ 2185 return ((vec_int4)spu_splats((unsigned int)(a))); 2186} 2187 2188static __inline vec_float4 spu_splats(float a) 2189{ 2190 union { 2191 vec_float4 v; 2192 float f[4]; 2193 } in; 2194 2195 in.f[0] = a; 2196 return (vec_splat(in.v, 0)); 2197} 2198 2199static __inline vec_ullong2 spu_splats(unsigned long long a) 2200{ 2201 union { 2202 vec_ullong2 v; 2203 unsigned long long l[2]; 2204 } in; 2205 2206 in.l[0] = a; 2207 in.l[1] = a; 2208 return (in.v); 2209} 2210 2211static __inline vec_llong2 spu_splats(signed long long a) 2212{ 2213 return ((vec_llong2)spu_splats((unsigned long long)(a))); 2214} 2215 2216static __inline vec_double2 spu_splats(double a) 2217{ 2218 union { 2219 vec_double2 v; 2220 double d[2]; 2221 } in; 2222 2223 in.d[0] = a; 2224 in.d[1] = a; 2225 return (in.v); 2226} 2227 2228 2229/* spu_stop 2230 * ======== 2231 */ 2232#define spu_stop(_type) si_stop(_type) 2233 2234 2235/* spu_sub 2236 * ======= 2237 */ 2238static __inline vec_ushort8 spu_sub(vec_ushort8 a, vec_ushort8 b) 2239{ 2240 return ((vec_ushort8)(si_sfh((qword)(b), (qword)(a)))); 2241} 2242 2243static __inline vec_short8 spu_sub(vec_short8 a, vec_short8 b) 2244{ 2245 return ((vec_short8)(si_sfh((qword)(b), (qword)(a)))); 2246} 2247 2248static __inline vec_uint4 spu_sub(vec_uint4 a, vec_uint4 b) 2249{ 2250 return ((vec_uint4)(si_sf((qword)(b), (qword)(a)))); 2251} 2252 2253static __inline vec_int4 spu_sub(vec_int4 a, vec_int4 b) 2254{ 2255 return ((vec_int4)(si_sf((qword)(b), (qword)(a)))); 2256} 2257 2258static __inline vec_float4 spu_sub(vec_float4 a, vec_float4 b) 2259{ 2260 return ((vec_float4)(si_fs((qword)(a), (qword)(b)))); 2261} 2262 2263static __inline vec_double2 spu_sub(vec_double2 a, vec_double2 b) 2264{ 2265 return ((vec_double2)(si_dfs((qword)(a), (qword)(b)))); 2266} 2267 2268static __inline vec_uint4 spu_sub(unsigned int a, vec_uint4 b) 2269{ 2270 return ((vec_uint4)(si_sfi((qword)b, (int)a))); 2271} 2272 2273static __inline vec_int4 spu_sub(signed int a, vec_int4 b) 2274{ 2275 return ((vec_int4)(si_sfi((qword)b, (int)a))); 2276} 2277 2278static __inline vec_ushort8 spu_sub(unsigned short a, vec_ushort8 b) 2279{ 2280 return ((vec_ushort8)(si_sfhi((qword)b, (short)a))); 2281} 2282 2283static __inline vec_short8 spu_sub(signed short a, vec_short8 b) 2284{ 2285 return ((vec_short8)(si_sfhi((qword)b, (short)a))); 2286} 2287 2288/* spu_subx 2289 * ======== 2290 */ 2291static __inline vec_uint4 spu_subx(vec_uint4 a, vec_uint4 b, vec_uint4 c) 2292{ 2293 return ((vec_uint4)(si_sfx((qword)(b), (qword)(a), (qword)(c)))); 2294} 2295 2296static __inline vec_int4 spu_subx(vec_int4 a, vec_int4 b, vec_int4 c) 2297{ 2298 return ((vec_int4)(si_sfx((qword)(b), (qword)(a), (qword)(c)))); 2299} 2300 2301/* spu_sumb 2302 * ======== 2303 */ 2304static __inline vec_ushort8 spu_sumb(vec_uchar16 a, vec_uchar16 b) 2305{ 2306 return ((vec_ushort8)(si_sumb((qword)(a), (qword)(b)))); 2307} 2308 2309 2310/* spu_sync 2311 * spu_sync_c 2312 * ======== 2313 */ 2314#define spu_sync() /* do nothing */ 2315 2316#define spu_sync_c() /* do nothing */ 2317 2318 2319/* spu_writech 2320 * =========== 2321 */ 2322#define spu_writech(_channel, _a) /* not mappable */ 2323 2324/* spu_writechqw 2325 * ============= 2326 */ 2327#define spu_writechqw(_channel, _a) /* not mappable */ 2328 2329 2330/* spu_xor 2331 * ======= 2332 */ 2333static __inline vec_uchar16 spu_xor(vec_uchar16 a, vec_uchar16 b) 2334{ 2335 return ((vec_uchar16)(si_xor((qword)(a), (qword)(b)))); 2336} 2337 2338static __inline vec_char16 spu_xor(vec_char16 a, vec_char16 b) 2339{ 2340 return ((vec_char16)(si_xor((qword)(a), (qword)(b)))); 2341} 2342 2343static __inline vec_ushort8 spu_xor(vec_ushort8 a, vec_ushort8 b) 2344{ 2345 return ((vec_ushort8)(si_xor((qword)(a), (qword)(b)))); 2346} 2347 2348static __inline vec_short8 spu_xor(vec_short8 a, vec_short8 b) 2349{ 2350 return ((vec_short8)(si_xor((qword)(a), (qword)(b)))); 2351} 2352 2353static __inline vec_uint4 spu_xor(vec_uint4 a, vec_uint4 b) 2354{ 2355 return ((vec_uint4)(si_xor((qword)(a), (qword)(b)))); 2356} 2357 2358static __inline vec_int4 spu_xor(vec_int4 a, vec_int4 b) 2359{ 2360 return ((vec_int4)(si_xor((qword)(a), (qword)(b)))); 2361} 2362 2363static __inline vec_float4 spu_xor(vec_float4 a, vec_float4 b) 2364{ 2365 return ((vec_float4)(si_xor((qword)(a), (qword)(b)))); 2366} 2367 2368static __inline vec_ullong2 spu_xor(vec_ullong2 a, vec_ullong2 b) 2369{ 2370 return ((vec_ullong2)(si_xor((qword)(a), (qword)(b)))); 2371} 2372 2373static __inline vec_llong2 spu_xor(vec_llong2 a, vec_llong2 b) 2374{ 2375 return ((vec_llong2)(si_xor((qword)(a), (qword)(b)))); 2376} 2377 2378static __inline vec_double2 spu_xor(vec_double2 a, vec_double2 b) 2379{ 2380 return ((vec_double2)(si_xor((qword)(a), (qword)(b)))); 2381} 2382 2383static __inline vec_uchar16 spu_xor(vec_uchar16 a, unsigned char b) 2384{ 2385 return ((vec_uchar16)(si_xorbi((qword)(a), b))); 2386} 2387 2388static __inline vec_char16 spu_xor(vec_char16 a, signed char b) 2389{ 2390 return ((vec_char16)(si_xorbi((qword)(a), (unsigned char)(b)))); 2391} 2392 2393static __inline vec_ushort8 spu_xor(vec_ushort8 a, unsigned short b) 2394{ 2395 return ((vec_ushort8)(si_xorhi((qword)(a), b))); 2396} 2397 2398static __inline vec_short8 spu_xor(vec_short8 a, signed short b) 2399{ 2400 return ((vec_short8)(si_xorhi((qword)(a), (unsigned short)(b)))); 2401} 2402 2403static __inline vec_uint4 spu_xor(vec_uint4 a, unsigned int b) 2404{ 2405 return ((vec_uint4)(si_xori((qword)(a), b))); 2406} 2407 2408static __inline vec_int4 spu_xor(vec_int4 a, signed int b) 2409{ 2410 return ((vec_int4)(si_xori((qword)(a), (unsigned int)(b)))); 2411} 2412 2413#endif /* !__SPU__ */ 2414#endif /* __cplusplus */ 2415#endif /* !_SPU2VMX_H_ */ 2416