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