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