OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [config/] [spu/] [vmx2spu.h] - Blame information for rev 717

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 709 jeremybenn
/* Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc.
2
 
3
   This file is free software; you can redistribute it and/or modify it under
4
   the terms of the GNU General Public License as published by the Free
5
   Software Foundation; either version 3 of the License, or (at your option)
6
   any later version.
7
 
8
   This file is distributed in the hope that it will be useful, but WITHOUT
9
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
11
   for more details.
12
 
13
   Under Section 7 of GPL version 3, you are granted additional
14
   permissions described in the GCC Runtime Library Exception, version
15
   3.1, as published by the Free Software Foundation.
16
 
17
   You should have received a copy of the GNU General Public License and
18
   a copy of the GCC Runtime Library Exception along with this program;
19
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
20
   <http://www.gnu.org/licenses/>.  */
21
 
22
#ifndef _VMX2SPU_H_
23
#define _VMX2SPU_H_     1
24
 
25
#ifdef __cplusplus
26
 
27
#ifdef __SPU__
28
 
29
#include <spu_intrinsics.h>
30
#include <vec_types.h>
31
 
32
/* This file maps generic VMX intrinsics and predicates to the SPU using
33
 * overloaded C++ functions.
34
 */
35
 
36
/************************************************************************
37
 *                        INTRINSICS
38
 ************************************************************************/
39
 
40
/* vec_abs (vector absolute value)
41
 * =======
42
 */
43
static inline vec_char16 vec_abs(vec_char16 a)
44
{
45
  vec_char16 minus_a;
46
 
47
  minus_a = (vec_char16)(spu_add((vec_ushort8)(spu_and(spu_xor(a, 0xFF), 0x7F)), 0x101));
48
  return (spu_sel(minus_a, a, spu_cmpgt(a, -1)));
49
}
50
 
51
static inline vec_short8 vec_abs(vec_short8 a)
52
{
53
  return (spu_sel(spu_sub(0, a), a, spu_cmpgt(a, -1)));
54
}
55
 
56
static inline vec_int4 vec_abs(vec_int4 a)
57
{
58
  return (spu_sel(spu_sub(0, a), a, spu_cmpgt(a, -1)));
59
}
60
 
61
static inline vec_float4 vec_abs(vec_float4 a)
62
{
63
  return ((vec_float4)(spu_rlmask(spu_sl((vec_uint4)(a), 1), -1)));
64
}
65
 
66
/* vec_abss (vector absolute value saturate)
67
 * ========
68
 */
69
static inline vec_char16 vec_abss(vec_char16 a)
70
{
71
  vec_char16 minus_a;
72
 
73
  minus_a = (vec_char16)spu_add((vec_short8)(spu_xor(a, -1)),
74
                                (vec_short8)(spu_and(spu_cmpgt((vec_uchar16)(a), 0x80), 1)));
75
  return (spu_sel(minus_a, a, spu_cmpgt(a, -1)));
76
}
77
 
78
static inline vec_short8 vec_abss(vec_short8 a)
79
{
80
  vec_short8 minus_a;
81
 
82
  minus_a = spu_add(spu_sub(0, a), (vec_short8)(spu_cmpeq(a, ((vec_short8){0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000,0x8000}))));
83
  return (spu_sel(minus_a, a, spu_cmpgt(a, -1)));
84
}
85
 
86
static inline vec_int4 vec_abss(vec_int4 a)
87
{
88
  vec_int4 minus_a;
89
 
90
  minus_a = spu_add(spu_sub(0, a), (vec_int4)(spu_cmpeq(a, ((vec_int4){0x80000000,0x80000000,0x80000000,0x80000000}))));
91
  return (spu_sel(minus_a, a, spu_cmpgt(a, -1)));
92
}
93
 
94
 
95
/* vec_add (vector add)
96
 * =======
97
 */
98
static inline vec_uchar16 vec_add(vec_uchar16 a, vec_uchar16 b)
99
{
100
  return ((vec_uchar16)(spu_sel(spu_add((vec_ushort8)(a), (vec_ushort8)(b)),
101
                                spu_add(spu_and((vec_ushort8)(a), 0xFF00), spu_and((vec_ushort8)(b), 0xFF00)),
102
                                spu_splats((unsigned short)(0xFF00)))));
103
}
104
 
105
static inline vec_char16 vec_add(vec_char16 a, vec_char16 b)
106
{
107
  return ((vec_char16)vec_add((vec_uchar16)(a), (vec_uchar16)(b)));
108
}
109
 
110
static inline vec_char16 vec_add(vec_bchar16 a, vec_char16 b)
111
{
112
  return ((vec_char16)vec_add((vec_uchar16)(a), (vec_uchar16)(b)));
113
}
114
 
115
static inline vec_char16 vec_add(vec_char16 a, vec_bchar16 b)
116
{
117
  return ((vec_char16)vec_add((vec_uchar16)(a), (vec_uchar16)(b)));
118
}
119
 
120
static inline vec_ushort8 vec_add(vec_ushort8 a, vec_ushort8 b)
121
{
122
  return (spu_add(a, b));
123
}
124
 
125
static inline vec_short8 vec_add(vec_short8 a, vec_short8 b)
126
{
127
  return (spu_add(a, b));
128
}
129
 
130
static inline vec_short8 vec_add(vec_bshort8 a, vec_short8 b)
131
{
132
  return (spu_add((vec_short8)(a), b));
133
}
134
 
135
static inline vec_short8 vec_add(vec_short8 a, vec_bshort8 b)
136
{
137
  return (spu_add(a, (vec_short8)(b)));
138
}
139
 
140
static inline vec_uint4 vec_add(vec_uint4 a, vec_uint4 b)
141
{
142
  return (spu_add(a, b));
143
}
144
 
145
static inline vec_int4 vec_add(vec_int4 a, vec_int4 b)
146
{
147
  return (spu_add(a, b));
148
}
149
 
150
static inline vec_int4 vec_add(vec_bint4 a, vec_int4 b)
151
{
152
  return (spu_add((vec_int4)(a), b));
153
}
154
 
155
static inline vec_int4 vec_add(vec_int4 a, vec_bint4 b)
156
{
157
  return (spu_add(a, (vec_int4)(b)));
158
}
159
 
160
static inline vec_float4 vec_add(vec_float4 a, vec_float4 b)
161
{
162
  return (spu_add(a, b));
163
}
164
 
165
/* vec_addc (vector add carryout unsigned word)
166
 * ========
167
 */
168
#define vec_addc(_a, _b)        spu_genc(_a, _b)
169
 
170
/* vec_adds (vector add saturated)
171
 * ========
172
 */
173
static inline vec_uchar16 vec_adds(vec_uchar16 a, vec_uchar16 b)
174
{
175
  vec_uchar16 s1, s2, s, d;
176
 
177
  s1 = (vec_uchar16)(spu_add(spu_rlmask((vec_ushort8)(a), -8), spu_rlmask((vec_ushort8)(b), -8)));
178
  s2 = (vec_uchar16)(spu_add(spu_and((vec_ushort8)(a), 0xFF), spu_and((vec_ushort8)(b), 0xFF)));
179
  s  = spu_shuffle(s1, s2, ((vec_uchar16){0, 16,  2, 18,  4, 20,  6, 22,
180
                                          8, 24, 10, 26, 12, 28, 14, 30}));
181
  d  = spu_shuffle(s1, s2, ((vec_uchar16){1, 17,  3, 19,  5, 21,  7, 23,
182
                                          9, 25, 11, 27, 13, 29, 15, 31}));
183
  return (spu_or(d, spu_cmpeq(s, 1)));
184
}
185
 
186
static inline vec_char16 vec_adds(vec_char16 a, vec_char16 b)
187
{
188
  vec_uchar16 s1, s2, s, d;
189
 
190
  s1 = (vec_uchar16)(spu_add(spu_rlmask((vec_ushort8)(a), -8), spu_rlmask((vec_ushort8)(b), -8)));
191
  s2 = (vec_uchar16)(spu_add(spu_and((vec_ushort8)(a), 0xFF), spu_and((vec_ushort8)(b), 0xFF)));
192
  s  = spu_shuffle(s1, s2, ((vec_uchar16){1, 17,  3, 19,  5, 21,  7, 23,
193
                                          9, 25, 11, 27, 13, 29, 15, 31}));
194
  d = spu_sel(s, spu_splats((unsigned char)0x7F), spu_cmpgt(spu_and(s, (vec_uchar16)(spu_nor(a, b))), 0x7F));
195
  d = spu_sel(d, spu_splats((unsigned char)0x80), spu_cmpgt(spu_nor(s, (vec_uchar16)(spu_nand(a, b))), 0x7F));
196
  return ((vec_char16)(d));
197
}
198
 
199
static inline vec_char16 vec_adds(vec_bchar16 a, vec_char16 b)
200
{
201
  return (vec_adds((vec_char16)(a), b));
202
}
203
 
204
static inline vec_char16 vec_adds(vec_char16 a, vec_bchar16 b)
205
{
206
  return (vec_adds(a, (vec_char16)(b)));
207
}
208
 
209
static inline vec_ushort8 vec_adds(vec_ushort8 a, vec_ushort8 b)
210
{
211
  vec_ushort8 s, d;
212
 
213
  s = spu_add(a, b);
214
  d = spu_or(s, spu_rlmaska(spu_sel(spu_xor(s, -1), a, spu_eqv(a, b)), -15));
215
  return (d);
216
}
217
 
218
static inline vec_short8 vec_adds(vec_short8 a, vec_short8 b)
219
{
220
  vec_short8 s, d;
221
 
222
  s = spu_add(a, b);
223
  d = spu_sel(s, spu_splats((signed short)0x7FFF), (vec_ushort8)(spu_rlmaska(spu_and(s, spu_nor(a, b)), -15)));
224
  d = spu_sel(d, spu_splats((signed short)0x8000), (vec_ushort8)(spu_rlmaska(spu_nor(s, spu_nand(a, b)), -15)));
225
  return (d);
226
}
227
 
228
static inline vec_short8 vec_adds(vec_bshort8 a, vec_short8 b)
229
{
230
  return (vec_adds((vec_short8)(a), b));
231
}
232
 
233
static inline vec_short8 vec_adds(vec_short8 a, vec_bshort8 b)
234
{
235
  return (vec_adds(a, (vec_short8)(b)));
236
}
237
 
238
static inline vec_uint4 vec_adds(vec_uint4 a, vec_uint4 b)
239
{
240
  return (spu_or(spu_add(a, b), spu_rlmaska(spu_sl(spu_genc(a, b), 31), -31)));
241
}
242
 
243
static inline vec_int4 vec_adds(vec_int4 a, vec_int4 b)
244
{
245
  vec_int4 s, d;
246
 
247
  s = spu_add(a, b);
248
  d = spu_sel(s, spu_splats((signed int)0x7FFFFFFF), (vec_uint4)spu_rlmaska(spu_and(s, spu_nor(a, b)), -31));
249
  d = spu_sel(d, spu_splats((signed int)0x80000000), (vec_uint4)spu_rlmaska(spu_nor(s, spu_nand(a, b)), -31));
250
  return (d);
251
}
252
 
253
static inline vec_int4 vec_adds(vec_bint4 a, vec_int4 b)
254
{
255
  return (vec_adds((vec_int4)(a), b));
256
}
257
 
258
static inline vec_int4 vec_adds(vec_int4 a, vec_bint4 b)
259
{
260
  return (vec_adds(a, (vec_int4)(b)));
261
}
262
 
263
/* vec_and (vector logical and)
264
 * =======
265
 */
266
static inline vec_uchar16 vec_and(vec_uchar16 a, vec_uchar16 b)
267
{
268
  return (spu_and(a, b));
269
}
270
 
271
static inline vec_char16 vec_and(vec_char16 a, vec_char16 b)
272
{
273
  return (spu_and(a, b));
274
}
275
 
276
static inline vec_char16 vec_and(vec_bchar16 a, vec_char16 b)
277
{
278
  return (spu_and((vec_char16)(a), b));
279
}
280
 
281
static inline vec_char16 vec_and(vec_char16 a, vec_bchar16 b)
282
{
283
  return (spu_and(a, (vec_char16)(b)));
284
}
285
 
286
static inline vec_ushort8 vec_and(vec_ushort8 a, vec_ushort8 b)
287
{
288
  return (spu_and(a, b));
289
}
290
 
291
static inline vec_short8 vec_and(vec_short8 a, vec_short8 b)
292
{
293
  return (spu_and(a, b));
294
}
295
 
296
static inline vec_short8 vec_and(vec_bshort8 a, vec_short8 b)
297
{
298
  return (spu_and((vec_short8)(a), b));
299
}
300
 
301
static inline vec_short8 vec_and(vec_short8 a, vec_bshort8 b)
302
{
303
  return (spu_and(a, (vec_short8)(b)));
304
}
305
 
306
static inline vec_uint4 vec_and(vec_uint4 a, vec_uint4 b)
307
{
308
  return (spu_and(a, b));
309
}
310
 
311
static inline vec_int4 vec_and(vec_int4 a, vec_int4 b)
312
{
313
  return (spu_and(a, b));
314
}
315
 
316
static inline vec_int4 vec_and(vec_bint4 a, vec_int4 b)
317
{
318
  return (spu_and((vec_int4)(a), b));
319
}
320
 
321
static inline vec_int4 vec_and(vec_int4 a, vec_bint4 b)
322
{
323
  return (spu_and(a, (vec_int4)(b)));
324
}
325
 
326
static inline vec_float4 vec_and(vec_float4 a, vec_float4 b)
327
{
328
  return (spu_and(a, b));
329
}
330
 
331
static inline vec_float4 vec_and(vec_bint4 a, vec_float4 b)
332
{
333
  return (spu_and((vec_float4)(a),b));
334
}
335
 
336
static inline vec_float4 vec_and(vec_float4 a, vec_bint4 b)
337
{
338
  return (spu_and(a, (vec_float4)(b)));
339
}
340
 
341
 
342
/* vec_andc (vector logical and with complement)
343
 * ========
344
 */
345
static inline vec_uchar16 vec_andc(vec_uchar16 a, vec_uchar16 b)
346
{
347
  return (spu_andc(a, b));
348
}
349
 
350
static inline vec_char16 vec_andc(vec_char16 a, vec_char16 b)
351
{
352
  return (spu_andc(a, b));
353
}
354
 
355
static inline vec_char16 vec_andc(vec_bchar16 a, vec_char16 b)
356
{
357
  return (spu_andc((vec_char16)(a), b));
358
}
359
 
360
static inline vec_char16 vec_andc(vec_char16 a, vec_bchar16 b)
361
{
362
  return (spu_andc(a, (vec_char16)(b)));
363
}
364
 
365
static inline vec_ushort8 vec_andc(vec_ushort8 a, vec_ushort8 b)
366
{
367
  return (spu_andc(a, b));
368
}
369
 
370
static inline vec_short8 vec_andc(vec_short8 a, vec_short8 b)
371
{
372
  return (spu_andc(a, b));
373
}
374
 
375
static inline vec_short8 vec_andc(vec_bshort8 a, vec_short8 b)
376
{
377
  return (spu_andc((vec_short8)(a), b));
378
}
379
 
380
static inline vec_short8 vec_andc(vec_short8 a, vec_bshort8 b)
381
{
382
  return (spu_andc(a, (vec_short8)(b)));
383
}
384
 
385
static inline vec_uint4 vec_andc(vec_uint4 a, vec_uint4 b)
386
{
387
  return (spu_andc(a, b));
388
}
389
 
390
static inline vec_int4 vec_andc(vec_int4 a, vec_int4 b)
391
{
392
  return (spu_andc(a, b));
393
}
394
 
395
static inline vec_int4 vec_andc(vec_bint4 a, vec_int4 b)
396
{
397
  return (spu_andc((vec_int4)(a), b));
398
}
399
 
400
static inline vec_int4 vec_andc(vec_int4 a, vec_bint4 b)
401
{
402
  return (spu_andc(a, (vec_int4)(b)));
403
}
404
 
405
static inline vec_float4 vec_andc(vec_float4 a, vec_float4 b)
406
{
407
  return (spu_andc(a,b));
408
}
409
 
410
static inline vec_float4 vec_andc(vec_bint4 a, vec_float4 b)
411
{
412
  return (spu_andc((vec_float4)(a),b));
413
}
414
 
415
static inline vec_float4 vec_andc(vec_float4 a, vec_bint4 b)
416
{
417
  return (spu_andc(a, (vec_float4)(b)));
418
}
419
 
420
/* vec_avg (vector average)
421
 * =======
422
 */
423
static inline vec_uchar16 vec_avg(vec_uchar16 a, vec_uchar16 b)
424
{
425
  return (spu_avg(a, b));
426
}
427
 
428
static inline vec_char16 vec_avg(vec_char16 a, vec_char16 b)
429
{
430
  return ((vec_char16)(spu_xor(spu_avg((vec_uchar16)(a), (vec_uchar16)(b)),
431
                               (vec_uchar16)(spu_and(spu_xor(a,b), 0x80)))));
432
}
433
 
434
static inline vec_ushort8 vec_avg(vec_ushort8 a, vec_ushort8 b)
435
{
436
  return (spu_add(spu_add(spu_rlmask(a, -1), spu_rlmask(b, -1)),
437
                  spu_and(spu_or(a, b), 1)));
438
}
439
 
440
static inline vec_short8 vec_avg(vec_short8 a, vec_short8 b)
441
{
442
  return (spu_add(spu_add(spu_rlmaska(a, -1), spu_rlmaska(b, -1)),
443
                  spu_and(spu_or(a, b), 1)));
444
}
445
 
446
static inline vec_uint4 vec_avg(vec_uint4 a, vec_uint4 b)
447
{
448
  return (spu_add(spu_add(spu_rlmask(a, -1), spu_rlmask(b, -1)),
449
                  spu_and(spu_or(a, b), 1)));
450
}
451
 
452
static inline vec_int4 vec_avg(vec_int4 a, vec_int4 b)
453
{
454
  return (spu_add(spu_add(spu_rlmaska(a, -1), spu_rlmaska(b, -1)),
455
                  spu_and(spu_or(a, b), 1)));
456
}
457
 
458
 
459
/* vec_ceil (vector ceiling)
460
 * ========
461
 */
462
static inline vec_float4 vec_ceil(vec_float4 a)
463
{
464
  vec_int4  exp;
465
  vec_uint4 mask;
466
 
467
  a = spu_add(a, (vec_float4)(spu_and(spu_xor(spu_rlmaska((vec_int4)a, -31), -1), spu_splats((signed int)0x3F7FFFFF))));
468
  exp = spu_sub(127, (vec_int4)(spu_and(spu_rlmask((vec_uint4)(a), -23), 0xFF)));
469
  mask = spu_rlmask(spu_splats((unsigned int)0x7FFFFF), exp);
470
  mask = spu_sel(spu_splats((unsigned int)0), mask, spu_cmpgt(exp, -31));
471
  mask = spu_or(mask, spu_xor((vec_uint4)(spu_rlmaska(spu_add(exp, -1), -31)), -1));
472
 
473
  return ((vec_float4)(spu_andc((vec_uint4)(a), mask)));
474
}
475
 
476
 
477
/* vec_cmpb (vector compare bounds floating-point)
478
 * ========
479
 */
480
static inline vec_int4 vec_cmpb(vec_float4 a, vec_float4 b)
481
{
482
  vec_int4 b0 = (vec_int4)spu_splats(0x80000000);
483
  vec_int4 b1 = (vec_int4)spu_splats(0x40000000);
484
 
485
  return (spu_or(spu_and((vec_int4)spu_cmpgt(a, b), b0),
486
                 spu_and((vec_int4)spu_cmpgt(spu_xor(b, (vec_float4)(b0)), a), b1)));
487
}
488
 
489
/* vec_cmpeq (vector compare equal)
490
 * =========
491
 */
492
#define vec_cmpeq(_a, _b)       spu_cmpeq(_a, _b)
493
 
494
 
495
/* vec_cmpge (vector compare greater than or equal)
496
 * =========
497
 */
498
static inline vec_bint4 vec_cmpge(vec_float4 a, vec_float4 b)
499
{
500
  return (spu_xor(spu_cmpgt(b, a), -1));
501
}
502
 
503
 
504
/* vec_cmpgt (vector compare greater than)
505
 * =========
506
 */
507
#define vec_cmpgt(_a, _b)       spu_cmpgt(_a, _b)
508
 
509
 
510
/* vec_cmple (vector compare less than or equal)
511
 * =========
512
 */
513
static inline vec_bint4 vec_cmple(vec_float4 a, vec_float4 b)
514
{
515
  return (spu_xor(spu_cmpgt(a, b), -1));
516
}
517
 
518
 
519
/* vec_cmplt (vector compare less than)
520
 * =========
521
 */
522
#define vec_cmplt(_a, _b)       spu_cmpgt(_b, _a)
523
 
524
 
525
/* vec_ctf (vector convert from fixed-point word)
526
 * =======
527
 */
528
#define vec_ctf(_a, _b)         spu_convtf(_a, _b)
529
 
530
 
531
/* vec_cts (vector convert to signed fixed-point word saturate)
532
 * =======
533
 */
534
#define vec_cts(_a, _b)         spu_convts(_a, _b)
535
 
536
 
537
/* vec_ctu (vector convert to unsigned fixed-point word saturate)
538
 * =======
539
 */
540
#define vec_ctu(_a, _b)         spu_convtu(_a, _b)
541
 
542
 
543
/* vec_dss (vector data stream stop)
544
 * =======
545
 */
546
#define vec_dss(_a)
547
 
548
 
549
/* vec_dssall (vector data stream stop all)
550
 * ==========
551
 */
552
#define vec_dssall()
553
 
554
 
555
/* vec_dst (vector data stream touch)
556
 * =======
557
 */
558
#define vec_dst(_a, _b, _c)
559
 
560
 
561
/* vec_dstst (vector data stream touch for store)
562
 * =========
563
 */
564
#define vec_dstst(_a, _b, _c)
565
 
566
 
567
/* vec_dststt (vector data stream touch for store transient)
568
 * ==========
569
 */
570
#define vec_dststt(_a, _b, _c)
571
 
572
 
573
/* vec_dstt (vector data stream touch transient)
574
 * ========
575
 */
576
#define vec_dstt(_a, _b, _c)
577
 
578
 
579
/* vec_expte (vector is 2 raised tp the exponent estimate floating-point)
580
 * =========
581
 */
582
static inline vec_float4 vec_expte(vec_float4 a)
583
{
584
  vec_float4 bias, frac, exp;
585
  vec_int4 ia;
586
 
587
  bias = (vec_float4)(spu_andc(spu_splats((signed int)0x3F7FFFFF), spu_rlmaska((vec_int4)(a), -31)));
588
  ia   = spu_convts(spu_add(a, bias), 0);
589
  frac = spu_sub(spu_convtf(ia, 0), a);
590
  exp  = (vec_float4)(spu_sl(spu_add(ia, 127), 23));
591
 
592
  return (spu_mul(spu_madd(spu_madd(spu_splats(0.17157287f), frac, spu_splats(-0.67157287f)),
593
                           frac, spu_splats(1.0f)), exp));
594
}
595
 
596
 
597
/* vec_floor (vector floor)
598
 * =========
599
 */
600
static inline vec_float4 vec_floor(vec_float4 a)
601
{
602
  vec_int4  exp;
603
  vec_uint4 mask;
604
 
605
  a = spu_sub(a, (vec_float4)(spu_and(spu_rlmaska((vec_int4)a, -31), spu_splats((signed int)0x3F7FFFFF))));
606
  exp = spu_sub(127, (vec_int4)(spu_and(spu_rlmask((vec_uint4)(a), -23), 0xFF)));
607
  mask = spu_rlmask(spu_splats((unsigned int)0x7FFFFF), exp);
608
  mask = spu_sel(spu_splats((unsigned int)0), mask, spu_cmpgt(exp, -31));
609
  mask = spu_or(mask, spu_xor((vec_uint4)(spu_rlmaska(spu_add(exp, -1), -31)), -1));
610
 
611
  return ((vec_float4)(spu_andc((vec_uint4)(a), mask)));
612
}
613
 
614
 
615
/* vec_ld (vector load indexed)
616
 * ======
617
 */
618
static inline vec_uchar16 vec_ld(int a, unsigned char *b)
619
{
620
  return (*((vec_uchar16 *)(b+a)));
621
}
622
 
623
static inline vec_uchar16 vec_ld(int a, vec_uchar16 *b)
624
{
625
  return (*((vec_uchar16 *)((unsigned char *)(b)+a)));
626
}
627
 
628
static inline vec_char16 vec_ld(int a, signed char *b)
629
{
630
  return (*((vec_char16 *)(b+a)));
631
}
632
 
633
static inline vec_char16 vec_ld(int a, vec_char16 *b)
634
{
635
  return (*((vec_char16 *)((signed char *)(b)+a)));
636
}
637
 
638
static inline vec_ushort8 vec_ld(int a, unsigned short *b)
639
{
640
  return (*((vec_ushort8 *)((unsigned char *)(b)+a)));
641
}
642
 
643
static inline vec_ushort8 vec_ld(int a, vec_ushort8 *b)
644
{
645
  return (*((vec_ushort8 *)((unsigned char *)(b)+a)));
646
}
647
 
648
static inline vec_short8 vec_ld(int a, signed short *b)
649
{
650
  return (*((vec_short8 *)((unsigned char *)(b)+a)));
651
}
652
 
653
static inline vec_short8 vec_ld(int a, vec_short8 *b)
654
{
655
  return (*((vec_short8 *)((signed char *)(b)+a)));
656
}
657
 
658
static inline vec_uint4 vec_ld(int a, unsigned int *b)
659
{
660
  return (*((vec_uint4 *)((unsigned char *)(b)+a)));
661
}
662
 
663
static inline vec_uint4 vec_ld(int a, vec_uint4 *b)
664
{
665
  return (*((vec_uint4 *)((unsigned char *)(b)+a)));
666
}
667
 
668
static inline vec_int4 vec_ld(int a, signed int *b)
669
{
670
  return (*((vec_int4 *)((unsigned char *)(b)+a)));
671
}
672
 
673
static inline vec_int4 vec_ld(int a, vec_int4 *b)
674
{
675
  return (*((vec_int4 *)((signed char *)(b)+a)));
676
}
677
 
678
static inline vec_float4 vec_ld(int a, float *b)
679
{
680
  return (*((vec_float4 *)((unsigned char *)(b)+a)));
681
}
682
 
683
static inline vec_float4 vec_ld(int a, vec_float4 *b)
684
{
685
  return (*((vec_float4 *)((unsigned char *)(b)+a)));
686
}
687
 
688
/* vec_lde (vector load element indexed)
689
 * =======
690
 */
691
static inline vec_uchar16 vec_lde(int a, unsigned char *b)
692
{
693
  return (*((vec_uchar16 *)(b+a)));
694
}
695
 
696
static inline vec_char16 vec_lde(int a, signed char *b)
697
{
698
  return (*((vec_char16 *)(b+a)));
699
}
700
 
701
static inline vec_ushort8 vec_lde(int a, unsigned short *b)
702
{
703
  return (*((vec_ushort8 *)((unsigned char *)(b)+a)));
704
}
705
 
706
static inline vec_short8 vec_lde(int a, signed short *b)
707
{
708
  return (*((vec_short8 *)((unsigned char *)(b)+a)));
709
}
710
 
711
 
712
static inline vec_uint4 vec_lde(int a, unsigned int *b)
713
{
714
  return (*((vec_uint4 *)((unsigned char *)(b)+a)));
715
}
716
 
717
static inline vec_int4 vec_lde(int a, signed int *b)
718
{
719
  return (*((vec_int4 *)((unsigned char *)(b)+a)));
720
}
721
 
722
 
723
static inline vec_float4 vec_lde(int a, float *b)
724
{
725
  return (*((vec_float4 *)((unsigned char *)(b)+a)));
726
}
727
 
728
/* vec_ldl (vector load indexed LRU)
729
 * =======
730
 */
731
#define vec_ldl(_a, _b)         vec_ld(_a, _b)
732
 
733
 
734
/* vec_loge (vector log2 estimate floating-point)
735
 * ========
736
 */
737
static inline vec_float4 vec_loge(vec_float4 a)
738
{
739
  vec_int4 exp;
740
  vec_float4 frac;
741
 
742
  exp  = spu_add((vec_int4)(spu_and(spu_rlmask((vec_uint4)(a), -23), 0xFF)), -127);
743
  frac = (vec_float4)(spu_sub((vec_int4)(a), spu_sl(exp, 23)));
744
 
745
  return (spu_madd(spu_madd(spu_splats(-0.33985f), frac, spu_splats(2.01955f)),
746
                   frac, spu_sub(spu_convtf(exp, 0), spu_splats(1.6797f))));
747
}
748
 
749
 
750
/* vec_lvsl (vector load for shift left)
751
 * ========
752
 */
753
static inline vec_uchar16 vec_lvsl(int a, unsigned char *b)
754
{
755
  return ((vec_uchar16)spu_add((vec_ushort8)(spu_splats((unsigned char)((a + (int)(b)) & 0xF))),
756
                               ((vec_ushort8){0x0001, 0x0203, 0x0405, 0x0607,
757
                                              0x0809, 0x0A0B, 0x0C0D, 0x0E0F})));
758
}
759
 
760
static inline vec_uchar16 vec_lvsl(int a, signed char *b)
761
{
762
  return (vec_lvsl(a, (unsigned char *)b));
763
}
764
 
765
static inline vec_uchar16 vec_lvsl(int a, unsigned short *b)
766
{
767
  return (vec_lvsl(a, (unsigned char *)b));
768
}
769
 
770
static inline vec_uchar16 vec_lvsl(int a, short *b)
771
{
772
  return (vec_lvsl(a, (unsigned char *)b));
773
}
774
 
775
static inline vec_uchar16 vec_lvsl(int a, unsigned int *b)
776
{
777
  return (vec_lvsl(a, (unsigned char *)b));
778
}
779
 
780
static inline vec_uchar16 vec_lvsl(int a, int *b)
781
{
782
  return (vec_lvsl(a, (unsigned char *)b));
783
}
784
 
785
static inline vec_uchar16 vec_lvsl(int a, float *b)
786
{
787
  return (vec_lvsl(a, (unsigned char *)b));
788
}
789
 
790
 
791
/* vec_lvsr (vector load for shift right)
792
 * ========
793
 */
794
static  inline vec_uchar16 vec_lvsr(int a, unsigned char *b)
795
{
796
  return ((vec_uchar16)(spu_sub(((vec_ushort8){0x1011, 0x1213, 0x1415, 0x1617,
797
                                               0x1819, 0x1A1B, 0x1C1D, 0x1E1F}),
798
                                (vec_ushort8)(spu_splats((unsigned char)((a + (int)(b)) & 0xF))))));
799
}
800
 
801
static inline vec_uchar16 vec_lvsr(int a, signed char *b)
802
{
803
  return (vec_lvsr(a, (unsigned char *)b));
804
}
805
 
806
static inline vec_uchar16 vec_lvsr(int a, unsigned short *b)
807
{
808
  return (vec_lvsr(a, (unsigned char *)b));
809
}
810
 
811
static inline vec_uchar16 vec_lvsr(int a, short *b)
812
{
813
  return (vec_lvsr(a, (unsigned char *)b));
814
}
815
 
816
static inline vec_uchar16 vec_lvsr(int a, unsigned int *b)
817
{
818
  return (vec_lvsr(a, (unsigned char *)b));
819
}
820
 
821
static inline vec_uchar16 vec_lvsr(int a, int *b)
822
{
823
  return (vec_lvsr(a, (unsigned char *)b));
824
}
825
 
826
static inline vec_uchar16 vec_lvsr(int a, float *b)
827
{
828
  return (vec_lvsr(a, (unsigned char *)b));
829
}
830
 
831
/* vec_madd (vector multiply add)
832
 * ========
833
 */
834
#define vec_madd(_a, _b, _c)    spu_madd(_a, _b, _c)
835
 
836
 
837
 
838
/* vec_madds (vector multiply add saturate)
839
 * =========
840
 */
841
static inline vec_short8 vec_madds(vec_short8 a, vec_short8 b, vec_short8 c)
842
{
843
  return (vec_adds(c, spu_sel((vec_short8)(spu_sl(spu_mule(a, b), 1)),
844
                              (vec_short8)(spu_rlmask(spu_mulo(a, b), -15)),
845
                              ((vec_ushort8){0, 0xFFFF, 0, 0xFFFF, 0, 0xFFFF, 0, 0xFFFF}))));
846
}
847
 
848
/* vec_max (vector maximum)
849
 * =======
850
 */
851
static inline vec_uchar16 vec_max(vec_uchar16 a, vec_uchar16 b)
852
{
853
  return (spu_sel(b, a, spu_cmpgt(a, b)));
854
}
855
 
856
static inline vec_char16 vec_max(vec_char16 a, vec_char16 b)
857
{
858
  return (spu_sel(b, a, spu_cmpgt(a, b)));
859
}
860
 
861
static inline vec_char16 vec_max(vec_bchar16 a, vec_char16 b)
862
{
863
  return (spu_sel(b, (vec_char16)(a), spu_cmpgt((vec_char16)(a), b)));
864
}
865
 
866
static inline vec_char16 vec_max(vec_char16 a, vec_bchar16 b)
867
{
868
  return (spu_sel((vec_char16)(b), a, spu_cmpgt(a, (vec_char16)(b))));
869
}
870
 
871
static inline vec_ushort8 vec_max(vec_ushort8 a, vec_ushort8 b)
872
{
873
  return (spu_sel(b, a, spu_cmpgt(a, b)));
874
}
875
 
876
static inline vec_short8 vec_max(vec_short8 a, vec_short8 b)
877
{
878
  return (spu_sel(b, a, spu_cmpgt(a, b)));
879
}
880
 
881
static inline vec_short8 vec_max(vec_bshort8 a, vec_short8 b)
882
{
883
  return (spu_sel(b, (vec_short8)(a), spu_cmpgt((vec_short8)(a), b)));
884
}
885
 
886
static inline vec_short8 vec_max(vec_short8 a, vec_bshort8 b)
887
{
888
  return (spu_sel((vec_short8)(b), a, spu_cmpgt(a, (vec_short8)(b))));
889
}
890
 
891
static inline vec_uint4 vec_max(vec_uint4 a, vec_uint4 b)
892
{
893
  return (spu_sel(b, a, spu_cmpgt(a, b)));
894
}
895
 
896
static inline vec_int4 vec_max(vec_int4 a, vec_int4 b)
897
{
898
  return (spu_sel(b, a, spu_cmpgt(a, b)));
899
}
900
 
901
static inline vec_int4 vec_max(vec_bint4 a, vec_int4 b)
902
{
903
  return (spu_sel(b, (vec_int4)(a), spu_cmpgt((vec_int4)(a), b)));
904
}
905
 
906
static inline vec_int4 vec_max(vec_int4 a, vec_bint4 b)
907
{
908
  return (spu_sel((vec_int4)(b), a, spu_cmpgt(a, (vec_int4)(b))));
909
}
910
 
911
static inline vec_float4 vec_max(vec_float4 a, vec_float4 b)
912
{
913
  return (spu_sel(b, a, spu_cmpgt(a, b)));
914
}
915
 
916
 
917
/* vec_mergeh (vector merge high)
918
 * ==========
919
 */
920
static inline vec_uchar16 vec_mergeh(vec_uchar16 a, vec_uchar16 b)
921
{
922
  return (spu_shuffle(a, b, ((vec_uchar16){0, 16, 1, 17, 2, 18, 3, 19,
923
                                           4, 20, 5, 21, 6, 22, 7, 23})));
924
}
925
 
926
static inline vec_char16 vec_mergeh(vec_char16 a, vec_char16 b)
927
{
928
  return (spu_shuffle(a, b, ((vec_uchar16){0, 16, 1, 17, 2, 18, 3, 19,
929
                                           4, 20, 5, 21, 6, 22, 7, 23})));
930
}
931
 
932
static inline vec_ushort8 vec_mergeh(vec_ushort8 a, vec_ushort8 b)
933
{
934
  return (spu_shuffle(a, b, ((vec_uchar16){0, 1, 16, 17, 2, 3, 18, 19,
935
                                           4, 5, 20, 21, 6, 7, 22, 23})));
936
}
937
 
938
static inline vec_short8 vec_mergeh(vec_short8 a, vec_short8 b)
939
{
940
  return (spu_shuffle(a, b, ((vec_uchar16){0, 1, 16, 17, 2, 3, 18, 19,
941
                                           4, 5, 20, 21, 6, 7, 22, 23})));
942
}
943
 
944
static inline vec_uint4 vec_mergeh(vec_uint4 a, vec_uint4 b)
945
{
946
  return (spu_shuffle(a, b, ((vec_uchar16){0, 1, 2, 3, 16, 17, 18, 19,
947
                                           4, 5, 6, 7, 20, 21, 22, 23})));
948
}
949
 
950
static inline vec_int4 vec_mergeh(vec_int4 a, vec_int4 b)
951
{
952
  return (spu_shuffle(a, b, ((vec_uchar16){0, 1, 2, 3, 16, 17, 18, 19,
953
                                           4, 5, 6, 7, 20, 21, 22, 23})));
954
}
955
 
956
static inline vec_float4 vec_mergeh(vec_float4 a, vec_float4 b)
957
{
958
  return (spu_shuffle(a, b, ((vec_uchar16){0, 1, 2, 3, 16, 17, 18, 19,
959
                                           4, 5, 6, 7, 20, 21, 22, 23})));
960
}
961
 
962
/* vec_mergel (vector merge low)
963
 * ==========
964
 */
965
static inline vec_uchar16 vec_mergel(vec_uchar16 a, vec_uchar16 b)
966
{
967
  return (spu_shuffle(a, b, ((vec_uchar16){ 8, 24,  9, 25, 10, 26, 11, 27,
968
                                           12, 28, 13, 29, 14, 30, 15, 31})));
969
}
970
 
971
static inline vec_char16 vec_mergel(vec_char16 a, vec_char16 b)
972
{
973
  return (spu_shuffle(a, b, ((vec_uchar16){ 8, 24,  9, 25, 10, 26, 11, 27,
974
                                           12, 28, 13, 29, 14, 30, 15, 31})));
975
}
976
 
977
static inline vec_ushort8 vec_mergel(vec_ushort8 a, vec_ushort8 b)
978
{
979
  return (spu_shuffle(a, b, ((vec_uchar16){ 8,  9, 24, 25, 10, 11, 26, 27,
980
                                           12, 13, 28, 29, 14, 15, 30, 31})));
981
}
982
 
983
static inline vec_short8 vec_mergel(vec_short8 a, vec_short8 b)
984
{
985
  return (spu_shuffle(a, b, ((vec_uchar16){ 8,  9, 24, 25, 10, 11, 26, 27,
986
                                           12, 13, 28, 29, 14, 15, 30, 31})));
987
}
988
 
989
static inline vec_uint4 vec_mergel(vec_uint4 a, vec_uint4 b)
990
{
991
  return (spu_shuffle(a, b, ((vec_uchar16){ 8,  9, 10, 11, 24, 25, 26, 27,
992
                                           12, 13, 14, 15, 28, 29, 30, 31})));
993
}
994
 
995
static inline vec_int4 vec_mergel(vec_int4 a, vec_int4 b)
996
{
997
  return (spu_shuffle(a, b, ((vec_uchar16){ 8,  9, 10, 11, 24, 25, 26, 27,
998
                                           12, 13, 14, 15, 28, 29, 30, 31})));
999
}
1000
 
1001
static inline vec_float4 vec_mergel(vec_float4 a, vec_float4 b)
1002
{
1003
  return (spu_shuffle(a, b, ((vec_uchar16){ 8,  9, 10, 11, 24, 25, 26, 27,
1004
                                           12, 13, 14, 15, 28, 29, 30, 31})));
1005
}
1006
 
1007
/* vec_mfvscr (vector move from vector status and control register)
1008
 * ==========
1009
 */
1010
static inline vec_ushort8 vec_mfvscr()
1011
{
1012
  return ((vec_ushort8)spu_splats(0));           /* not supported */
1013
}
1014
 
1015
 
1016
/* vec_min (vector minimum)
1017
 * =======
1018
 */
1019
static inline vec_uchar16 vec_min(vec_uchar16 a, vec_uchar16 b)
1020
{
1021
  return (spu_sel(a, b, spu_cmpgt(a, b)));
1022
}
1023
 
1024
static inline vec_char16 vec_min(vec_char16 a, vec_char16 b)
1025
{
1026
  return (spu_sel(a, b, spu_cmpgt(a, b)));
1027
}
1028
 
1029
static inline vec_char16 vec_min(vec_bchar16 a, vec_char16 b)
1030
{
1031
  return (spu_sel((vec_char16)(a), b, spu_cmpgt((vec_char16)(a), b)));
1032
}
1033
 
1034
static inline vec_char16 vec_min(vec_char16 a, vec_bchar16 b)
1035
{
1036
  return (spu_sel(a, (vec_char16)(b), spu_cmpgt(a, (vec_char16)(b))));
1037
}
1038
 
1039
static inline vec_ushort8 vec_min(vec_ushort8 a, vec_ushort8 b)
1040
{
1041
  return (spu_sel(a, b, spu_cmpgt(a, b)));
1042
}
1043
 
1044
static inline vec_short8 vec_min(vec_short8 a, vec_short8 b)
1045
{
1046
  return (spu_sel(a, b, spu_cmpgt(a, b)));
1047
}
1048
 
1049
static inline vec_short8 vec_min(vec_bshort8 a, vec_short8 b)
1050
{
1051
  return (spu_sel((vec_short8)(a), b, spu_cmpgt((vec_short8)(a), b)));
1052
}
1053
 
1054
static inline vec_short8 vec_min(vec_short8 a, vec_bshort8 b)
1055
{
1056
  return (spu_sel(a, (vec_short8)(b), spu_cmpgt(a, (vec_short8)(b))));
1057
}
1058
 
1059
static inline vec_uint4 vec_min(vec_uint4 a, vec_uint4 b)
1060
{
1061
  return (spu_sel(a, b, spu_cmpgt(a, b)));
1062
}
1063
 
1064
static inline vec_int4 vec_min(vec_int4 a, vec_int4 b)
1065
{
1066
  return (spu_sel(a, b, spu_cmpgt(a, b)));
1067
}
1068
 
1069
static inline vec_int4 vec_min(vec_bint4 a, vec_int4 b)
1070
{
1071
  return (spu_sel((vec_int4)(a), b, spu_cmpgt((vec_int4)(a), b)));
1072
}
1073
 
1074
static inline vec_int4 vec_min(vec_int4 a, vec_bint4 b)
1075
{
1076
  return (spu_sel(a, (vec_int4)(b), spu_cmpgt(a, (vec_int4)(b))));
1077
}
1078
 
1079
static inline vec_float4 vec_min(vec_float4 a, vec_float4 b)
1080
{
1081
  return (spu_sel(a, b, spu_cmpgt(a, b)));
1082
}
1083
 
1084
/* vec_mladd (vector multiply low and add unsigned half word)
1085
 * =========
1086
 */
1087
static inline vec_short8 vec_mladd(vec_short8 a, vec_short8 b, vec_short8 c)
1088
{
1089
  return ((vec_short8)(spu_shuffle(spu_madd((vec_short8)(spu_rl((vec_uint4)(a), -16)),
1090
                                            (vec_short8)(spu_rl((vec_uint4)(b), -16)),
1091
                                            (vec_int4)(spu_rl((vec_uint4)(c), -16))),
1092
                                   spu_madd(a, b, spu_extend(c)),
1093
                                   ((vec_uchar16){ 2,  3, 18, 19,  6,  7, 22, 23,
1094
                                                  10, 11, 26, 27, 14, 15, 30, 31}))));
1095
}
1096
 
1097
 
1098
static inline vec_ushort8 vec_mladd(vec_ushort8 a, vec_ushort8 b, vec_ushort8 c)
1099
{
1100
  return ((vec_ushort8)(vec_mladd((vec_short8)(a), (vec_short8)(b), (vec_short8)(c))));
1101
}
1102
 
1103
static inline vec_short8 vec_mladd(vec_ushort8 a, vec_short8 b, vec_short8 c)
1104
{
1105
  return (vec_mladd((vec_short8)(a), b, c));
1106
}
1107
 
1108
static inline vec_short8 vec_mladd(vec_short8 a, vec_ushort8 b, vec_ushort8 c)
1109
{
1110
  return (vec_mladd(a, (vec_short8)(b), (vec_short8)(c)));
1111
}
1112
 
1113
 
1114
/* vec_mradds (vector multiply round and add saturate)
1115
 * ==========
1116
 */
1117
static inline vec_short8 vec_mradds(vec_short8 a, vec_short8 b, vec_short8 c)
1118
{
1119
  vec_int4 round = (vec_int4)spu_splats(0x4000);
1120
  vec_short8 hi, lo;
1121
 
1122
  hi = (vec_short8)(spu_sl(spu_add(spu_mule(a, b), round), 1));
1123
  lo = (vec_short8)(spu_rlmask(spu_add(spu_mulo(a, b), round), -15));
1124
 
1125
  return (vec_adds(spu_sel(hi, lo, ((vec_ushort8){0, 0xFFFF, 0, 0xFFFF, 0, 0xFFFF, 0, 0xFFFF})), c));
1126
}
1127
 
1128
 
1129
/* vec_msum (vector multiply sum)
1130
 * ========
1131
 */
1132
static inline vec_uint4 vec_msum(vec_uchar16 a, vec_uchar16 b, vec_uint4 c)
1133
{
1134
  vec_ushort8 a1, a2, b1, b2;
1135
  vec_uint4 p1, p2;
1136
 
1137
  a1 = spu_and((vec_ushort8)(a), 0xFF);
1138
  a2 = spu_rlmask((vec_ushort8)(a), -8);
1139
  b1 = spu_and((vec_ushort8)(b), 0xFF);
1140
  b2 = spu_rlmask((vec_ushort8)(b), -8);
1141
 
1142
  p1 = spu_add(spu_mulo(a1, b1), spu_mulo(spu_rlqwbyte(a1, -2), spu_rlqwbyte(b1, -2)));
1143
  p2 = spu_add(spu_mulo(a2, b2), spu_mulo(spu_rlqwbyte(a2, -2), spu_rlqwbyte(b2, -2)));
1144
  return (spu_add(p2, spu_add(p1, c)));
1145
}
1146
 
1147
static inline vec_int4 vec_msum(vec_char16 a, vec_uchar16 b, vec_int4 c)
1148
{
1149
  vec_short8 a1, a2, b1, b2;
1150
  vec_int4 p1, p2;
1151
 
1152
  a1 = (vec_short8)(spu_extend(a));
1153
  a2 = spu_rlmaska((vec_short8)(a), -8);
1154
  b1 = (vec_short8)(spu_and((vec_ushort8)(b), 0xFF));
1155
  b2 = (vec_short8)spu_rlmask((vec_ushort8)(b), -8);
1156
 
1157
  p1 = spu_add(spu_mulo(a1, b1), spu_mulo(spu_rlqwbyte(a1, -2), spu_rlqwbyte(b1, -2)));
1158
  p2 = spu_add(spu_mulo(a2, b2), spu_mulo(spu_rlqwbyte(a2, -2), spu_rlqwbyte(b2, -2)));
1159
  return (spu_add(p2, spu_add(p1, c)));
1160
}
1161
 
1162
static inline vec_uint4 vec_msum(vec_ushort8 a, vec_ushort8 b, vec_uint4 c)
1163
{
1164
  return (spu_add(spu_add(spu_mulo(a, b), spu_mulo(spu_rlqwbyte(a, -2), spu_rlqwbyte(b, -2))), c));
1165
}
1166
 
1167
static inline vec_int4 vec_msum(vec_short8 a, vec_short8 b, vec_int4 c)
1168
{
1169
  return (spu_add(spu_add(spu_mulo(a, b), spu_mulo(spu_rlqwbyte(a, -2), spu_rlqwbyte(b, -2))), c));
1170
}
1171
 
1172
 
1173
/* vec_msums (vector multiply sum saturate)
1174
 * ========
1175
 */
1176
static inline vec_uint4 vec_msums(vec_ushort8 a, vec_ushort8 b, vec_uint4 c)
1177
{
1178
  vec_uint4 p1, p2;
1179
 
1180
  p1 = spu_mulo(a, b);
1181
  p2 = spu_mulo(spu_rlqwbyte(a, -2), spu_rlqwbyte(b, -2));
1182
 
1183
  return (vec_adds(p2, vec_adds(p1, c)));
1184
}
1185
 
1186
static inline vec_int4 vec_msums(vec_short8 a, vec_short8 b, vec_int4 c)
1187
{
1188
  return (vec_adds(spu_add(spu_mulo(a, b), spu_mulo(spu_rlqwbyte(a, -2), spu_rlqwbyte(b, -2))), c));
1189
}
1190
 
1191
/* vec_mtvscr (vector move to vector status and control register)
1192
 * ==========
1193
 */
1194
#define vec_mtvscr(_a)          /* not supported */
1195
 
1196
 
1197
/* vec_mule (vector multiply even)
1198
 * ========
1199
 */
1200
static inline vec_ushort8 vec_mule(vec_uchar16 a, vec_uchar16 b)
1201
{
1202
  vec_ushort8 hi, lo;
1203
 
1204
  hi = (vec_ushort8)spu_mulo((vec_ushort8)(spu_rlmask((vec_uint4)(a), -24)),
1205
                             (vec_ushort8)(spu_rlmask((vec_uint4)(b), -24)));
1206
  lo = (vec_ushort8)spu_mulo((vec_ushort8)(spu_rlmask((vec_short8)(a), -8)),
1207
                             (vec_ushort8)(spu_rlmask((vec_short8)(b), -8)));
1208
 
1209
  return (spu_shuffle(hi, lo, ((vec_uchar16){ 2,  3, 18, 19,  6,  7, 22, 23,
1210
                                             10, 11, 26, 27, 14, 15, 30, 31})));
1211
}
1212
 
1213
static inline vec_short8 vec_mule(vec_char16 a, vec_char16 b)
1214
{
1215
  vec_short8 hi, lo;
1216
 
1217
  hi = (vec_short8)spu_mulo((vec_short8)(spu_rlmaska((vec_uint4)(a), -24)),
1218
                            (vec_short8)(spu_rlmaska((vec_uint4)(b), -24)));
1219
  lo = (vec_short8)spu_mulo((vec_short8)(spu_rlmaska((vec_short8)(a), -8)),
1220
                            (vec_short8)(spu_rlmaska((vec_short8)(b), -8)));
1221
 
1222
  return (spu_shuffle(hi, lo, ((vec_uchar16){ 2,  3, 18, 19,  6,  7, 22, 23,
1223
                                             10, 11, 26, 27, 14, 15, 30, 31})));
1224
}
1225
 
1226
static inline vec_uint4 vec_mule(vec_ushort8 a, vec_ushort8 b)
1227
{
1228
 return (spu_mulo((vec_ushort8)spu_rlmask((vec_uint4)(a), -16),
1229
                  (vec_ushort8)spu_rlmask((vec_uint4)(b), -16)));
1230
}
1231
 
1232
 
1233
static inline vec_int4 vec_mule(vec_short8 a, vec_short8 b)
1234
{
1235
 return (spu_mulo((vec_short8)spu_rlmaska((vec_int4)(a), -16),
1236
                  (vec_short8)spu_rlmaska((vec_int4)(b), -16)));
1237
}
1238
 
1239
 
1240
/* vec_mulo (vector multiply odd)
1241
 * ========
1242
 */
1243
static inline vec_ushort8 vec_mulo(vec_uchar16 a, vec_uchar16 b)
1244
{
1245
  vec_ushort8 hi, lo;
1246
 
1247
  hi = (vec_ushort8)spu_mulo((vec_ushort8)(spu_and(spu_rlmask((vec_uint4)(a), -16), 0xFF)),
1248
                             (vec_ushort8)(spu_and(spu_rlmask((vec_uint4)(b), -16), 0xFF)));
1249
  lo = (vec_ushort8)spu_mulo(spu_and((vec_ushort8)(a), 0xFF), spu_and((vec_ushort8)(b), 0xFF));
1250
 
1251
  return (spu_shuffle(hi, lo, ((vec_uchar16){ 2,  3, 18, 19,  6,  7, 22, 23,
1252
                                             10, 11, 26, 27, 14, 15, 30, 31})));
1253
}
1254
 
1255
static inline vec_short8 vec_mulo(vec_char16 a, vec_char16 b)
1256
{
1257
  vec_short8 aa, bb, hi, lo;
1258
 
1259
  aa = spu_extend(a);
1260
  bb = spu_extend(b);
1261
 
1262
  hi = (vec_short8)spu_mulo((vec_short8)(spu_rlmaska((vec_uint4)(aa), -16)),
1263
                (vec_short8)(spu_rlmaska((vec_uint4)(bb), -16)));
1264
  lo = (vec_short8)spu_mulo(aa, bb);
1265
  return (spu_shuffle(hi, lo, ((vec_uchar16){ 2,  3, 18, 19,  6,  7, 22, 23,
1266
                                             10, 11, 26, 27, 14, 15, 30, 31})));
1267
}
1268
 
1269
static inline vec_uint4 vec_mulo(vec_ushort8 a, vec_ushort8 b)
1270
{
1271
  return (spu_mulo(a, b));
1272
}
1273
 
1274
 
1275
static inline vec_int4 vec_mulo(vec_short8 a, vec_short8 b)
1276
{
1277
  return (spu_mulo(a, b));
1278
}
1279
 
1280
 
1281
/* vec_nmsub (vector negative multiply subtract)
1282
 * =========
1283
 */
1284
#define vec_nmsub(_a, _b, _c)   spu_nmsub(_a, _b, _c)
1285
 
1286
 
1287
/* vec_nor (vector logical nor)
1288
 * =======
1289
 */
1290
#define vec_nor(_a, _b)         spu_nor(_a, _b)
1291
 
1292
 
1293
/* vec_or (vector logical or)
1294
 * ======
1295
 */
1296
static inline vec_uchar16 vec_or(vec_uchar16 a, vec_uchar16 b)
1297
{
1298
  return (spu_or(a, b));
1299
}
1300
 
1301
static inline vec_char16 vec_or(vec_char16 a, vec_char16 b)
1302
{
1303
  return (spu_or(a, b));
1304
}
1305
 
1306
static inline vec_char16 vec_or(vec_bchar16 a, vec_char16 b)
1307
{
1308
  return (spu_or((vec_char16)(a), b));
1309
}
1310
 
1311
static inline vec_char16 vec_or(vec_char16 a, vec_bchar16 b)
1312
{
1313
  return (spu_or(a, (vec_char16)(b)));
1314
}
1315
 
1316
static inline vec_ushort8 vec_or(vec_ushort8 a, vec_ushort8 b)
1317
{
1318
  return (spu_or(a, b));
1319
}
1320
 
1321
static inline vec_short8 vec_or(vec_short8 a, vec_short8 b)
1322
{
1323
  return (spu_or(a, b));
1324
}
1325
 
1326
static inline vec_short8 vec_or(vec_bshort8 a, vec_short8 b)
1327
{
1328
  return (spu_or((vec_short8)(a), b));
1329
}
1330
 
1331
static inline vec_short8 vec_or(vec_short8 a, vec_bshort8 b)
1332
{
1333
  return (spu_or(a, (vec_short8)(b)));
1334
}
1335
 
1336
static inline vec_uint4 vec_or(vec_uint4 a, vec_uint4 b)
1337
{
1338
  return (spu_or(a, b));
1339
}
1340
 
1341
static inline vec_int4 vec_or(vec_int4 a, vec_int4 b)
1342
{
1343
  return (spu_or(a, b));
1344
}
1345
 
1346
static inline vec_int4 vec_or(vec_bint4 a, vec_int4 b)
1347
{
1348
  return (spu_or((vec_int4)(a), b));
1349
}
1350
 
1351
static inline vec_int4 vec_or(vec_int4 a, vec_bint4 b)
1352
{
1353
  return (spu_or(a, (vec_int4)(b)));
1354
}
1355
 
1356
static inline vec_float4 vec_or(vec_float4 a, vec_float4 b)
1357
{
1358
  return (spu_or(a, b));
1359
}
1360
 
1361
static inline vec_float4 vec_or(vec_bint4 a, vec_float4 b)
1362
{
1363
  return (spu_or((vec_float4)(a),b));
1364
}
1365
 
1366
static inline vec_float4 vec_or(vec_float4 a, vec_bint4 b)
1367
{
1368
  return (spu_or(a, (vec_float4)(b)));
1369
}
1370
 
1371
 
1372
/* vec_pack (vector pack)
1373
 * ========
1374
 */
1375
static inline vec_uchar16 vec_pack(vec_ushort8 a, vec_ushort8 b)
1376
{
1377
  return ((vec_uchar16)spu_shuffle(a, b, ((vec_uchar16){ 1,  3,  5,  7,  9, 11, 13, 15,
1378
                                                        17, 19, 21, 23, 25, 27, 29, 31})));
1379
}
1380
 
1381
static inline vec_char16 vec_pack(vec_short8 a, vec_short8 b)
1382
{
1383
  return ((vec_char16)spu_shuffle(a, b, ((vec_uchar16){ 1,  3,  5,  7,  9, 11, 13, 15,
1384
                                                       17, 19, 21, 23, 25, 27, 29, 31})));
1385
}
1386
 
1387
static inline vec_ushort8 vec_pack(vec_uint4 a, vec_uint4 b)
1388
{
1389
  return ((vec_ushort8)spu_shuffle(a, b, ((vec_uchar16){ 2,  3,  6,  7, 10, 11, 14, 15,
1390
                                                        18, 19, 22, 23, 26, 27, 30, 31})));
1391
}
1392
 
1393
static inline vec_short8 vec_pack(vec_int4 a, vec_int4 b)
1394
{
1395
  return ((vec_short8)spu_shuffle(a, b, ((vec_uchar16){ 2,  3,  6,  7, 10, 11, 14, 15,
1396
                                                       18, 19, 22, 23, 26, 27, 30, 31})));
1397
}
1398
 
1399
 
1400
/* vec_packpx (vector pack pixel)
1401
 * ==========
1402
 */
1403
static inline vec_pixel8 vec_packpx(vec_uint4 a, vec_uint4 b)
1404
{
1405
  vec_uint4 x03FF = (vec_uint4)(spu_splats((unsigned short)0x03FF));
1406
  vec_uint4 x001F = (vec_uint4)(spu_splats((unsigned short)0x001F));
1407
 
1408
  return ((vec_pixel8)(spu_shuffle(spu_sel(spu_sel(spu_sl(a, 7), spu_sl(a, 10), x03FF),
1409
                                           spu_sl(a, 13), x001F),
1410
                                   spu_sel(spu_sel(spu_sl(b, 7), spu_sl(b, 10), x03FF),
1411
                                           spu_sl(b, 13), x001F),
1412
                                   ((vec_uchar16){ 0,  1,  4,  5,   8,  9, 12, 13,
1413
                                                  16, 17, 20, 21, 24, 25, 28, 29}))));
1414
}
1415
 
1416
 
1417
/* vec_packs (vector pack saturate)
1418
 * =========
1419
 */
1420
static inline vec_uchar16 vec_packs(vec_ushort8 a, vec_ushort8 b)
1421
{
1422
  vec_ushort8 max = spu_splats((unsigned short)0x00FF);
1423
 
1424
  return ((vec_uchar16)(spu_shuffle(spu_sel(a, max, spu_cmpgt(a, 255)),
1425
                                    spu_sel(b, max, spu_cmpgt(b, 255)),
1426
                                    ((vec_uchar16){ 1,  3,  5,  7,  9, 11, 13, 15,
1427
                                                   17, 19, 21, 23, 25, 27, 29, 31}))));
1428
}
1429
 
1430
static inline vec_char16 vec_packs(vec_short8 a, vec_short8 b)
1431
{
1432
  vec_short8 max = spu_splats((signed short)0x007F);
1433
  vec_short8 min = spu_splats((signed short)0xFF80);
1434
 
1435
  return ((vec_char16)(spu_shuffle(spu_sel(min, spu_sel(a, max, spu_cmpgt(a, 127)), spu_cmpgt(a, -128)),
1436
                                    spu_sel(min, spu_sel(b, max, spu_cmpgt(b, 127)), spu_cmpgt(b, -128)),
1437
                                   ((vec_uchar16){ 1,  3,  5,  7,  9, 11, 13, 15,
1438
                                                  17, 19, 21, 23, 25, 27, 29, 31}))));
1439
}
1440
 
1441
static inline vec_ushort8 vec_packs(vec_uint4 a, vec_uint4 b)
1442
{
1443
  vec_uint4 max = spu_splats((unsigned int)0x0000FFFF);
1444
 
1445
  return ((vec_ushort8)(spu_shuffle(spu_sel(a, max, spu_cmpgt(a, max)),
1446
                                    spu_sel(b, max, spu_cmpgt(b, max)),
1447
                                    ((vec_uchar16){ 2,  3,  6,  7, 10, 11, 14, 15,
1448
                                                   18, 19, 22, 23, 26, 27, 30, 31}))));
1449
}
1450
 
1451
static inline vec_short8 vec_packs(vec_int4 a, vec_int4 b)
1452
{
1453
  vec_int4 max = spu_splats((signed int)0x00007FFF);
1454
  vec_int4 min = spu_splats((signed int)0xFFFF8000);
1455
 
1456
  return ((vec_short8)(spu_shuffle(spu_sel(min, spu_sel(a, max, spu_cmpgt(a, max)), spu_cmpgt(a, min)),
1457
                                   spu_sel(min, spu_sel(b, max, spu_cmpgt(b, max)), spu_cmpgt(b, min)),
1458
                                   ((vec_uchar16){ 2,  3,  6,  7, 10, 11, 14, 15,
1459
                                                  18, 19, 22, 23, 26, 27, 30, 31}))));
1460
}
1461
 
1462
 
1463
/* vec_packsu (vector pack saturate unsigned)
1464
 * ==========
1465
 */
1466
static inline vec_uchar16 vec_packsu(vec_ushort8 a, vec_ushort8 b)
1467
{
1468
  return ((vec_uchar16)spu_shuffle(spu_or(a, (vec_ushort8)(spu_cmpgt(a, 255))),
1469
                                   spu_or(b, (vec_ushort8)(spu_cmpgt(b, 255))),
1470
                                   ((vec_uchar16){ 1,  3,  5,  7,  9, 11, 13, 15,
1471
                                                  17, 19, 21, 23, 25, 27, 29, 31})));
1472
}
1473
 
1474
static inline vec_uchar16 vec_packsu(vec_short8 a, vec_short8 b)
1475
{
1476
  vec_short8 max = spu_splats((signed short)0x00FF);
1477
  vec_short8 min = spu_splats((signed short)0x0000);
1478
 
1479
  return ((vec_uchar16)(spu_shuffle(spu_sel(min, spu_sel(a, max, spu_cmpgt(a, 255)), spu_cmpgt(a, 0)),
1480
                                    spu_sel(min, spu_sel(b, max, spu_cmpgt(b, 255)), spu_cmpgt(b, 0)),
1481
                                    ((vec_uchar16){ 1,  3,  5,  7,  9, 11, 13, 15,
1482
                                                   17, 19, 21, 23, 25, 27, 29, 31}))));
1483
 
1484
  return (vec_packsu((vec_ushort8)(a), (vec_ushort8)(b)));
1485
}
1486
 
1487
static inline vec_ushort8 vec_packsu(vec_uint4 a, vec_uint4 b)
1488
{
1489
  vec_uint4 max = spu_splats((unsigned int)0xFFFF);
1490
 
1491
  return ((vec_ushort8)spu_shuffle(spu_or(a, (vec_uint4)(spu_cmpgt(a, max))),
1492
                                   spu_or(b, (vec_uint4)(spu_cmpgt(b, max))),
1493
                                   ((vec_uchar16){ 2,  3,  6,  7, 10, 11, 14, 15,
1494
                                                  18, 19, 22, 23, 26, 27, 30, 31})));
1495
}
1496
 
1497
static inline vec_ushort8 vec_packsu(vec_int4 a, vec_int4 b)
1498
{
1499
  vec_int4 max = spu_splats((signed int)0x0000FFFF);
1500
  vec_int4 min = spu_splats((signed int)0x00000000);
1501
 
1502
  return ((vec_ushort8)(spu_shuffle(spu_sel(min, spu_sel(a, max, spu_cmpgt(a, max)), spu_cmpgt(a, min)),
1503
                                    spu_sel(min, spu_sel(b, max, spu_cmpgt(b, max)), spu_cmpgt(b, min)),
1504
                                    ((vec_uchar16){ 2,  3,  6,  7, 10, 11, 14, 15,
1505
                                                   18, 19, 22, 23, 26, 27, 30, 31}))));
1506
}
1507
 
1508
 
1509
/* vec_perm (vector permute)
1510
 * ========
1511
 */
1512
static inline vec_uchar16 vec_perm(vec_uchar16 a, vec_uchar16 b, vec_uchar16 c)
1513
{
1514
  return (spu_shuffle(a, b, spu_and(c, 0x1F)));
1515
}
1516
 
1517
static inline vec_char16 vec_perm(vec_char16 a, vec_char16 b, vec_uchar16 c)
1518
{
1519
  return ((vec_char16)(vec_perm((vec_uchar16)(a), (vec_uchar16)(b), c)));
1520
}
1521
 
1522
static inline vec_ushort8 vec_perm(vec_ushort8 a, vec_ushort8 b, vec_uchar16 c)
1523
{
1524
  return ((vec_ushort8)(vec_perm((vec_uchar16)(a), (vec_uchar16)(b), c)));
1525
}
1526
 
1527
static inline vec_short8 vec_perm(vec_short8 a, vec_short8 b, vec_uchar16 c)
1528
{
1529
  return ((vec_short8)(vec_perm((vec_uchar16)(a), (vec_uchar16)(b), c)));
1530
}
1531
 
1532
static inline vec_uint4 vec_perm(vec_uint4 a, vec_uint4 b, vec_uchar16 c)
1533
{
1534
  return ((vec_uint4)(vec_perm((vec_uchar16)(a), (vec_uchar16)(b), c)));
1535
}
1536
 
1537
static inline vec_int4 vec_perm(vec_int4 a, vec_int4 b, vec_uchar16 c)
1538
{
1539
  return ((vec_int4)(vec_perm((vec_uchar16)(a), (vec_uchar16)(b), c)));
1540
}
1541
 
1542
static inline vec_float4 vec_perm(vec_float4 a, vec_float4 b, vec_uchar16 c)
1543
{
1544
  return ((vec_float4)(vec_perm((vec_uchar16)(a), (vec_uchar16)(b), c)));
1545
}
1546
 
1547
 
1548
/* vec_re (vector reciprocal estimate)
1549
 * ======
1550
 */
1551
#define vec_re(_a)      spu_re(_a)
1552
 
1553
 
1554
/* vec_rl (vector rotate left)
1555
 * ======
1556
 */
1557
static inline vec_uchar16 vec_rl(vec_uchar16 a, vec_uchar16 b)
1558
{
1559
  vec_ushort8 r1, r2;
1560
 
1561
  r1 = spu_rl(spu_and((vec_ushort8)(a), 0xFF), (vec_short8)spu_and((vec_ushort8)(b), 7));
1562
  r2 = spu_rl(spu_and((vec_ushort8)(a), -256), (vec_short8)spu_and(spu_rlmask((vec_ushort8)(b), -8), 7));
1563
  return ((vec_uchar16)(spu_sel(spu_or(r2, spu_sl(r2, 8)), spu_or(r1, spu_rlmask(r1, -8)), spu_splats((unsigned short)0xFF))));
1564
}
1565
 
1566
static inline vec_char16 vec_rl(vec_char16 a, vec_uchar16 b)
1567
{
1568
  return ((vec_char16)(vec_rl((vec_uchar16)(a), b)));
1569
}
1570
 
1571
static inline vec_ushort8 vec_rl(vec_ushort8 a, vec_ushort8 b)
1572
{
1573
  return (spu_rl(a, (vec_short8)(b)));
1574
}
1575
 
1576
static inline vec_short8 vec_rl(vec_short8 a, vec_ushort8 b)
1577
{
1578
  return (spu_rl(a, (vec_short8)(b)));
1579
}
1580
 
1581
static inline vec_uint4 vec_rl(vec_uint4 a, vec_uint4 b)
1582
{
1583
  return (spu_rl(a, (vec_int4)(b)));
1584
}
1585
 
1586
static inline vec_int4 vec_rl(vec_int4 a, vec_uint4 b)
1587
{
1588
  return (spu_rl(a, (vec_int4)(b)));
1589
}
1590
 
1591
 
1592
/* vec_round (vector round)
1593
 * =========
1594
 */
1595
static inline vec_float4 vec_round(vec_float4 a)
1596
{
1597
  vec_float4 s_half, s_one, d;
1598
  vec_uint4 odd;
1599
  vec_uint4 msb = spu_splats((unsigned int)0x80000000);
1600
  vec_float4 half = spu_splats(0.5f);
1601
  vec_int4 exp;
1602
  vec_uint4 mask;
1603
 
1604
  s_half = (vec_float4)(spu_sel((vec_uint4)(half), (vec_uint4)(a), msb));
1605
  a = spu_add(a, s_half);
1606
  s_one = spu_add(s_half, s_half);
1607
  exp  = spu_sub(127, (vec_int4)(spu_and(spu_rlmask((vec_uint4)(a), -23), 0xFF)));
1608
  mask = spu_rlmask(spu_splats((unsigned int)0x7FFFFF), exp);
1609
  mask = spu_sel(spu_splats((unsigned int)0), mask, spu_cmpgt(exp, -31));
1610
  mask = spu_or(mask, spu_xor((vec_uint4)(spu_rlmaska(spu_add(exp, -1), -31)), -1));
1611
 
1612
  odd = spu_and((vec_uint4)(spu_convts(a, 0)), 1);
1613
  s_one = spu_andc(s_one, (vec_float4)spu_cmpeq(mask, 0));
1614
  s_one = spu_and(s_one, spu_and((vec_float4)spu_cmpeq(spu_and((vec_uint4)(a), mask), 0),
1615
                                 (vec_float4)spu_cmpeq(odd, 1)));
1616
  d = spu_andc(a, (vec_float4)(mask));
1617
  d = spu_sub(d, s_one);
1618
  return (d);
1619
}
1620
 
1621
/* vec_rsqrte (vector reciprocal square root estimate)
1622
 * ==========
1623
 */
1624
#define vec_rsqrte(_a)  spu_rsqrte(_a)
1625
 
1626
 
1627
/* vec_sel (vector select)
1628
 * =======
1629
 */
1630
#define vec_sel(_a, _b, _c)     spu_sel(_a, _b, _c)
1631
 
1632
 
1633
/* vec_sl (vector shift left)
1634
 * ======
1635
 */
1636
static inline vec_uchar16 vec_sl(vec_uchar16 a, vec_uchar16 b)
1637
{
1638
  vec_ushort8 hi, lo;
1639
 
1640
  lo = spu_and(spu_sl((vec_ushort8)(a), spu_and((vec_ushort8)(b), 7)), 0xFF);
1641
  hi = spu_sl(spu_and((vec_ushort8)(a), -256), spu_and(spu_rlmask((vec_ushort8)(b), -8), 7));
1642
 
1643
  return ((vec_uchar16)(spu_or(hi, lo)));
1644
}
1645
 
1646
static inline vec_char16 vec_sl(vec_char16 a, vec_uchar16 b)
1647
{
1648
  return ((vec_char16)(vec_sl((vec_uchar16)(a), b)));
1649
}
1650
 
1651
static inline vec_ushort8 vec_sl(vec_ushort8 a, vec_ushort8 b)
1652
{
1653
  return (spu_sl(a, spu_and(b, 15)));
1654
}
1655
 
1656
static inline vec_short8 vec_sl(vec_short8 a, vec_ushort8 b)
1657
{
1658
  return (spu_sl(a, spu_and((vec_ushort8)(b), 15)));
1659
}
1660
 
1661
static inline vec_uint4 vec_sl(vec_uint4 a, vec_uint4 b)
1662
{
1663
  return (spu_sl(a, spu_and(b, 31)));
1664
}
1665
 
1666
static inline vec_int4 vec_sl(vec_int4 a, vec_uint4 b)
1667
{
1668
  return (spu_sl(a, spu_and(b, 31)));
1669
}
1670
 
1671
 
1672
/* vec_sld (vector shift left double)
1673
 * =======
1674
 */
1675
#define vec_sld(_a, _b, _c)     spu_shuffle(_a, _b, ((vec_uchar16){ 0+(_c),  1+(_c),  2+(_c),  3+(_c),  \
1676
                                                                    4+(_c),  5+(_c),  6+(_c),  7+(_c),  \
1677
                                                                    8+(_c),  9+(_c), 10+(_c), 11+(_c),  \
1678
                                                                   12+(_c), 13+(_c), 14+(_c), 15+(_c)}))
1679
 
1680
 
1681
/* vec_sll (vector shift left long)
1682
 * =======
1683
 */
1684
#define vec_sll(_a, _b)         spu_slqw(_a, spu_extract((vec_uint4)(_b), 0))
1685
 
1686
 
1687
/* vec_slo (vector shift left by octet)
1688
 * =======
1689
 */
1690
#define vec_slo(_a, _b)         spu_slqwbytebc(_a, spu_extract((vec_uint4)(_b), 3) & 0x7F)
1691
 
1692
 
1693
/* vec_splat (vector splat)
1694
 * =========
1695
 */
1696
#define vec_splat(_a, _b)       spu_splats(spu_extract(_a, _b))
1697
 
1698
 
1699
/* vec_splat_s8 (vector splat signed byte)
1700
 * ============
1701
 */
1702
#define vec_splat_s8(_a)        spu_splats((signed char)(_a))
1703
 
1704
 
1705
/* vec_splat_s16 (vector splat signed half-word)
1706
 * =============
1707
 */
1708
#define vec_splat_s16(_a)       spu_splats((signed short)(_a))
1709
 
1710
 
1711
/* vec_splat_s32 (vector splat signed word)
1712
 * =============
1713
 */
1714
#define vec_splat_s32(_a)       spu_splats((signed int)(_a))
1715
 
1716
 
1717
/* vec_splat_u8 (vector splat unsigned byte)
1718
 * ============
1719
 */
1720
#define vec_splat_u8(_a)        spu_splats((unsigned char)(_a))
1721
 
1722
 
1723
/* vec_splat_u16 (vector splat unsigned half-word)
1724
 * =============
1725
 */
1726
#define vec_splat_u16(_a)       spu_splats((unsigned short)(_a))
1727
 
1728
 
1729
/* vec_splat_u32 (vector splat unsigned word)
1730
 * =============
1731
 */
1732
#define vec_splat_u32(_a)       spu_splats((unsigned int)(_a))
1733
 
1734
 
1735
/* vec_sr (vector shift right)
1736
 * ======
1737
 */
1738
static inline vec_uchar16 vec_sr(vec_uchar16 a, vec_uchar16 b)
1739
{
1740
  vec_ushort8 hi, lo;
1741
 
1742
  lo = spu_rlmask(spu_and((vec_ushort8)(a), 0xFF), spu_sub(0, (vec_short8)(spu_and((vec_ushort8)(b), 7))));
1743
  hi = spu_and(spu_rlmask((vec_ushort8)(a), spu_sub(0, (vec_short8)(spu_and(spu_rlmask((vec_ushort8)(b), -8), 7)))), -256);
1744
 
1745
  return ((vec_uchar16)(spu_or(hi, lo)));
1746
}
1747
 
1748
static inline vec_char16 vec_sr(vec_char16 a, vec_uchar16 b)
1749
{
1750
  return ((vec_char16)(vec_sr((vec_uchar16)(a), b)));
1751
}
1752
 
1753
static inline vec_ushort8 vec_sr(vec_ushort8 a, vec_ushort8 b)
1754
{
1755
  return (spu_rlmask(a, spu_sub(0, (vec_short8)(spu_and(b, 15)))));
1756
}
1757
 
1758
static inline vec_short8 vec_sr(vec_short8 a, vec_ushort8 b)
1759
{
1760
  return ((vec_short8)(vec_sr((vec_ushort8)(a), b)));
1761
}
1762
 
1763
static inline vec_uint4 vec_sr(vec_uint4 a, vec_uint4 b)
1764
{
1765
  return (spu_rlmask(a, spu_sub(0, (vec_int4)(spu_and(b, 31)))));
1766
}
1767
 
1768
static inline vec_int4 vec_sr(vec_int4 a, vec_uint4 b)
1769
{
1770
  return ((vec_int4)(vec_sr((vec_uint4)(a), b)));
1771
}
1772
 
1773
 
1774
/* vec_sra (vector shift right algebraic)
1775
 * =======
1776
 */
1777
static inline vec_char16 vec_sra(vec_char16 a, vec_uchar16 b)
1778
{
1779
  vec_short8 hi, lo;
1780
 
1781
  lo = spu_and(spu_rlmaska(spu_extend(a), spu_sub(0, (vec_short8)(spu_and((vec_ushort8)(b), 7)))), 0xFF);
1782
  hi = spu_and(spu_rlmaska((vec_short8)(a), spu_sub(0, (vec_short8)(spu_and(spu_rlmask((vec_ushort8)(b), -8), 7)))), -256);
1783
 
1784
  return ((vec_char16)(spu_or(hi, lo)));
1785
}
1786
 
1787
static inline vec_uchar16 vec_sra(vec_uchar16 a, vec_uchar16 b)
1788
{
1789
  return ((vec_uchar16)(vec_sra((vec_char16)(a), b)));
1790
}
1791
 
1792
static inline vec_short8 vec_sra(vec_short8 a, vec_ushort8 b)
1793
{
1794
  return (spu_rlmaska(a, spu_sub(0, (vec_short8)(spu_and(b, 15)))));
1795
}
1796
 
1797
static inline vec_ushort8 vec_sra(vec_ushort8 a, vec_ushort8 b)
1798
{
1799
  return ((vec_ushort8)(vec_sra((vec_short8)(a), b)));
1800
}
1801
 
1802
static inline vec_int4 vec_sra(vec_int4 a, vec_uint4 b)
1803
{
1804
  return (spu_rlmaska(a, spu_sub(0, (vec_int4)(spu_and(b, 31)))));
1805
}
1806
 
1807
static inline vec_uint4 vec_sra(vec_uint4 a, vec_uint4 b)
1808
{
1809
  return ((vec_uint4)(vec_sra((vec_int4)(a), b)));
1810
}
1811
 
1812
 
1813
/* vec_srl (vector shift right long)
1814
 * =======
1815
 */
1816
#define vec_srl(_a, _b)         spu_rlmaskqw(_a, 0-spu_extract((vec_int4)(_b), 3))
1817
 
1818
 
1819
/* vec_sro (vector shift right by octet)
1820
 * =======
1821
 */
1822
#define vec_sro(_a, _b)         spu_rlmaskqwbyte(_a, 0 - ((spu_extract((vec_int4)(_b), 3) >> 3) & 0xF))
1823
 
1824
/* vec_st (vector store indexed)
1825
 * ======
1826
 */
1827
static inline void vec_st(vec_uchar16 a, int b, unsigned char *c)
1828
{
1829
  *((vec_uchar16 *)(c+b)) = a;
1830
}
1831
 
1832
static inline void vec_st(vec_uchar16 a, int b, vec_uchar16 *c)
1833
{
1834
  *((vec_uchar16 *)((unsigned char *)(c)+b)) = a;
1835
}
1836
 
1837
static inline void vec_st(vec_char16 a, int b, signed char *c)
1838
{
1839
  *((vec_char16 *)(c+b)) = a;
1840
}
1841
 
1842
static inline void vec_st(vec_char16 a, int b, vec_char16 *c)
1843
{
1844
  *((vec_char16 *)((signed char *)(c)+b)) = a;
1845
}
1846
 
1847
static inline void vec_st(vec_bchar16 a, int b, signed char *c)
1848
{
1849
  *((vec_bchar16 *)((signed char *)(c)+b)) = a;
1850
}
1851
 
1852
static inline void vec_st(vec_ushort8 a, int b, unsigned short *c)
1853
{
1854
  *((vec_ushort8 *)((unsigned char *)(c)+b)) = a;
1855
}
1856
 
1857
static inline void vec_st(vec_ushort8 a, int b, vec_ushort8 *c)
1858
{
1859
  *((vec_ushort8 *)((unsigned char *)(c)+b)) = a;
1860
}
1861
 
1862
static inline void vec_st(vec_short8 a, int b, signed short *c)
1863
{
1864
  *((vec_short8 *)((unsigned char *)(c)+b)) = a;
1865
}
1866
 
1867
static inline void vec_st(vec_short8 a, int b, vec_short8 *c)
1868
{
1869
  *((vec_short8 *)((signed char *)(c)+b)) = a;
1870
}
1871
 
1872
static inline void vec_st(vec_bshort8 a, int b, signed short *c)
1873
{
1874
  *((vec_bshort8 *)((signed char *)(c)+b)) = a;
1875
}
1876
 
1877
static inline void vec_st(vec_uint4 a, int b, unsigned int *c)
1878
{
1879
  *((vec_uint4 *)((unsigned char *)(c)+b)) = a;
1880
}
1881
 
1882
static inline void vec_st(vec_uint4 a, int b, vec_uint4 *c)
1883
{
1884
  *((vec_uint4 *)((unsigned char *)(c)+b)) = a;
1885
}
1886
 
1887
static inline void vec_st(vec_int4 a, int b, signed int *c)
1888
{
1889
  *((vec_int4 *)((unsigned char *)(c)+b)) = a;
1890
}
1891
 
1892
static inline void vec_st(vec_int4 a, int b, vec_int4 *c)
1893
{
1894
  *((vec_int4 *)((signed char *)(c)+b)) = a;
1895
}
1896
 
1897
static inline void vec_st(vec_bint4 a, int b, signed int *c)
1898
{
1899
  *((vec_bint4 *)((signed char *)(c)+b)) = a;
1900
}
1901
 
1902
static inline void vec_st(vec_float4 a, int b, float *c)
1903
{
1904
  *((vec_float4 *)((unsigned char *)(c)+b)) = a;
1905
}
1906
 
1907
static inline void vec_st(vec_float4 a, int b, vec_float4 *c)
1908
{
1909
  *((vec_float4 *)((unsigned char *)(c)+b)) = a;
1910
}
1911
 
1912
 
1913
/* vec_ste (vector store element indexed)
1914
 * =======
1915
 */
1916
static inline void vec_ste(vec_uchar16 a, int b, unsigned char *c)
1917
{
1918
  unsigned char *ptr;
1919
 
1920
  ptr = c + b;
1921
  *ptr = spu_extract(a, (int)(ptr) & 15);
1922
}
1923
 
1924
static inline void vec_ste(vec_char16 a, int b, signed char *c)
1925
{
1926
  vec_ste((vec_uchar16)(a), b, (unsigned char *)(c));
1927
}
1928
 
1929
static inline void vec_ste(vec_bchar16 a, int b, signed char *c)
1930
{
1931
  vec_ste((vec_uchar16)(a), b, (unsigned char *)(c));
1932
}
1933
 
1934
static inline void vec_ste(vec_ushort8 a, int b, unsigned short *c)
1935
{
1936
  unsigned short *ptr;
1937
 
1938
  ptr = (unsigned short *)(((unsigned int)(c) + b) & ~1);
1939
  *ptr = spu_extract(a, ((int)(ptr) >> 1) & 7);
1940
}
1941
 
1942
static inline void vec_ste(vec_short8 a, int b, signed short *c)
1943
{
1944
  vec_ste((vec_ushort8)(a), b, (unsigned short *)(c));
1945
}
1946
 
1947
static inline void vec_ste(vec_bshort8 a, int b, signed short *c)
1948
{
1949
  vec_ste((vec_ushort8)(a), b, (unsigned short *)(c));
1950
}
1951
 
1952
static inline void vec_ste(vec_uint4 a, int b, unsigned int *c)
1953
{
1954
  unsigned int *ptr;
1955
 
1956
  ptr = (unsigned int *)(((unsigned int)(c) + b) & ~3);
1957
  *ptr = spu_extract(a, ((int)(ptr) >> 2) & 3);
1958
}
1959
 
1960
static inline void vec_ste(vec_int4 a, int b, signed int *c)
1961
{
1962
  vec_ste((vec_uint4)(a), b, (unsigned int *)(c));
1963
}
1964
 
1965
static inline void vec_ste(vec_bint4 a, int b, signed int *c)
1966
{
1967
  vec_ste((vec_uint4)(a), b, (unsigned int *)(c));
1968
}
1969
 
1970
static inline void vec_ste(vec_float4 a, int b, float *c)
1971
{
1972
  vec_ste((vec_uint4)(a), b, (unsigned int *)(c));
1973
}
1974
 
1975
 
1976
/* vec_stl (vector store indexed LRU)
1977
 * =======
1978
 */
1979
#define vec_stl(_a, _b, _c)             vec_st(_a, _b, _c)
1980
 
1981
 
1982
/* vec_sub (vector subtract)
1983
 * =======
1984
 */
1985
static inline vec_uchar16 vec_sub(vec_uchar16 a, vec_uchar16 b)
1986
{
1987
  return ((vec_uchar16)(spu_sel(spu_sub((vec_ushort8)(a), (vec_ushort8)(b)),
1988
                                spu_sub(spu_and((vec_ushort8)(a), -256), spu_and((vec_ushort8)(b), -256)),
1989
                                spu_splats((unsigned short)0xFF00))));
1990
}
1991
 
1992
static inline vec_char16 vec_sub(vec_char16 a, vec_char16 b)
1993
{
1994
  return ((vec_char16)(vec_sub((vec_uchar16)(a), (vec_uchar16)(b))));
1995
}
1996
 
1997
static inline vec_char16 vec_sub(vec_bchar16 a, vec_char16 b)
1998
{
1999
  return ((vec_char16)(vec_sub((vec_uchar16)(a), (vec_uchar16)(b))));
2000
}
2001
 
2002
static inline vec_char16 vec_sub(vec_char16 a, vec_bchar16 b)
2003
{
2004
  return ((vec_char16)(vec_sub((vec_uchar16)(a), (vec_uchar16)(b))));
2005
}
2006
 
2007
static inline vec_ushort8 vec_sub(vec_ushort8 a, vec_ushort8 b)
2008
{
2009
  return (spu_sub(a, b));
2010
}
2011
 
2012
static inline vec_short8 vec_sub(vec_short8 a, vec_short8 b)
2013
{
2014
  return (spu_sub(a, b));
2015
}
2016
 
2017
static inline vec_short8 vec_sub(vec_bshort8 a, vec_short8 b)
2018
{
2019
  return (spu_sub((vec_short8)(a), b));
2020
}
2021
 
2022
static inline vec_short8 vec_sub(vec_short8 a, vec_bshort8 b)
2023
{
2024
  return (spu_sub(a, (vec_short8)(b)));
2025
}
2026
 
2027
static inline vec_uint4 vec_sub(vec_uint4 a, vec_uint4 b)
2028
{
2029
  return (spu_sub(a, b));
2030
}
2031
 
2032
static inline vec_int4 vec_sub(vec_int4 a, vec_int4 b)
2033
{
2034
  return (spu_sub(a, b));
2035
}
2036
 
2037
static inline vec_int4 vec_sub(vec_bint4 a, vec_int4 b)
2038
{
2039
  return (spu_sub((vec_int4)(a), b));
2040
}
2041
 
2042
static inline vec_int4 vec_sub(vec_int4 a, vec_bint4 b)
2043
{
2044
  return (spu_sub(a, (vec_int4)(b)));
2045
}
2046
 
2047
static inline vec_float4 vec_sub(vec_float4 a, vec_float4 b)
2048
{
2049
  return (spu_sub(a, b));
2050
}
2051
 
2052
 
2053
/* vec_subc (vector subtract carryout)
2054
 * ========
2055
 */
2056
#define vec_subc(_a, _b)        spu_genb(_a, _b)
2057
 
2058
 
2059
/* vec_subs (vector subtract saturate)
2060
 * ========
2061
 */
2062
static inline vec_uchar16 vec_subs(vec_uchar16 a, vec_uchar16 b)
2063
{
2064
  vec_ushort8 s1, s2;
2065
  vec_uchar16 s, d;
2066
 
2067
  s1 = spu_sub(spu_rlmask((vec_ushort8)(a), -8), spu_rlmask((vec_ushort8)(b), -8));
2068
  s2 = spu_sub(spu_and((vec_ushort8)(a), 0xFF), spu_and((vec_ushort8)(b), 0xFF));
2069
  s  = (vec_uchar16)(spu_shuffle(s1, s2, ((vec_uchar16){0, 16,  2, 18,  4, 20,  6, 22,
2070
                                                        8, 24, 10, 26, 12, 28, 14, 30})));
2071
  d  = (vec_uchar16)(spu_shuffle(s1, s2, ((vec_uchar16){1, 17,  3, 19,  5, 21,  7, 23,
2072
                                                        9, 25, 11, 27, 13, 29, 15, 31})));
2073
  return (spu_andc(d, s));
2074
}
2075
 
2076
static inline vec_char16 vec_subs(vec_char16 a, vec_char16 b)
2077
{
2078
  vec_ushort8 s1, s2;
2079
  vec_uchar16 s, d;
2080
 
2081
  s1 = spu_sub(spu_rlmask((vec_ushort8)(a), -8), spu_rlmask((vec_ushort8)(b), -8));
2082
  s2 = spu_sub(spu_and((vec_ushort8)(a), 0xFF), spu_and((vec_ushort8)(b), 0xFF));
2083
  s  = (vec_uchar16)(spu_shuffle(s1, s2, ((vec_uchar16){1, 17,  3, 19,  5, 21,  7, 23,
2084
                                                        9, 25, 11, 27, 13, 29, 15, 31})));
2085
  d  = spu_sel(s, spu_splats((unsigned char)0x7F), spu_cmpgt(spu_nor((vec_uchar16)(a), spu_nand(s, (vec_uchar16)(b))), 0x7F));
2086
  d  = spu_sel(d, spu_splats((unsigned char)0x80), spu_cmpgt(spu_and((vec_uchar16)(a), spu_nor(s, (vec_uchar16)(b))), 0x7F));
2087
 
2088
  return ((vec_char16)(d));
2089
}
2090
 
2091
static inline vec_char16 vec_subs(vec_bchar16 a, vec_char16 b)
2092
{
2093
  return (vec_subs((vec_char16)(a), b));
2094
}
2095
 
2096
static inline vec_char16 vec_subs(vec_char16 a, vec_bchar16 b)
2097
{
2098
  return (vec_subs(a, (vec_char16)(b)));
2099
}
2100
 
2101
static inline vec_ushort8 vec_subs(vec_ushort8 a, vec_ushort8 b)
2102
{
2103
  return (spu_andc(spu_sub(a, b), spu_cmpgt(b, a)));
2104
}
2105
 
2106
static inline vec_short8 vec_subs(vec_short8 a, vec_short8 b)
2107
{
2108
  vec_short8 s;
2109
  vec_short8 d;
2110
 
2111
  s = spu_sub(a, b);
2112
  d = spu_sel(s, spu_splats((signed short)0x7FFF), (vec_ushort8)(spu_rlmaska(spu_nor(a, spu_nand(s, b)), -15)));
2113
  d = spu_sel(d, spu_splats((signed short)0x8000), (vec_ushort8)(spu_rlmaska(spu_and(a, spu_nor(s, b)), -15)));
2114
 
2115
  return (d);
2116
}
2117
 
2118
static inline vec_short8 vec_subs(vec_bshort8 a, vec_short8 b)
2119
{
2120
  return ((vec_short8)(vec_subs((vec_short8)(a), b)));
2121
}
2122
 
2123
static inline vec_short8 vec_subs(vec_short8 a, vec_bshort8 b)
2124
{
2125
  return ((vec_short8)(vec_subs(a, (vec_short8)(b))));
2126
}
2127
 
2128
static inline vec_uint4 vec_subs(vec_uint4 a, vec_uint4 b)
2129
{
2130
  return (spu_andc(spu_sub(a, b), spu_cmpgt(b, a)));
2131
}
2132
 
2133
static inline vec_int4 vec_subs(vec_int4 a, vec_int4 b)
2134
{
2135
  vec_int4 s;
2136
  vec_int4 d;
2137
 
2138
  s = spu_sub(a, b);
2139
  d = spu_sel(s, spu_splats((signed int)0x7FFFFFFF), (vec_uint4)(spu_rlmaska(spu_nor(a, spu_nand(s, b)), -31)));
2140
  d = spu_sel(d, spu_splats((signed int)0x80000000), (vec_uint4)(spu_rlmaska(spu_and(a, spu_nor(s, b)), -31)));
2141
 
2142
  return (d);
2143
}
2144
 
2145
static inline vec_int4 vec_subs(vec_bint4 a, vec_int4 b)
2146
{
2147
  return ((vec_int4)(vec_subs((vec_int4)(a), b)));
2148
}
2149
 
2150
static inline vec_int4 vec_subs(vec_int4 a, vec_bint4 b)
2151
{
2152
  return ((vec_int4)(vec_subs(a, (vec_int4)(b))));
2153
}
2154
 
2155
 
2156
/* vec_sum4s (vector sum across partial (1/4) saturated)
2157
 * =========
2158
 */
2159
static inline vec_uint4 vec_sum4s(vec_uchar16 a, vec_uint4 b)
2160
{
2161
  vec_uint4 a01_23, a0123;
2162
 
2163
  a01_23 = (vec_uint4)(spu_add(spu_rlmask((vec_ushort8)(a), -8),
2164
                               spu_and((vec_ushort8)(a), 0xFF)));
2165
  a0123 = spu_add(spu_rlmask(a01_23, -16), spu_and(a01_23, 0x1FF));
2166
  return (vec_adds(a0123, b));
2167
}
2168
 
2169
static inline vec_int4 vec_sum4s(vec_char16 a, vec_int4 b)
2170
{
2171
  vec_int4 a01_23, a0123;
2172
 
2173
  a01_23 = (vec_int4)(spu_add(spu_rlmaska((vec_short8)(a), -8),
2174
                              spu_extend(a)));
2175
  a0123 = spu_add(spu_rlmaska(a01_23, -16), spu_extend((vec_short8)(a01_23)));
2176
  return (vec_adds(a0123, b));
2177
}
2178
 
2179
static inline vec_int4 vec_sum4s(vec_short8 a, vec_int4 b)
2180
{
2181
  vec_int4 a0123;
2182
 
2183
  a0123 = spu_add(spu_rlmaska((vec_int4)(a), -16), spu_extend(a));
2184
  return (vec_adds(a0123, b));
2185
}
2186
 
2187
 
2188
/* vec_sum2s (vector sum across partial (1/2) saturated)
2189
 * =========
2190
 */
2191
static inline vec_int4 vec_sum2s(vec_int4 a, vec_int4 b)
2192
{
2193
  vec_int4 c, d;
2194
  vec_int4 sign1, sign2, sign3;
2195
  vec_int4 carry, sum_l, sum_h, sat, sat_val;
2196
 
2197
  sign1 = spu_rlmaska(a, -31);
2198
  sign2 = spu_rlmaska(b, -31);
2199
 
2200
  c = spu_rlqwbyte(a, -4);
2201
  sign3 = spu_rlqwbyte(sign1, -4);
2202
 
2203
  carry = spu_genc(a, b);
2204
  sum_l = spu_add(a, b);
2205
  sum_h = spu_addx(sign1, sign2, carry);
2206
 
2207
  carry = spu_genc(sum_l, c);
2208
  sum_l = spu_add(sum_l, c);
2209
  sum_h = spu_addx(sum_h, sign3, carry);
2210
 
2211
  sign1 = spu_rlmaska(sum_l, -31);
2212
  sign2 = spu_rlmaska(sum_h, -31);
2213
 
2214
  sat_val = spu_xor(sign2, spu_splats((signed int)0x7FFFFFFF));
2215
 
2216
  sat = spu_orc(spu_xor(sign1, sign2), (vec_int4)spu_cmpeq(sum_h, sign2));
2217
 
2218
  d = spu_and(spu_sel(sum_l, sat_val, (vec_uint4)(sat)), (vec_int4){0, -1, 0, -1});
2219
 
2220
  return (d);
2221
}
2222
 
2223
 
2224
/* vec_sums (vector sum saturated)
2225
 * ========
2226
 */
2227
static inline vec_int4 vec_sums(vec_int4 a, vec_int4 b)
2228
{
2229
  vec_int4 a0, a1, a2, c0, c1, c2, d;
2230
  vec_int4 sign_a, sign_b, sign_l, sign_h;
2231
  vec_int4 sum_l, sum_h, sat, sat_val;
2232
 
2233
  sign_a = spu_rlmaska(a, -31);
2234
  sign_b = spu_rlmaska(b, -31);
2235
 
2236
  a0 = spu_rlqwbyte(a, -12);
2237
  a1 = spu_rlqwbyte(a, -8);
2238
  a2 = spu_rlqwbyte(a, -4);
2239
 
2240
  sum_l = spu_add(a, b);
2241
  sum_h = spu_addx(sign_a, sign_b, spu_genc(a, b));
2242
 
2243
  c2 = spu_genc(sum_l, a2);
2244
  sum_l = spu_add(sum_l, a2);
2245
  sum_h = spu_addx(sum_h, spu_rlqwbyte(sign_a, -4), c2);
2246
 
2247
  c1 = spu_genc(sum_l, a1);
2248
  sum_l = spu_add(sum_l, a1);
2249
  sum_h = spu_addx(sum_h, spu_rlqwbyte(sign_a, -8), c1);
2250
 
2251
  c0 = spu_genc(sum_l, a0);
2252
  sum_l = spu_add(sum_l, a0);
2253
  sum_h = spu_addx(sum_h, spu_rlqwbyte(sign_a, -12), c0);
2254
 
2255
  sign_l = spu_rlmaska(sum_l, -31);
2256
  sign_h = spu_rlmaska(sum_h, -31);
2257
 
2258
  sat_val = spu_xor(sign_h, spu_splats((signed int)0x7FFFFFFF));
2259
 
2260
  sat = spu_orc(spu_xor(sign_l, sign_h), (vec_int4)spu_cmpeq(sum_h, sign_h));
2261
 
2262
  d = spu_and(spu_sel(sum_l, sat_val, (vec_uint4)(sat)), ((vec_int4){0, 0, 0, -1}));
2263
 
2264
  return (d);
2265
}
2266
 
2267
 
2268
/* vec_trunc (vector truncate)
2269
 * =========
2270
 */
2271
static inline vec_float4 vec_trunc(vec_float4 a)
2272
{
2273
  vec_int4 exp;
2274
  vec_uint4 mask;
2275
 
2276
  exp  = spu_sub(127, (vec_int4)(spu_and(spu_rlmask((vec_uint4)(a), -23), 0xFF)));
2277
  mask = spu_rlmask(spu_splats((unsigned int)0x7FFFFF), exp);
2278
  mask = spu_sel(spu_splats((unsigned int)0), mask, spu_cmpgt(exp, -31));
2279
  mask = spu_or(mask, spu_xor((vec_uint4)(spu_rlmaska(spu_add(exp, -1), -31)), -1));
2280
  return (spu_andc(a, (vec_float4)(mask)));
2281
}
2282
 
2283
/* vec_unpackh (vector unpack high element)
2284
 * ===========
2285
 */
2286
static inline vec_short8 vec_unpackh(vec_char16 a)
2287
{
2288
  return (spu_extend(spu_shuffle(a, a, ((vec_uchar16){0, 0, 1, 1, 2, 2, 3, 3,
2289
                                                      4, 4, 5, 5, 6, 6, 7, 7}))));
2290
}
2291
 
2292
static inline vec_bshort8 vec_unpackh(vec_bchar16 a)
2293
{
2294
  return ((vec_bshort8)(vec_unpackh((vec_char16)(a))));
2295
}
2296
 
2297
static inline vec_int4 vec_unpackh(vec_short8 a)
2298
{
2299
  return (spu_extend(spu_shuffle(a, a, ((vec_uchar16){0, 0, 0, 1, 0, 0, 2, 3,
2300
                                                      0, 0, 4, 5, 0, 0, 6, 7}))));
2301
}
2302
 
2303
#ifdef SUPPORT_UNPACK_PIXEL
2304
/* Due to type conflicts, unpacking of pixel types and boolean shorts
2305
 * can not simultaneously be supported. By default, the boolean short is
2306
 * supported.
2307
 */
2308
static inline vec_uint4 vec_unpackh(vec_pixel8 a)
2309
{
2310
  vec_ushort8 p1, p2;
2311
 
2312
  p1 = spu_shuffle((vec_ushort8)(spu_rlmaska((vec_short8)(a.p), -7)),
2313
                   spu_and((vec_ushort8)(a.p), 0x1F),
2314
                   ((vec_uchar16){ 0, 128, 128, 17,  2, 128, 128, 19,
2315
                                   4, 128, 128, 21,  6, 128, 128, 23}));
2316
  p2 = spu_shuffle(spu_and(spu_rlmask((vec_ushort8)(a.p), -5), 0x1F),
2317
                   spu_and(spu_rlmask((vec_ushort8)(a.p), -10), 0x1F),
2318
                   ((vec_uchar16){ 128,  17, 1, 128, 128,  19, 3, 128,
2319
                                   128,  21, 5, 128, 128,  23, 7, 128}));
2320
  return ((vec_uint4)(spu_or(p1, p2)));
2321
}
2322
 
2323
#else
2324
 
2325
static inline vec_bint4 vec_unpackh(vec_bshort8 a)
2326
{
2327
  return ((vec_bint4)(vec_unpackh((vec_short8)(a))));
2328
}
2329
#endif
2330
 
2331
 
2332
 
2333
 
2334
 
2335
/* vec_unpackl (vector unpack low element)
2336
 * ===========
2337
 */
2338
static inline vec_short8 vec_unpackl(vec_char16 a)
2339
{
2340
  return (spu_extend(spu_shuffle(a, a, ((vec_uchar16){8, 8, 9, 9, 10, 10, 11, 11,
2341
                                                      12, 12, 13, 13, 14, 14, 15, 15}))));
2342
}
2343
 
2344
static inline vec_bshort8 vec_unpackl(vec_bchar16 a)
2345
{
2346
  return ((vec_bshort8)(vec_unpackl((vec_char16)(a))));
2347
}
2348
 
2349
 
2350
static inline vec_int4 vec_unpackl(vec_short8 a)
2351
{
2352
  return (spu_extend(spu_shuffle(a, a, ((vec_uchar16){0, 0, 8, 9, 0, 0, 10, 11,
2353
                                                      0, 0,12,13, 0, 0, 14, 15}))));
2354
}
2355
 
2356
 
2357
#ifdef SUPPORT_UNPACK_PIXEL
2358
/* Due to type conflicts, unpacking of pixel types and boolean shorts
2359
 * can not simultaneously be supported. By default, the boolean short is
2360
 * supported.
2361
 */
2362
static inline vec_uint4 vec_unpackl(vec_pixel8 a)
2363
{
2364
  vec_ushort8 p1, p2;
2365
 
2366
  p1 = spu_shuffle((vec_ushort8)(spu_rlmaska((vec_short8)(a), -7)),
2367
                   spu_and((vec_ushort8)(a), 0x1F),
2368
                   ((vec_uchar16){ 8, 128, 128, 25,  10, 128, 128, 27,
2369
                                  12, 128, 128, 29,  14, 128, 128, 31}));
2370
  p2 = spu_shuffle(spu_and(spu_rlmask((vec_ushort8)(a), -5), 0x1F),
2371
                   spu_and(spu_rlmask((vec_ushort8)(a), -10), 0x1F),
2372
                   ((vec_uchar16){ 128, 25,  9, 128, 128, 27, 11, 128,
2373
                                   128, 29, 13, 128, 128, 31, 15, 128}));
2374
  return ((vec_uint4)(spu_or(p1, p2)));
2375
}
2376
 
2377
#else
2378
 
2379
static inline vec_bint4 vec_unpackl(vec_bshort8 a)
2380
{
2381
  return ((vec_bint4)(vec_unpackl((vec_short8)(a))));
2382
 
2383
}
2384
#endif
2385
 
2386
 
2387
 
2388
/* vec_xor (vector logical xor)
2389
 * ======
2390
 */
2391
static inline vec_uchar16 vec_xor(vec_uchar16 a, vec_uchar16 b)
2392
{
2393
  return (spu_xor(a, b));
2394
}
2395
 
2396
static inline vec_char16 vec_xor(vec_char16 a, vec_char16 b)
2397
{
2398
  return (spu_xor(a, b));
2399
}
2400
 
2401
static inline vec_char16 vec_xor(vec_bchar16 a, vec_char16 b)
2402
{
2403
  return (spu_xor((vec_char16)(a), b));
2404
}
2405
 
2406
static inline vec_char16 vec_xor(vec_char16 a, vec_bchar16 b)
2407
{
2408
  return (spu_xor(a, (vec_char16)(b)));
2409
}
2410
 
2411
static inline vec_ushort8 vec_xor(vec_ushort8 a, vec_ushort8 b)
2412
{
2413
  return (spu_xor(a, b));
2414
}
2415
 
2416
static inline vec_short8 vec_xor(vec_short8 a, vec_short8 b)
2417
{
2418
  return (spu_xor(a, b));
2419
}
2420
 
2421
static inline vec_short8 vec_xor(vec_bshort8 a, vec_short8 b)
2422
{
2423
  return (spu_xor((vec_short8)(a), b));
2424
}
2425
 
2426
static inline vec_short8 vec_xor(vec_short8 a, vec_bshort8 b)
2427
{
2428
  return (spu_xor(a, (vec_short8)(b)));
2429
}
2430
 
2431
static inline vec_uint4 vec_xor(vec_uint4 a, vec_uint4 b)
2432
{
2433
  return (spu_xor(a, b));
2434
}
2435
 
2436
static inline vec_int4 vec_xor(vec_int4 a, vec_int4 b)
2437
{
2438
  return (spu_xor(a, b));
2439
}
2440
 
2441
static inline vec_int4 vec_xor(vec_bint4 a, vec_int4 b)
2442
{
2443
  return (spu_xor((vec_int4)(a), b));
2444
}
2445
 
2446
static inline vec_int4 vec_xor(vec_int4 a, vec_bint4 b)
2447
{
2448
  return (spu_xor(a, (vec_int4)(b)));
2449
}
2450
 
2451
static inline vec_float4 vec_xor(vec_float4 a, vec_float4 b)
2452
{
2453
  return (spu_xor(a, b));
2454
}
2455
 
2456
static inline vec_float4 vec_xor(vec_bint4 a, vec_float4 b)
2457
{
2458
  return (spu_xor((vec_float4)(a),b));
2459
}
2460
 
2461
static inline vec_float4 vec_xor(vec_float4 a, vec_bint4 b)
2462
{
2463
  return (spu_xor(a, (vec_float4)(b)));
2464
}
2465
 
2466
/************************************************************************
2467
 *                        PREDICATES
2468
 ************************************************************************/
2469
 
2470
/* vec_all_eq (all elements equal)
2471
 * ==========
2472
 */
2473
static inline int vec_all_eq(vec_uchar16 a, vec_uchar16 b)
2474
{
2475
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0xFFFF));
2476
}
2477
 
2478
static inline int vec_all_eq(vec_char16 a, vec_char16 b)
2479
{
2480
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0xFFFF));
2481
}
2482
 
2483
static inline int vec_all_eq(vec_bchar16 a, vec_char16 b)
2484
{
2485
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_char16)(a), b)), 0) == 0xFFFF));
2486
}
2487
 
2488
static inline int vec_all_eq(vec_char16 a, vec_bchar16 b)
2489
{
2490
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_char16)(b))), 0) == 0xFFFF));
2491
}
2492
 
2493
static inline int vec_all_eq(vec_ushort8 a, vec_ushort8 b)
2494
{
2495
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0xFF));
2496
}
2497
 
2498
static inline int vec_all_eq(vec_short8 a, vec_short8 b)
2499
{
2500
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0xFF));
2501
}
2502
 
2503
static inline int vec_all_eq(vec_bshort8 a, vec_short8 b)
2504
{
2505
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_short8)(a), b)), 0) == 0xFF));
2506
}
2507
 
2508
static inline int vec_all_eq(vec_short8 a, vec_bshort8 b)
2509
{
2510
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_short8)(b))), 0) == 0xFF));
2511
}
2512
 
2513
static inline int vec_all_eq(vec_uint4 a, vec_uint4 b)
2514
{
2515
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0xF));
2516
}
2517
 
2518
static inline int vec_all_eq(vec_int4 a, vec_int4 b)
2519
{
2520
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0xF));
2521
}
2522
 
2523
static inline int vec_all_eq(vec_bint4 a, vec_int4 b)
2524
{
2525
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_int4)(a), b)), 0) == 0xF));
2526
}
2527
 
2528
static inline int vec_all_eq(vec_int4 a, vec_bint4 b)
2529
{
2530
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_int4)(b))), 0) == 0xF));
2531
}
2532
 
2533
static inline int vec_all_eq(vec_float4 a, vec_float4 b)
2534
{
2535
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0xF));
2536
}
2537
 
2538
 
2539
/* vec_all_ge (all elements greater than or equal)
2540
 * ==========
2541
 */
2542
static inline int vec_all_ge(vec_uchar16 a, vec_uchar16 b)
2543
{
2544
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0));
2545
}
2546
 
2547
static inline int vec_all_ge(vec_char16 a, vec_char16 b)
2548
{
2549
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0));
2550
}
2551
 
2552
static inline  int vec_all_ge(vec_bchar16 a, vec_char16 b)
2553
{
2554
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_char16)(a))), 0) == 0));
2555
}
2556
 
2557
static inline int vec_all_ge(vec_char16 a, vec_bchar16 b)
2558
{
2559
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_char16)(b), a)), 0) == 0));
2560
}
2561
 
2562
static inline int vec_all_ge(vec_ushort8 a, vec_ushort8 b)
2563
{
2564
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0));
2565
}
2566
 
2567
static inline int vec_all_ge(vec_short8 a, vec_short8 b)
2568
{
2569
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0));
2570
}
2571
 
2572
static inline int vec_all_ge(vec_bshort8 a, vec_short8 b)
2573
{
2574
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_short8)(a))), 0) == 0));
2575
}
2576
 
2577
static inline int vec_all_ge(vec_short8 a, vec_bshort8 b)
2578
{
2579
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_short8)(b), a)), 0) == 0));
2580
}
2581
 
2582
static inline int vec_all_ge(vec_uint4 a, vec_uint4 b)
2583
{
2584
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0));
2585
}
2586
 
2587
static inline int vec_all_ge(vec_int4 a, vec_int4 b)
2588
{
2589
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0));
2590
}
2591
 
2592
static inline int vec_all_ge(vec_bint4 a, vec_int4 b)
2593
{
2594
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_int4)(a))), 0) == 0));
2595
}
2596
 
2597
static inline int vec_all_ge(vec_int4 a, vec_bint4 b)
2598
{
2599
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_int4)(b), a)), 0) == 0));
2600
}
2601
 
2602
static inline int vec_all_ge(vec_float4 a, vec_float4 b)
2603
{
2604
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0));
2605
}
2606
 
2607
 
2608
/* vec_all_gt (all elements greater than)
2609
 * ==========
2610
 */
2611
static inline int vec_all_gt(vec_uchar16 a, vec_uchar16 b)
2612
{
2613
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0xFFFF));
2614
}
2615
 
2616
static inline int vec_all_gt(vec_char16 a, vec_char16 b)
2617
{
2618
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0xFFFF));
2619
}
2620
 
2621
static inline int vec_all_gt(vec_bchar16 a, vec_char16 b)
2622
{
2623
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_char16)(a), b)), 0) == 0xFFFF));
2624
}
2625
 
2626
static inline int vec_all_gt(vec_char16 a, vec_bchar16 b)
2627
{
2628
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_char16)(b))), 0) == 0xFFFF));
2629
}
2630
 
2631
static inline int vec_all_gt(vec_ushort8 a, vec_ushort8 b)
2632
{
2633
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0xFF));
2634
}
2635
 
2636
static inline int vec_all_gt(vec_short8 a, vec_short8 b)
2637
{
2638
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0xFF));
2639
}
2640
 
2641
static inline int vec_all_gt(vec_bshort8 a, vec_short8 b)
2642
{
2643
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_short8)(a), b)), 0) == 0xFF));
2644
}
2645
 
2646
static inline int vec_all_gt(vec_short8 a, vec_bshort8 b)
2647
{
2648
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_short8)(b))), 0) == 0xFF));
2649
}
2650
 
2651
static inline int vec_all_gt(vec_uint4 a, vec_uint4 b)
2652
{
2653
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0xF));
2654
}
2655
 
2656
static inline int vec_all_gt(vec_int4 a, vec_int4 b)
2657
{
2658
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0xF));
2659
}
2660
 
2661
static inline int vec_all_gt(vec_bint4 a, vec_int4 b)
2662
{
2663
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_int4)(a), b)), 0) == 0xF));
2664
}
2665
 
2666
static inline int vec_all_gt(vec_int4 a, vec_bint4 b)
2667
{
2668
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_int4)(b))), 0) == 0xF));
2669
}
2670
 
2671
static inline int vec_all_gt(vec_float4 a, vec_float4 b)
2672
{
2673
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0xF));
2674
}
2675
 
2676
 
2677
/* vec_all_in (all elements in bounds)
2678
 * ==========
2679
 */
2680
static inline int vec_all_in(vec_float4 a, vec_float4 b)
2681
{
2682
  return (spu_extract(spu_gather(spu_nor(spu_cmpabsgt(a, b), (vec_uint4)(spu_rlmaska((vec_int4)(b), -31)))), 0) == 0xF);
2683
}
2684
 
2685
 
2686
/* vec_all_le (all elements less than or equal)
2687
 * ==========
2688
 */
2689
static inline int vec_all_le(vec_uchar16 a, vec_uchar16 b)
2690
{
2691
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0));
2692
}
2693
 
2694
static inline int vec_all_le(vec_char16 a, vec_char16 b)
2695
{
2696
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0));
2697
}
2698
 
2699
static inline int vec_all_le(vec_bchar16 a, vec_char16 b)
2700
{
2701
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_char16)(a), b)), 0) == 0));
2702
}
2703
 
2704
static inline int vec_all_le(vec_char16 a, vec_bchar16 b)
2705
{
2706
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_char16)(b))), 0) == 0));
2707
}
2708
 
2709
static inline int vec_all_le(vec_ushort8 a, vec_ushort8 b)
2710
{
2711
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0));
2712
}
2713
 
2714
static inline int vec_all_le(vec_short8 a, vec_short8 b)
2715
{
2716
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0));
2717
}
2718
 
2719
static inline int vec_all_le(vec_bshort8 a, vec_short8 b)
2720
{
2721
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_short8)(a), b)), 0) == 0));
2722
}
2723
 
2724
static inline int vec_all_le(vec_short8 a, vec_bshort8 b)
2725
{
2726
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_short8)(b))), 0) == 0));
2727
}
2728
 
2729
static inline int vec_all_le(vec_uint4 a, vec_uint4 b)
2730
{
2731
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0));
2732
}
2733
 
2734
static inline int vec_all_le(vec_int4 a, vec_int4 b)
2735
{
2736
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0));
2737
}
2738
 
2739
static inline int vec_all_le(vec_bint4 a, vec_int4 b)
2740
{
2741
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_int4)(a), b)), 0) == 0));
2742
}
2743
 
2744
static inline int vec_all_le(vec_int4 a, vec_bint4 b)
2745
{
2746
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_int4)(b))), 0) == 0));
2747
}
2748
 
2749
static inline int vec_all_le(vec_float4 a, vec_float4 b)
2750
{
2751
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0));
2752
}
2753
 
2754
 
2755
/* vec_all_lt (all elements less than)
2756
 * ==========
2757
 */
2758
static inline int vec_all_lt(vec_uchar16 a, vec_uchar16 b)
2759
{
2760
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0xFFFF));
2761
}
2762
 
2763
static inline int vec_all_lt(vec_char16 a, vec_char16 b)
2764
{
2765
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0xFFFF));
2766
}
2767
 
2768
static inline int vec_all_lt(vec_bchar16 a, vec_char16 b)
2769
{
2770
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_char16)(a))), 0) == 0xFFFF));
2771
}
2772
 
2773
static inline int vec_all_lt(vec_char16 a, vec_bchar16 b)
2774
{
2775
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_char16)(b), a)), 0) == 0xFFFF));
2776
}
2777
 
2778
static inline int vec_all_lt(vec_ushort8 a, vec_ushort8 b)
2779
{
2780
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0xFF));
2781
}
2782
 
2783
static inline int vec_all_lt(vec_short8 a, vec_short8 b)
2784
{
2785
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0xFF));
2786
}
2787
 
2788
static inline int vec_all_lt(vec_bshort8 a, vec_short8 b)
2789
{
2790
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_short8)(a))), 0) == 0xFF));
2791
}
2792
 
2793
static inline int vec_all_lt(vec_short8 a, vec_bshort8 b)
2794
{
2795
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_short8)(b), a)), 0) == 0xFF));
2796
}
2797
 
2798
static inline int vec_all_lt(vec_uint4 a, vec_uint4 b)
2799
{
2800
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0xF));
2801
}
2802
 
2803
static inline int vec_all_lt(vec_int4 a, vec_int4 b)
2804
{
2805
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0xF));
2806
}
2807
 
2808
static inline int vec_all_lt(vec_bint4 a, vec_int4 b)
2809
{
2810
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_int4)(a))), 0) == 0xF));
2811
}
2812
 
2813
static inline int vec_all_lt(vec_int4 a, vec_bint4 b)
2814
{
2815
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_int4)(b), a)), 0) == 0xF));
2816
}
2817
 
2818
static inline int vec_all_lt(vec_float4 a, vec_float4 b)
2819
{
2820
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0xF));
2821
}
2822
 
2823
 
2824
/* vec_all_nan (all elements not a number)
2825
 * ===========
2826
 */
2827
static inline int vec_all_nan(vec_float4 a)
2828
{
2829
  vec_uint4 exp, man;
2830
  vec_uint4 exp_mask = spu_splats((unsigned int)0x7F800000);
2831
 
2832
  exp = spu_and((vec_uint4)(a), exp_mask);
2833
  man = spu_and((vec_uint4)(a), spu_splats((unsigned int)0x007FFFFF));
2834
  return ((int)(spu_extract(spu_gather(spu_andc(spu_cmpeq(exp, exp_mask),
2835
                                                spu_cmpeq(man, 0))), 0) == 0xF));
2836
}
2837
 
2838
#define vec_all_nan(_a)         (0)
2839
 
2840
 
2841
/* vec_all_ne (all elements not equal)
2842
 * ==========
2843
 */
2844
static inline int vec_all_ne(vec_uchar16 a, vec_uchar16 b)
2845
{
2846
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0));
2847
}
2848
 
2849
static inline int vec_all_ne(vec_char16 a, vec_char16 b)
2850
{
2851
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0));
2852
}
2853
 
2854
static inline int vec_all_ne(vec_bchar16 a, vec_char16 b)
2855
{
2856
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_char16)(a), b)), 0) == 0));
2857
}
2858
 
2859
static inline int vec_all_ne(vec_char16 a, vec_bchar16 b)
2860
{
2861
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_char16)(b))), 0) == 0));
2862
}
2863
 
2864
static inline int vec_all_ne(vec_ushort8 a, vec_ushort8 b)
2865
{
2866
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0));
2867
}
2868
 
2869
static inline int vec_all_ne(vec_short8 a, vec_short8 b)
2870
{
2871
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0));
2872
}
2873
 
2874
static inline int vec_all_ne(vec_bshort8 a, vec_short8 b)
2875
{
2876
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_short8)(a), b)), 0) == 0));
2877
}
2878
 
2879
static inline int vec_all_ne(vec_short8 a, vec_bshort8 b)
2880
{
2881
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_short8)(b))), 0) == 0));
2882
}
2883
 
2884
static inline int vec_all_ne(vec_uint4 a, vec_uint4 b)
2885
{
2886
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0));
2887
}
2888
 
2889
static inline int vec_all_ne(vec_int4 a, vec_int4 b)
2890
{
2891
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0));
2892
}
2893
 
2894
static inline int vec_all_ne(vec_bint4 a, vec_int4 b)
2895
{
2896
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_int4)(a), b)), 0) == 0));
2897
}
2898
 
2899
static inline int vec_all_ne(vec_int4 a, vec_bint4 b)
2900
{
2901
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_int4)(b))), 0) == 0));
2902
}
2903
 
2904
static inline int vec_all_ne(vec_float4 a, vec_float4 b)
2905
{
2906
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) == 0));
2907
}
2908
 
2909
 
2910
/* vec_all_nge (all elements not greater than or equal)
2911
 * ===========
2912
 */
2913
static inline int vec_all_nge(vec_float4 a, vec_float4 b)
2914
{
2915
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0xF));
2916
}
2917
 
2918
 
2919
/* vec_all_ngt (all elements not greater than)
2920
 * ===========
2921
 */
2922
static inline int vec_all_ngt(vec_float4 a, vec_float4 b)
2923
{
2924
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0));
2925
}
2926
 
2927
 
2928
/* vec_all_nle (all elements not less than or equal)
2929
 * ===========
2930
 */
2931
static inline int vec_all_nle(vec_float4 a, vec_float4 b)
2932
{
2933
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) == 0xF));
2934
}
2935
 
2936
 
2937
/* vec_all_nlt (all elements not less than)
2938
 * ===========
2939
 */
2940
static inline int vec_all_nlt(vec_float4 a, vec_float4 b)
2941
{
2942
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) == 0));
2943
}
2944
 
2945
 
2946
/* vec_all_numeric (all elements numeric)
2947
 * ===========
2948
 */
2949
static inline int vec_all_numeric(vec_float4 a)
2950
{
2951
  vec_uint4 exp;
2952
 
2953
  exp = spu_and(spu_rlmask((vec_uint4)(a), -23), 0xFF);
2954
  return ((int)(spu_extract(spu_gather(spu_cmpeq(exp, 255)), 0) == 0));
2955
}
2956
 
2957
 
2958
 
2959
/* vec_any_eq (any elements equal)
2960
 * ==========
2961
 */
2962
static inline int vec_any_eq(vec_uchar16 a, vec_uchar16 b)
2963
{
2964
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0));
2965
}
2966
 
2967
static inline int vec_any_eq(vec_char16 a, vec_char16 b)
2968
{
2969
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0));
2970
}
2971
 
2972
static inline int vec_any_eq(vec_bchar16 a, vec_char16 b)
2973
{
2974
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_char16)(a), b)), 0) != 0));
2975
}
2976
 
2977
static inline int vec_any_eq(vec_char16 a, vec_bchar16 b)
2978
{
2979
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_char16)(b))), 0) != 0));
2980
}
2981
 
2982
static inline int vec_any_eq(vec_ushort8 a, vec_ushort8 b)
2983
{
2984
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0));
2985
}
2986
 
2987
static inline int vec_any_eq(vec_short8 a, vec_short8 b)
2988
{
2989
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0));
2990
}
2991
 
2992
static inline int vec_any_eq(vec_bshort8 a, vec_short8 b)
2993
{
2994
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_short8)(a), b)), 0) != 0));
2995
}
2996
 
2997
static inline int vec_any_eq(vec_short8 a, vec_bshort8 b)
2998
{
2999
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_short8)(b))), 0) != 0));
3000
}
3001
 
3002
static inline int vec_any_eq(vec_uint4 a, vec_uint4 b)
3003
{
3004
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpeq(a, b), -31)), 0)));
3005
}
3006
 
3007
static inline int vec_any_eq(vec_int4 a, vec_int4 b)
3008
{
3009
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpeq(a, b), -31)), 0)));
3010
}
3011
 
3012
static inline int vec_any_eq(vec_bint4 a, vec_int4 b)
3013
{
3014
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpeq((vec_int4)(a), b), -31)), 0)));
3015
}
3016
 
3017
static inline int vec_any_eq(vec_int4 a, vec_bint4 b)
3018
{
3019
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpeq(a, (vec_int4)(b)), -31)), 0)));
3020
}
3021
 
3022
static inline int vec_any_eq(vec_float4 a, vec_float4 b)
3023
{
3024
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpeq(a, b), -31)), 0)));
3025
}
3026
 
3027
/* vec_any_ge (any elements greater than or equal)
3028
 * ==========
3029
 */
3030
static inline int vec_any_ge(vec_uchar16 a, vec_uchar16 b)
3031
{
3032
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0xFFFF));
3033
}
3034
 
3035
static inline int vec_any_ge(vec_char16 a, vec_char16 b)
3036
{
3037
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0xFFFF));
3038
}
3039
 
3040
static inline int vec_any_ge(vec_bchar16 a, vec_char16 b)
3041
{
3042
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_char16)(a))), 0) != 0xFFFF));
3043
}
3044
 
3045
static inline int vec_any_ge(vec_char16 a, vec_bchar16 b)
3046
{
3047
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_char16)(b), a)), 0) != 0xFFFF));
3048
}
3049
 
3050
static inline int vec_any_ge(vec_ushort8 a, vec_ushort8 b)
3051
{
3052
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0xFF));
3053
}
3054
 
3055
static inline int vec_any_ge(vec_short8 a, vec_short8 b)
3056
{
3057
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0xFF));
3058
}
3059
 
3060
static inline int vec_any_ge(vec_bshort8 a, vec_short8 b)
3061
{
3062
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_short8)(a))), 0) != 0xFF));
3063
}
3064
 
3065
static inline int vec_any_ge(vec_short8 a, vec_bshort8 b)
3066
{
3067
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_short8)(b), a)), 0) != 0xFF));
3068
}
3069
 
3070
static inline int vec_any_ge(vec_uint4 a, vec_uint4 b)
3071
{
3072
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0xF));
3073
}
3074
 
3075
static inline int vec_any_ge(vec_int4 a, vec_int4 b)
3076
{
3077
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0xF));
3078
}
3079
 
3080
static inline int vec_any_ge(vec_bint4 a, vec_int4 b)
3081
{
3082
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_int4)(a))), 0) != 0xF));
3083
}
3084
 
3085
static inline int vec_any_ge(vec_int4 a, vec_bint4 b)
3086
{
3087
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_int4)(b), a)), 0) != 0xF));
3088
}
3089
 
3090
static inline int vec_any_ge(vec_float4 a, vec_float4 b)
3091
{
3092
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0xF));
3093
}
3094
 
3095
 
3096
/* vec_any_gt (any elements greater than)
3097
 * ==========
3098
 */
3099
static inline int vec_any_gt(vec_uchar16 a, vec_uchar16 b)
3100
{
3101
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0));
3102
}
3103
 
3104
static inline int vec_any_gt(vec_char16 a, vec_char16 b)
3105
{
3106
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0));
3107
}
3108
 
3109
static inline int vec_any_gt(vec_bchar16 a, vec_char16 b)
3110
{
3111
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_char16)(a), b)), 0) != 0));
3112
}
3113
 
3114
static inline int vec_any_gt(vec_char16 a, vec_bchar16 b)
3115
{
3116
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_char16)(b))), 0) != 0));
3117
}
3118
 
3119
static inline int vec_any_gt(vec_ushort8 a, vec_ushort8 b)
3120
{
3121
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0));
3122
}
3123
 
3124
static inline int vec_any_gt(vec_short8 a, vec_short8 b)
3125
{
3126
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0));
3127
}
3128
 
3129
static inline int vec_any_gt(vec_bshort8 a, vec_short8 b)
3130
{
3131
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_short8)(a), b)), 0) != 0));
3132
}
3133
 
3134
static inline int vec_any_gt(vec_short8 a, vec_bshort8 b)
3135
{
3136
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_short8)(b))), 0) != 0));
3137
}
3138
 
3139
 
3140
static inline int vec_any_gt(vec_uint4 a, vec_uint4 b)
3141
{
3142
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(a, b), -31)), 0)));
3143
}
3144
 
3145
static inline int vec_any_gt(vec_int4 a, vec_int4 b)
3146
{
3147
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(a, b), -31)), 0)));
3148
}
3149
 
3150
static inline int vec_any_gt(vec_bint4 a, vec_int4 b)
3151
{
3152
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt((vec_int4)(a), b), -31)), 0)));
3153
}
3154
 
3155
static inline int vec_any_gt(vec_int4 a, vec_bint4 b)
3156
{
3157
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(a, (vec_int4)(b)), -31)), 0)));
3158
}
3159
 
3160
static inline int vec_any_gt(vec_float4 a, vec_float4 b)
3161
{
3162
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(a, b), -31)), 0)));
3163
}
3164
 
3165
/* vec_any_le (any elements less than or equal)
3166
 * ==========
3167
 */
3168
static inline int vec_any_le(vec_uchar16 a, vec_uchar16 b)
3169
{
3170
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0xFFFF));
3171
}
3172
 
3173
static inline int vec_any_le(vec_char16 a, vec_char16 b)
3174
{
3175
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0xFFFF));
3176
}
3177
 
3178
static inline int vec_any_le(vec_bchar16 a, vec_char16 b)
3179
{
3180
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_char16)(a), b)), 0) != 0xFFFF));
3181
}
3182
 
3183
static inline int vec_any_le(vec_char16 a, vec_bchar16 b)
3184
{
3185
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_char16)(b))), 0) != 0xFFFF));
3186
}
3187
 
3188
static inline int vec_any_le(vec_ushort8 a, vec_ushort8 b)
3189
{
3190
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0xFF));
3191
}
3192
 
3193
static inline int vec_any_le(vec_short8 a, vec_short8 b)
3194
{
3195
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0xFF));
3196
}
3197
 
3198
static inline int vec_any_le(vec_bshort8 a, vec_short8 b)
3199
{
3200
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_short8)(a), b)), 0) != 0xFF));
3201
}
3202
 
3203
static inline int vec_any_le(vec_short8 a, vec_bshort8 b)
3204
{
3205
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_short8)(b))), 0) != 0xFF));
3206
}
3207
 
3208
static inline int vec_any_le(vec_uint4 a, vec_uint4 b)
3209
{
3210
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0xF));
3211
}
3212
 
3213
static inline int vec_any_le(vec_int4 a, vec_int4 b)
3214
{
3215
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0xF));
3216
}
3217
 
3218
static inline int vec_any_le(vec_bint4 a, vec_int4 b)
3219
{
3220
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_int4)(a), b)), 0) != 0xF));
3221
}
3222
 
3223
static inline int vec_any_le(vec_int4 a, vec_bint4 b)
3224
{
3225
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, (vec_int4)(b))), 0) != 0xF));
3226
}
3227
 
3228
static inline int vec_any_le(vec_float4 a, vec_float4 b)
3229
{
3230
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0xF));
3231
}
3232
 
3233
 
3234
/* vec_any_lt (any elements less than)
3235
 * ==========
3236
 */
3237
static inline int vec_any_lt(vec_uchar16 a, vec_uchar16 b)
3238
{
3239
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0));
3240
}
3241
 
3242
static inline int vec_any_lt(vec_char16 a, vec_char16 b)
3243
{
3244
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0));
3245
}
3246
 
3247
static inline int vec_any_lt(vec_bchar16 a, vec_char16 b)
3248
{
3249
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_char16)(a))), 0) != 0));
3250
}
3251
 
3252
static inline int vec_any_lt(vec_char16 a, vec_bchar16 b)
3253
{
3254
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_char16)(b), a)), 0) != 0));
3255
}
3256
 
3257
static inline int vec_any_lt(vec_ushort8 a, vec_ushort8 b)
3258
{
3259
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0));
3260
}
3261
 
3262
static inline int vec_any_lt(vec_short8 a, vec_short8 b)
3263
{
3264
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0));
3265
}
3266
 
3267
static inline int vec_any_lt(vec_bshort8 a, vec_short8 b)
3268
{
3269
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, (vec_short8)(a))), 0) != 0));
3270
}
3271
 
3272
static inline int vec_any_lt(vec_short8 a, vec_bshort8 b)
3273
{
3274
  return ((int)(spu_extract(spu_gather(spu_cmpgt((vec_short8)(b), a)), 0) != 0));
3275
}
3276
 
3277
static inline int vec_any_lt(vec_uint4 a, vec_uint4 b)
3278
{
3279
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(b, a), -31)), 0)));
3280
}
3281
 
3282
static inline int vec_any_lt(vec_int4 a, vec_int4 b)
3283
{
3284
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(b, a), -31)), 0)));
3285
}
3286
 
3287
static inline int vec_any_lt(vec_bint4 a, vec_int4 b)
3288
{
3289
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(b, (vec_int4)(a)), -31)), 0)));
3290
}
3291
 
3292
static inline int vec_any_lt(vec_int4 a, vec_bint4 b)
3293
{
3294
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt((vec_int4)(b), a), -31)), 0)));
3295
}
3296
 
3297
static inline int vec_any_lt(vec_float4 a, vec_float4 b)
3298
{
3299
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(b, a), -31)), 0)));
3300
}
3301
 
3302
/* vec_any_nan (any elements not a number)
3303
 * ===========
3304
 */
3305
static inline int vec_any_nan(vec_float4 a)
3306
{
3307
  vec_uint4 exp, man;
3308
  vec_uint4 exp_mask = spu_splats((unsigned int)0x7F800000);
3309
 
3310
  exp = spu_and((vec_uint4)(a), exp_mask);
3311
  man = spu_and((vec_uint4)(a), spu_splats((unsigned int)0x007FFFFF));
3312
  return ((int)(spu_extract(spu_gather(spu_andc(spu_cmpeq(exp, exp_mask),
3313
                                                spu_cmpeq(man, 0))), 0) != 0));
3314
}
3315
 
3316
 
3317
/* vec_any_ne (any elements not equal)
3318
 * ==========
3319
 */
3320
static inline int vec_any_ne(vec_uchar16 a, vec_uchar16 b)
3321
{
3322
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0xFFFF));
3323
}
3324
 
3325
static inline int vec_any_ne(vec_char16 a, vec_char16 b)
3326
{
3327
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0xFFFF));
3328
}
3329
 
3330
static inline int vec_any_ne(vec_bchar16 a, vec_char16 b)
3331
{
3332
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_char16)(a), b)), 0) != 0xFFFF));
3333
}
3334
 
3335
static inline int vec_any_ne(vec_char16 a, vec_bchar16 b)
3336
{
3337
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_char16)(b))), 0) != 0xFFFF));
3338
}
3339
 
3340
static inline int vec_any_ne(vec_ushort8 a, vec_ushort8 b)
3341
{
3342
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0xFF));
3343
}
3344
 
3345
static inline int vec_any_ne(vec_short8 a, vec_short8 b)
3346
{
3347
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0xFF));
3348
}
3349
 
3350
static inline int vec_any_ne(vec_bshort8 a, vec_short8 b)
3351
{
3352
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_short8)(a), b)), 0) != 0xFF));
3353
}
3354
 
3355
static inline int vec_any_ne(vec_short8 a, vec_bshort8 b)
3356
{
3357
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_short8)(b))), 0) != 0xFF));
3358
}
3359
 
3360
static inline int vec_any_ne(vec_uint4 a, vec_uint4 b)
3361
{
3362
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0xF));
3363
}
3364
 
3365
static inline int vec_any_ne(vec_int4 a, vec_int4 b)
3366
{
3367
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0xF));
3368
}
3369
 
3370
static inline int vec_any_ne(vec_bint4 a, vec_int4 b)
3371
{
3372
  return ((int)(spu_extract(spu_gather(spu_cmpeq((vec_int4)(a), b)), 0) != 0xF));
3373
}
3374
 
3375
static inline int vec_any_ne(vec_int4 a, vec_bint4 b)
3376
{
3377
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, (vec_int4)(b))), 0) != 0xF));
3378
}
3379
 
3380
static inline int vec_any_ne(vec_float4 a, vec_float4 b)
3381
{
3382
  return ((int)(spu_extract(spu_gather(spu_cmpeq(a, b)), 0) != 0xF));
3383
}
3384
 
3385
 
3386
/* vec_any_nge (any elements not greater than or equal)
3387
 * ===========
3388
 */
3389
static inline int vec_any_nge(vec_float4 a, vec_float4 b)
3390
{
3391
  return ((int)(spu_extract(spu_orx(spu_rlmask(spu_cmpgt(b, a), -31)), 0)));
3392
}
3393
 
3394
/* vec_any_ngt (any elements not greater than)
3395
 * ===========
3396
 */
3397
static inline int vec_any_ngt(vec_float4 a, vec_float4 b)
3398
{
3399
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0xF));
3400
}
3401
 
3402
 
3403
/* vec_any_nle (any elements not less than or equal)
3404
 * ===========
3405
 */
3406
static inline int vec_any_nle(vec_float4 a, vec_float4 b)
3407
{
3408
  return ((int)(spu_extract(spu_gather(spu_cmpgt(a, b)), 0) != 0));
3409
}
3410
 
3411
 
3412
/* vec_any_nlt (any elements not less than)
3413
 * ===========
3414
 */
3415
static inline int vec_any_nlt(vec_float4 a, vec_float4 b)
3416
{
3417
  return ((int)(spu_extract(spu_gather(spu_cmpgt(b, a)), 0) != 0xF));
3418
}
3419
 
3420
 
3421
/* vec_any_numeric (any elements numeric)
3422
 * ===============
3423
 */
3424
static inline int vec_any_numeric(vec_float4 a)
3425
{
3426
  vec_uint4 exp;
3427
 
3428
  exp = spu_and(spu_rlmask((vec_uint4)(a), -23), 0xFF);
3429
  return ((int)(spu_extract(spu_gather(spu_cmpeq(exp, 255)), 0) != 0xF));
3430
}
3431
 
3432
 
3433
/* vec_any_out (any elements out of bounds)
3434
 * ===========
3435
 */
3436
static inline int vec_any_out(vec_float4 a, vec_float4 b)
3437
{
3438
  return (spu_extract(spu_gather(spu_nor(spu_cmpabsgt(a, b), (vec_uint4)(spu_rlmaska((vec_int4)(b), -31)))), 0) != 0xF);
3439
}
3440
 
3441
 
3442
/* CBE Language Extension Intrinsics
3443
 */
3444
 
3445
/* vec_extract (extract element from vector)
3446
 * ===========
3447
 */
3448
#define vec_extract(_a, _element)       spu_extract(_a, _element)
3449
 
3450
 
3451
/* vec_insert (insert scalar into specified vector element)
3452
 * ==========
3453
 */
3454
#define vec_insert(_a, _b, _element)    spu_insert(_a, _b, _element)
3455
 
3456
/* vec_lvlx (load vector left indexed)
3457
 * ========
3458
 */
3459
static inline vec_uchar16 vec_lvlx(int a, unsigned char *b)
3460
{
3461
  vec_uchar16 *p = (vec_uchar16 *)((unsigned char *)(b) + a);
3462
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3463
}
3464
 
3465
static inline vec_uchar16 vec_lvlx(int a, vec_uchar16 *b)
3466
{
3467
  vec_uchar16 *p = (vec_uchar16 *)((unsigned char *)(b) + a);
3468
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3469
}
3470
 
3471
static inline vec_char16 vec_lvlx(int a, signed char *b)
3472
{
3473
  vec_char16 *p = (vec_char16 *)((unsigned char *)(b) + a);
3474
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3475
}
3476
 
3477
static inline vec_char16 vec_lvlx(int a, vec_char16 *b)
3478
{
3479
  vec_char16 *p = (vec_char16 *)((unsigned char *)(b) + a);
3480
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3481
}
3482
 
3483
static inline vec_ushort8 vec_lvlx(int a, unsigned short *b)
3484
{
3485
  vec_ushort8 *p = (vec_ushort8 *)((unsigned char *)(b) + a);
3486
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3487
}
3488
 
3489
static inline vec_ushort8 vec_lvlx(int a, vec_ushort8 *b)
3490
{
3491
  vec_ushort8 *p = (vec_ushort8 *)((unsigned char *)(b) + a);
3492
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3493
}
3494
 
3495
static inline vec_short8 vec_lvlx(int a, signed short *b)
3496
{
3497
  vec_short8 *p = (vec_short8 *)((unsigned char *)(b) + a);
3498
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3499
}
3500
 
3501
static inline vec_short8 vec_lvlx(int a, vec_short8 *b)
3502
{
3503
  vec_short8 *p = (vec_short8 *)((unsigned char *)(b) + a);
3504
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3505
}
3506
 
3507
static inline vec_uint4 vec_lvlx(int a, unsigned int *b)
3508
{
3509
  vec_uint4 *p = (vec_uint4 *)((unsigned char *)(b) + a);
3510
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3511
}
3512
 
3513
static inline vec_uint4 vec_lvlx(int a, vec_uint4 *b)
3514
{
3515
  vec_uint4 *p = (vec_uint4 *)((unsigned char *)(b) + a);
3516
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3517
}
3518
 
3519
static inline vec_int4 vec_lvlx(int a, signed int *b)
3520
{
3521
  vec_int4 *p = (vec_int4 *)((unsigned char *)(b) + a);
3522
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3523
}
3524
 
3525
static inline vec_int4 vec_lvlx(int a, vec_int4 *b)
3526
{
3527
  vec_int4 *p = (vec_int4 *)((unsigned char *)(b) + a);
3528
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3529
}
3530
 
3531
static inline vec_float4 vec_lvlx(int a, float *b)
3532
{
3533
  vec_float4 *p = (vec_float4 *)((unsigned char *)(b) + a);
3534
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3535
}
3536
 
3537
static inline vec_float4 vec_lvlx(int a, vec_float4 *b)
3538
{
3539
  vec_float4 *p = (vec_float4 *)((unsigned char *)(b) + a);
3540
  return(spu_slqwbyte(*p, (unsigned int)p & 0xF));
3541
}
3542
 
3543
 
3544
/* vec_lvlxl (load vector left indexed last)
3545
 * =========
3546
 */
3547
#define vec_lvlxl(_a, _b)       vec_lvlx(_a, _b)
3548
 
3549
 
3550
/* vec_lvrx (load vector right indexed)
3551
 * ========
3552
 */
3553
static inline vec_uchar16 vec_lvrx(int a, unsigned char *b)
3554
{
3555
  vec_uchar16 *p = (vec_uchar16 *)((unsigned char *)(b) + a);
3556
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3557
}
3558
 
3559
static inline vec_uchar16 vec_lvrx(int a, vec_uchar16 *b)
3560
{
3561
  vec_uchar16 *p = (vec_uchar16 *)((unsigned char *)(b) + a);
3562
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3563
}
3564
 
3565
static inline vec_char16 vec_lvrx(int a, signed char *b)
3566
{
3567
  vec_char16 *p = (vec_char16 *)((unsigned char *)(b) + a);
3568
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3569
}
3570
 
3571
static inline vec_char16 vec_lvrx(int a, vec_char16 *b)
3572
{
3573
  vec_char16 *p = (vec_char16 *)((unsigned char *)(b) + a);
3574
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3575
}
3576
 
3577
static inline vec_ushort8 vec_lvrx(int a, unsigned short *b)
3578
{
3579
  vec_ushort8 *p = (vec_ushort8 *)((unsigned char *)(b) + a);
3580
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3581
}
3582
 
3583
static inline vec_ushort8 vec_lvrx(int a, vec_ushort8 *b)
3584
{
3585
  vec_ushort8 *p = (vec_ushort8 *)((unsigned char *)(b) + a);
3586
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3587
}
3588
 
3589
static inline vec_short8 vec_lvrx(int a, signed short *b)
3590
{
3591
  vec_short8 *p = (vec_short8 *)((unsigned char *)(b) + a);
3592
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3593
}
3594
 
3595
static inline vec_short8 vec_lvrx(int a, vec_short8 *b)
3596
{
3597
  vec_short8 *p = (vec_short8 *)((unsigned char *)(b) + a);
3598
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3599
}
3600
 
3601
static inline vec_uint4 vec_lvrx(int a, unsigned int *b)
3602
{
3603
  vec_uint4 *p = (vec_uint4 *)((unsigned char *)(b) + a);
3604
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3605
}
3606
 
3607
static inline vec_uint4 vec_lvrx(int a, vec_uint4 *b)
3608
{
3609
  vec_uint4 *p = (vec_uint4 *)((unsigned char *)(b) + a);
3610
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3611
}
3612
 
3613
static inline vec_int4 vec_lvrx(int a, signed int *b)
3614
{
3615
  vec_int4 *p = (vec_int4 *)((unsigned char *)(b) + a);
3616
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3617
}
3618
 
3619
static inline vec_int4 vec_lvrx(int a, vec_int4 *b)
3620
{
3621
  vec_int4 *p = (vec_int4 *)((unsigned char *)(b) + a);
3622
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3623
}
3624
 
3625
static inline vec_float4 vec_lvrx(int a, float *b)
3626
{
3627
  vec_float4 *p = (vec_float4 *)((unsigned char *)(b) + a);
3628
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3629
}
3630
 
3631
static inline vec_float4 vec_lvrx(int a, vec_float4 *b)
3632
{
3633
  vec_float4 *p = (vec_float4 *)((unsigned char *)(b) + a);
3634
  return(spu_rlmaskqwbyte(*p, ((int)p & 0xF)-16));
3635
}
3636
 
3637
 
3638
 
3639
/* vec_lvrxl (load vector right indexed last)
3640
 * =========
3641
 */
3642
#define vec_lvrxl(_a, _b)       vec_lvrx(_a, _b)
3643
 
3644
 
3645
/* vec_promote (promote scalar to a vector)
3646
 * ===========
3647
 */
3648
#define vec_promote(_a, _element)       spu_promote(_a, _element)
3649
 
3650
 
3651
/* vec_splats (splat scalar to a vector)
3652
 * ==========
3653
 */
3654
#define vec_splats(_a)  spu_splats(_a)
3655
 
3656
 
3657
/* vec_stvlx (store vector left indexed)
3658
 * =========
3659
 */
3660
static inline void vec_stvlx(vec_uchar16 a, int b, unsigned char *c)
3661
{
3662
  int shift;
3663
  vec_uchar16 *p = (vec_uchar16 *)((unsigned char *)(c) + b);
3664
 
3665
  shift = -((int)p & 0xF);
3666
  *p = spu_sel(*p,
3667
               spu_rlmaskqwbyte(a, shift),
3668
               spu_rlmaskqwbyte(spu_splats((unsigned char)0xFF), shift));
3669
}
3670
 
3671
static inline void vec_stvlx(vec_uchar16 a, int b, vec_uchar16 *c)
3672
{
3673
  int shift;
3674
  vec_uchar16 *p = (vec_uchar16 *)((unsigned char *)(c) + b);
3675
 
3676
  shift = -((int)p & 0xF);
3677
  *p = spu_sel(*p,
3678
               spu_rlmaskqwbyte(a, shift),
3679
               spu_rlmaskqwbyte(spu_splats((unsigned char)0xFF), shift));
3680
}
3681
 
3682
static inline void vec_stvlx(vec_char16 a, int b, signed char *c)
3683
{
3684
  int shift;
3685
  vec_char16 *p = (vec_char16 *)((unsigned char *)(c) + b);
3686
 
3687
  shift = -((int)p & 0xF);
3688
  *p = spu_sel(*p,
3689
               spu_rlmaskqwbyte(a, shift),
3690
               spu_rlmaskqwbyte(spu_splats((unsigned char)0xFF), shift));
3691
}
3692
 
3693
static inline void vec_stvlx(vec_char16 a, int b, vec_char16 *c)
3694
{
3695
  int shift;
3696
  vec_char16 *p = (vec_char16 *)((unsigned char *)(c) + b);
3697
 
3698
  shift = -((int)p & 0xF);
3699
  *p = spu_sel(*p,
3700
               spu_rlmaskqwbyte(a, shift),
3701
               spu_rlmaskqwbyte(spu_splats((unsigned char)0xFF), shift));
3702
}
3703
 
3704
static inline void vec_stvlx(vec_ushort8 a, int b, unsigned short *c)
3705
{
3706
  int shift;
3707
  vec_ushort8 *p = (vec_ushort8 *)((unsigned char *)(c) + b);
3708
 
3709
  shift = -((int)p & 0xF);
3710
  *p = spu_sel(*p,
3711
               spu_rlmaskqwbyte(a, shift),
3712
               spu_rlmaskqwbyte(spu_splats((unsigned short)0xFFFF), shift));
3713
}
3714
 
3715
static inline void vec_stvlx(vec_ushort8 a, int b, vec_ushort8 *c)
3716
{
3717
  int shift;
3718
  vec_ushort8 *p = (vec_ushort8 *)((unsigned char *)(c) + b);
3719
 
3720
  shift = -((int)p & 0xF);
3721
  *p = spu_sel(*p,
3722
               spu_rlmaskqwbyte(a, shift),
3723
               spu_rlmaskqwbyte(spu_splats((unsigned short)0xFFFF), shift));
3724
}
3725
 
3726
static inline void vec_stvlx(vec_short8 a, int b, signed short *c)
3727
{
3728
  int shift;
3729
  vec_short8 *p = (vec_short8 *)((unsigned char *)(c) + b);
3730
 
3731
  shift = -((int)p & 0xF);
3732
  *p = spu_sel(*p,
3733
               spu_rlmaskqwbyte(a, shift),
3734
               spu_rlmaskqwbyte(spu_splats((unsigned short)0xFFFF), shift));
3735
}
3736
 
3737
static inline void vec_stvlx(vec_short8 a, int b, vec_short8 *c)
3738
{
3739
  int shift;
3740
  vec_short8 *p = (vec_short8 *)((unsigned char *)(c) + b);
3741
 
3742
  shift = -((int)p & 0xF);
3743
  *p = spu_sel(*p,
3744
               spu_rlmaskqwbyte(a, shift),
3745
               spu_rlmaskqwbyte(spu_splats((unsigned short)0xFFFF), shift));
3746
}
3747
 
3748
static inline void vec_stvlx(vec_uint4 a, int b, unsigned int *c)
3749
{
3750
  int shift;
3751
  vec_uint4 *p = (vec_uint4 *)((unsigned char *)(c) + b);
3752
 
3753
  shift = -((int)p & 0xF);
3754
  *p = spu_sel(*p,
3755
               spu_rlmaskqwbyte(a, shift),
3756
               spu_rlmaskqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3757
}
3758
 
3759
static inline void vec_stvlx(vec_uint4 a, int b, vec_uint4 *c)
3760
{
3761
  int shift;
3762
  vec_uint4 *p = (vec_uint4 *)((unsigned char *)(c) + b);
3763
 
3764
  shift = -((int)p & 0xF);
3765
  *p = spu_sel(*p,
3766
               spu_rlmaskqwbyte(a, shift),
3767
               spu_rlmaskqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3768
}
3769
 
3770
static inline void vec_stvlx(vec_int4 a, int b, signed int *c)
3771
{
3772
  int shift;
3773
  vec_int4 *p = (vec_int4 *)((unsigned char *)(c) + b);
3774
 
3775
  shift = -((int)p & 0xF);
3776
  *p = spu_sel(*p,
3777
               spu_rlmaskqwbyte(a, shift),
3778
               spu_rlmaskqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3779
}
3780
 
3781
static inline void vec_stvlx(vec_int4 a, int b, vec_int4 *c)
3782
{
3783
  int shift;
3784
  vec_int4 *p = (vec_int4 *)((unsigned char *)(c) + b);
3785
 
3786
  shift = -((int)p & 0xF);
3787
  *p = spu_sel(*p,
3788
               spu_rlmaskqwbyte(a, shift),
3789
               spu_rlmaskqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3790
}
3791
 
3792
static inline void vec_stvlx(vec_float4 a, int b, float *c)
3793
{
3794
  int shift;
3795
  vec_float4 *p = (vec_float4 *)((unsigned char *)(c) + b);
3796
 
3797
  shift = -((int)p & 0xF);
3798
  *p = spu_sel(*p,
3799
               spu_rlmaskqwbyte(a, shift),
3800
               spu_rlmaskqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3801
}
3802
 
3803
static inline void vec_stvlx(vec_float4 a, int b, vec_float4 *c)
3804
{
3805
  int shift;
3806
  vec_float4 *p = (vec_float4 *)((unsigned char *)(c) + b);
3807
 
3808
  shift = -((int)p & 0xF);
3809
  *p = spu_sel(*p,
3810
               spu_rlmaskqwbyte(a, shift),
3811
               spu_rlmaskqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3812
}
3813
 
3814
/* vec_stvlxl (store vector left indexed last)
3815
 * ==========
3816
 */
3817
#define vec_stvlxl(_a, _b, _c)  vec_stvlx(_a, _b, _c)
3818
 
3819
 
3820
/* vec_stvrx (store vector right indexed)
3821
 * =========
3822
 */
3823
static inline void vec_stvrx(vec_uchar16 a, int b, unsigned char *c)
3824
{
3825
  int shift;
3826
  vec_uchar16 *p = (vec_uchar16 *)((unsigned char *)(c) + b);
3827
 
3828
  shift = 16-((int)p & 0xF);
3829
  *p = spu_sel(*p,
3830
               spu_slqwbyte(a, shift),
3831
               spu_slqwbyte(spu_splats((unsigned char)0xFF), shift));
3832
}
3833
 
3834
static inline void vec_stvrx(vec_uchar16 a, int b, vec_uchar16 *c)
3835
{
3836
  int shift;
3837
  vec_uchar16 *p = (vec_uchar16 *)((unsigned char *)(c) + b);
3838
 
3839
  shift = 16-((int)p & 0xF);
3840
  *p = spu_sel(*p,
3841
               spu_slqwbyte(a, shift),
3842
               spu_slqwbyte(spu_splats((unsigned char)0xFF), shift));
3843
}
3844
 
3845
static inline void vec_stvrx(vec_char16 a, int b, signed char *c)
3846
{
3847
  int shift;
3848
  vec_char16 *p = (vec_char16 *)((unsigned char *)(c) + b);
3849
 
3850
  shift = 16-((int)p & 0xF);
3851
  *p = spu_sel(*p,
3852
               spu_slqwbyte(a, shift),
3853
               spu_slqwbyte(spu_splats((unsigned char)0xFF), shift));
3854
}
3855
 
3856
static inline void vec_stvrx(vec_char16 a, int b, vec_char16 *c)
3857
{
3858
  int shift;
3859
  vec_char16 *p = (vec_char16 *)((unsigned char *)(c) + b);
3860
 
3861
  shift = 16-((int)p & 0xF);
3862
  *p = spu_sel(*p,
3863
               spu_slqwbyte(a, shift),
3864
               spu_slqwbyte(spu_splats((unsigned char)0xFF), shift));
3865
}
3866
 
3867
static inline void vec_stvrx(vec_ushort8 a, int b, unsigned short *c)
3868
{
3869
  int shift;
3870
  vec_ushort8 *p = (vec_ushort8 *)((unsigned char *)(c) + b);
3871
 
3872
  shift = 16-((int)p & 0xF);
3873
  *p = spu_sel(*p,
3874
               spu_slqwbyte(a, shift),
3875
               spu_slqwbyte(spu_splats((unsigned short)0xFFFF), shift));
3876
}
3877
 
3878
static inline void vec_stvrx(vec_ushort8 a, int b, vec_ushort8 *c)
3879
{
3880
  int shift;
3881
  vec_ushort8 *p = (vec_ushort8 *)((unsigned char *)(c) + b);
3882
 
3883
  shift = 16-((int)p & 0xF);
3884
  *p = spu_sel(*p,
3885
               spu_slqwbyte(a, shift),
3886
               spu_slqwbyte(spu_splats((unsigned short)0xFFFF), shift));
3887
}
3888
 
3889
static inline void vec_stvrx(vec_short8 a, int b, signed short *c)
3890
{
3891
  int shift;
3892
  vec_short8 *p = (vec_short8 *)((unsigned char *)(c) + b);
3893
 
3894
  shift = 16-((int)p & 0xF);
3895
  *p = spu_sel(*p,
3896
               spu_slqwbyte(a, shift),
3897
               spu_slqwbyte(spu_splats((unsigned short)0xFFFF), shift));
3898
}
3899
 
3900
static inline void vec_stvrx(vec_short8 a, int b, vec_short8 *c)
3901
{
3902
  int shift;
3903
  vec_short8 *p = (vec_short8 *)((unsigned char *)(c) + b);
3904
 
3905
  shift = 16-((int)p & 0xF);
3906
  *p = spu_sel(*p,
3907
               spu_slqwbyte(a, shift),
3908
               spu_slqwbyte(spu_splats((unsigned short)0xFFFF), shift));
3909
}
3910
 
3911
static inline void vec_stvrx(vec_uint4 a, int b, unsigned int *c)
3912
{
3913
  int shift;
3914
  vec_uint4 *p = (vec_uint4 *)((unsigned char *)(c) + b);
3915
 
3916
  shift = 16-((int)p & 0xF);
3917
  *p = spu_sel(*p,
3918
               spu_slqwbyte(a, shift),
3919
               spu_slqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3920
}
3921
 
3922
static inline void vec_stvrx(vec_uint4 a, int b, vec_uint4 *c)
3923
{
3924
  int shift;
3925
  vec_uint4 *p = (vec_uint4 *)((unsigned char *)(c) + b);
3926
 
3927
  shift = 16-((int)p & 0xF);
3928
  *p = spu_sel(*p,
3929
               spu_slqwbyte(a, shift),
3930
               spu_slqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3931
}
3932
 
3933
static inline void vec_stvrx(vec_int4 a, int b, signed int *c)
3934
{
3935
  int shift;
3936
  vec_int4 *p = (vec_int4 *)((unsigned char *)(c) + b);
3937
 
3938
  shift = 16-((int)p & 0xF);
3939
  *p = spu_sel(*p,
3940
               spu_slqwbyte(a, shift),
3941
               spu_slqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3942
}
3943
 
3944
static inline void vec_stvrx(vec_int4 a, int b, vec_int4 *c)
3945
{
3946
  int shift;
3947
  vec_int4 *p = (vec_int4 *)((unsigned char *)(c) + b);
3948
 
3949
  shift = 16-((int)p & 0xF);
3950
  *p = spu_sel(*p,
3951
               spu_slqwbyte(a, shift),
3952
               spu_slqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3953
}
3954
 
3955
static inline void vec_stvrx(vec_float4 a, int b, float *c)
3956
{
3957
  int shift;
3958
  vec_float4 *p = (vec_float4 *)((unsigned char *)(c) + b);
3959
 
3960
  shift = 16-((int)p & 0xF);
3961
  *p = spu_sel(*p,
3962
               spu_slqwbyte(a, shift),
3963
               spu_slqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3964
}
3965
 
3966
static inline void vec_stvrx(vec_float4 a, int b, vec_float4 *c)
3967
{
3968
  int shift;
3969
  vec_float4 *p = (vec_float4 *)((unsigned char *)(c) + b);
3970
 
3971
  shift = 16-((int)p & 0xF);
3972
  *p = spu_sel(*p,
3973
               spu_slqwbyte(a, shift),
3974
               spu_slqwbyte(spu_splats((unsigned int)0xFFFFFFFF), shift));
3975
}
3976
 
3977
/* vec_stvrxl (store vector right indexed last)
3978
 * ==========
3979
 */
3980
#define vec_stvrxl(_a, _b, _c)  vec_stvrx(_a, _b, _c)
3981
 
3982
 
3983
#endif /* __SPU__ */
3984
#endif /* __cplusplus */
3985
#endif /* !_VMX2SPU_H_ */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.