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