/*===---- altivec.h - Standard header for type generic math ---------------===*\
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
\*===----------------------------------------------------------------------===*/

#ifndef __ALTIVEC_H
#define __ALTIVEC_H

#ifndef __ALTIVEC__
#error "AltiVec support not enabled"
#endif

/* constants for mapping CR6 bits to predicate result. */

#define __CR6_EQ     0
#define __CR6_EQ_REV 1
#define __CR6_LT     2
#define __CR6_LT_REV 3

#define __ATTRS_o_ai __attribute__((__overloadable__, __always_inline__))

static vector signed char __ATTRS_o_ai
vec_perm(vector signed char a, vector signed char b, vector unsigned char c);

static vector unsigned char __ATTRS_o_ai
vec_perm(vector unsigned char a,
         vector unsigned char b, 
         vector unsigned char c);

static vector bool char __ATTRS_o_ai
vec_perm(vector bool char a, vector bool char b, vector unsigned char c);

static vector short __ATTRS_o_ai
vec_perm(vector short a, vector short b, vector unsigned char c);

static vector unsigned short __ATTRS_o_ai
vec_perm(vector unsigned short a,
         vector unsigned short b, 
         vector unsigned char c);

static vector bool short __ATTRS_o_ai
vec_perm(vector bool short a, vector bool short b, vector unsigned char c);

static vector pixel __ATTRS_o_ai
vec_perm(vector pixel a, vector pixel b, vector unsigned char c);

static vector int __ATTRS_o_ai
vec_perm(vector int a, vector int b, vector unsigned char c);

static vector unsigned int __ATTRS_o_ai
vec_perm(vector unsigned int a, vector unsigned int b, vector unsigned char c);

static vector bool int __ATTRS_o_ai
vec_perm(vector bool int a, vector bool int b, vector unsigned char c);

static vector float __ATTRS_o_ai
vec_perm(vector float a, vector float b, vector unsigned char c);

/* vec_abs */

#define __builtin_altivec_abs_v16qi vec_abs
#define __builtin_altivec_abs_v8hi  vec_abs
#define __builtin_altivec_abs_v4si  vec_abs

static vector signed char __ATTRS_o_ai
vec_abs(vector signed char a)
{
  return __builtin_altivec_vmaxsb(a, -a);
}

static vector signed short __ATTRS_o_ai
vec_abs(vector signed short a)
{
  return __builtin_altivec_vmaxsh(a, -a);
}

static vector signed int __ATTRS_o_ai
vec_abs(vector signed int a)
{
  return __builtin_altivec_vmaxsw(a, -a);
}

static vector float __ATTRS_o_ai
vec_abs(vector float a)
{
  vector unsigned int res = (vector unsigned int)a 
                            & (vector unsigned int)(0x7FFFFFFF);
  return (vector float)res;
}

/* vec_abss */

#define __builtin_altivec_abss_v16qi vec_abss
#define __builtin_altivec_abss_v8hi  vec_abss
#define __builtin_altivec_abss_v4si  vec_abss

static vector signed char __ATTRS_o_ai
vec_abss(vector signed char a)
{
  return __builtin_altivec_vmaxsb
           (a, __builtin_altivec_vsubsbs((vector signed char)(0), a));
}

static vector signed short __ATTRS_o_ai
vec_abss(vector signed short a)
{
  return __builtin_altivec_vmaxsh
           (a, __builtin_altivec_vsubshs((vector signed short)(0), a));
}

static vector signed int __ATTRS_o_ai
vec_abss(vector signed int a)
{
  return __builtin_altivec_vmaxsw
           (a, __builtin_altivec_vsubsws((vector signed int)(0), a));
}

/* vec_add */

static vector signed char __ATTRS_o_ai
vec_add(vector signed char a, vector signed char b)
{
  return a + b;
}

static vector signed char __ATTRS_o_ai
vec_add(vector bool char a, vector signed char b)
{
  return (vector signed char)a + b;
}

static vector signed char __ATTRS_o_ai
vec_add(vector signed char a, vector bool char b)
{
  return a + (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_add(vector unsigned char a, vector unsigned char b)
{
  return a + b;
}

static vector unsigned char __ATTRS_o_ai
vec_add(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a + b;
}

static vector unsigned char __ATTRS_o_ai
vec_add(vector unsigned char a, vector bool char b)
{
  return a + (vector unsigned char)b;
}

static vector short __ATTRS_o_ai
vec_add(vector short a, vector short b)
{
  return a + b;
}

static vector short __ATTRS_o_ai
vec_add(vector bool short a, vector short b)
{
  return (vector short)a + b;
}

static vector short __ATTRS_o_ai
vec_add(vector short a, vector bool short b)
{
  return a + (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_add(vector unsigned short a, vector unsigned short b)
{
  return a + b;
}

static vector unsigned short __ATTRS_o_ai
vec_add(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a + b;
}

static vector unsigned short __ATTRS_o_ai
vec_add(vector unsigned short a, vector bool short b)
{
  return a + (vector unsigned short)b;
}

static vector int __ATTRS_o_ai
vec_add(vector int a, vector int b)
{
  return a + b;
}

static vector int __ATTRS_o_ai
vec_add(vector bool int a, vector int b)
{
  return (vector int)a + b;
}

static vector int __ATTRS_o_ai
vec_add(vector int a, vector bool int b)
{
  return a + (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_add(vector unsigned int a, vector unsigned int b)
{
  return a + b;
}

static vector unsigned int __ATTRS_o_ai
vec_add(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a + b;
}

static vector unsigned int __ATTRS_o_ai
vec_add(vector unsigned int a, vector bool int b)
{
  return a + (vector unsigned int)b;
}

static vector float __ATTRS_o_ai
vec_add(vector float a, vector float b)
{
  return a + b;
}

/* vec_vaddubm */

#define __builtin_altivec_vaddubm vec_vaddubm

static vector signed char __ATTRS_o_ai
vec_vaddubm(vector signed char a, vector signed char b)
{
  return a + b;
}

static vector signed char __ATTRS_o_ai
vec_vaddubm(vector bool char a, vector signed char b)
{
  return (vector signed char)a + b;
}

static vector signed char __ATTRS_o_ai
vec_vaddubm(vector signed char a, vector bool char b)
{
  return a + (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_vaddubm(vector unsigned char a, vector unsigned char b)
{
  return a + b;
}

static vector unsigned char __ATTRS_o_ai
vec_vaddubm(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a + b;
}

static vector unsigned char __ATTRS_o_ai
vec_vaddubm(vector unsigned char a, vector bool char b)
{
  return a + (vector unsigned char)b;
}

/* vec_vadduhm */

#define __builtin_altivec_vadduhm vec_vadduhm

static vector short __ATTRS_o_ai
vec_vadduhm(vector short a, vector short b)
{
  return a + b;
}

static vector short __ATTRS_o_ai
vec_vadduhm(vector bool short a, vector short b)
{
  return (vector short)a + b;
}

static vector short __ATTRS_o_ai
vec_vadduhm(vector short a, vector bool short b)
{
  return a + (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_vadduhm(vector unsigned short a, vector unsigned short b)
{
  return a + b;
}

static vector unsigned short __ATTRS_o_ai
vec_vadduhm(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a + b;
}

static vector unsigned short __ATTRS_o_ai
vec_vadduhm(vector unsigned short a, vector bool short b)
{
  return a + (vector unsigned short)b;
}

/* vec_vadduwm */

#define __builtin_altivec_vadduwm vec_vadduwm

static vector int __ATTRS_o_ai
vec_vadduwm(vector int a, vector int b)
{
  return a + b;
}

static vector int __ATTRS_o_ai
vec_vadduwm(vector bool int a, vector int b)
{
  return (vector int)a + b;
}

static vector int __ATTRS_o_ai
vec_vadduwm(vector int a, vector bool int b)
{
  return a + (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_vadduwm(vector unsigned int a, vector unsigned int b)
{
  return a + b;
}

static vector unsigned int __ATTRS_o_ai
vec_vadduwm(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a + b;
}

static vector unsigned int __ATTRS_o_ai
vec_vadduwm(vector unsigned int a, vector bool int b)
{
  return a + (vector unsigned int)b;
}

/* vec_vaddfp */

#define __builtin_altivec_vaddfp  vec_vaddfp

static vector float __attribute__((__always_inline__))
vec_vaddfp(vector float a, vector float b)
{
  return a + b;
}

/* vec_addc */

static vector unsigned int __attribute__((__always_inline__))
vec_addc(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vaddcuw(a, b);
}

/* vec_vaddcuw */

static vector unsigned int __attribute__((__always_inline__))
vec_vaddcuw(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vaddcuw(a, b);
}

/* vec_adds */

static vector signed char __ATTRS_o_ai
vec_adds(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vaddsbs(a, b);
}

static vector signed char __ATTRS_o_ai
vec_adds(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vaddsbs((vector signed char)a, b);
}

static vector signed char __ATTRS_o_ai
vec_adds(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vaddsbs(a, (vector signed char)b);
}

static vector unsigned char __ATTRS_o_ai
vec_adds(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vaddubs(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_adds(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vaddubs((vector unsigned char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_adds(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vaddubs(a, (vector unsigned char)b);
}

static vector short __ATTRS_o_ai
vec_adds(vector short a, vector short b)
{
  return __builtin_altivec_vaddshs(a, b);
}

static vector short __ATTRS_o_ai
vec_adds(vector bool short a, vector short b)
{
  return __builtin_altivec_vaddshs((vector short)a, b);
}

static vector short __ATTRS_o_ai
vec_adds(vector short a, vector bool short b)
{
  return __builtin_altivec_vaddshs(a, (vector short)b);
}

static vector unsigned short __ATTRS_o_ai
vec_adds(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vadduhs(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_adds(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vadduhs((vector unsigned short)a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_adds(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vadduhs(a, (vector unsigned short)b);
}

static vector int __ATTRS_o_ai
vec_adds(vector int a, vector int b)
{
  return __builtin_altivec_vaddsws(a, b);
}

static vector int __ATTRS_o_ai
vec_adds(vector bool int a, vector int b)
{
  return __builtin_altivec_vaddsws((vector int)a, b);
}

static vector int __ATTRS_o_ai
vec_adds(vector int a, vector bool int b)
{
  return __builtin_altivec_vaddsws(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_adds(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vadduws(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_adds(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vadduws((vector unsigned int)a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_adds(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vadduws(a, (vector unsigned int)b);
}

/* vec_vaddsbs */

static vector signed char __ATTRS_o_ai
vec_vaddsbs(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vaddsbs(a, b);
}

static vector signed char __ATTRS_o_ai
vec_vaddsbs(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vaddsbs((vector signed char)a, b);
}

static vector signed char __ATTRS_o_ai
vec_vaddsbs(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vaddsbs(a, (vector signed char)b);
}

/* vec_vaddubs */

static vector unsigned char __ATTRS_o_ai
vec_vaddubs(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vaddubs(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vaddubs(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vaddubs((vector unsigned char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vaddubs(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vaddubs(a, (vector unsigned char)b);
}

/* vec_vaddshs */

static vector short __ATTRS_o_ai
vec_vaddshs(vector short a, vector short b)
{
  return __builtin_altivec_vaddshs(a, b);
}

static vector short __ATTRS_o_ai
vec_vaddshs(vector bool short a, vector short b)
{
  return __builtin_altivec_vaddshs((vector short)a, b);
}

static vector short __ATTRS_o_ai
vec_vaddshs(vector short a, vector bool short b)
{
  return __builtin_altivec_vaddshs(a, (vector short)b);
}

/* vec_vadduhs */

static vector unsigned short __ATTRS_o_ai
vec_vadduhs(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vadduhs(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vadduhs(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vadduhs((vector unsigned short)a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vadduhs(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vadduhs(a, (vector unsigned short)b);
}

/* vec_vaddsws */

static vector int __ATTRS_o_ai
vec_vaddsws(vector int a, vector int b)
{
  return __builtin_altivec_vaddsws(a, b);
}

static vector int __ATTRS_o_ai
vec_vaddsws(vector bool int a, vector int b)
{
  return __builtin_altivec_vaddsws((vector int)a, b);
}

static vector int __ATTRS_o_ai
vec_vaddsws(vector int a, vector bool int b)
{
  return __builtin_altivec_vaddsws(a, (vector int)b);
}

/* vec_vadduws */

static vector unsigned int __ATTRS_o_ai
vec_vadduws(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vadduws(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vadduws(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vadduws((vector unsigned int)a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vadduws(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vadduws(a, (vector unsigned int)b);
}

/* vec_and */

#define __builtin_altivec_vand vec_and

static vector signed char __ATTRS_o_ai
vec_and(vector signed char a, vector signed char b)
{
  return a & b;
}

static vector signed char __ATTRS_o_ai
vec_and(vector bool char a, vector signed char b)
{
  return (vector signed char)a & b;
}

static vector signed char __ATTRS_o_ai
vec_and(vector signed char a, vector bool char b)
{
  return a & (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_and(vector unsigned char a, vector unsigned char b)
{
  return a & b;
}

static vector unsigned char __ATTRS_o_ai
vec_and(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a & b;
}

static vector unsigned char __ATTRS_o_ai
vec_and(vector unsigned char a, vector bool char b)
{
  return a & (vector unsigned char)b;
}

static vector bool char __ATTRS_o_ai
vec_and(vector bool char a, vector bool char b)
{
  return a & b;
}

static vector short __ATTRS_o_ai
vec_and(vector short a, vector short b)
{
  return a & b;
}

static vector short __ATTRS_o_ai
vec_and(vector bool short a, vector short b)
{
  return (vector short)a & b;
}

static vector short __ATTRS_o_ai
vec_and(vector short a, vector bool short b)
{
  return a & (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_and(vector unsigned short a, vector unsigned short b)
{
  return a & b;
}

static vector unsigned short __ATTRS_o_ai
vec_and(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a & b;
}

static vector unsigned short __ATTRS_o_ai
vec_and(vector unsigned short a, vector bool short b)
{
  return a & (vector unsigned short)b;
}

static vector bool short __ATTRS_o_ai
vec_and(vector bool short a, vector bool short b)
{
  return a & b;
}

static vector int __ATTRS_o_ai
vec_and(vector int a, vector int b)
{
  return a & b;
}

static vector int __ATTRS_o_ai
vec_and(vector bool int a, vector int b)
{
  return (vector int)a & b;
}

static vector int __ATTRS_o_ai
vec_and(vector int a, vector bool int b)
{
  return a & (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_and(vector unsigned int a, vector unsigned int b)
{
  return a & b;
}

static vector unsigned int __ATTRS_o_ai
vec_and(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a & b;
}

static vector unsigned int __ATTRS_o_ai
vec_and(vector unsigned int a, vector bool int b)
{
  return a & (vector unsigned int)b;
}

static vector bool int __ATTRS_o_ai
vec_and(vector bool int a, vector bool int b)
{
  return a & b;
}

static vector float __ATTRS_o_ai
vec_and(vector float a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a & (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_and(vector bool int a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a & (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_and(vector float a, vector bool int b)
{
  vector unsigned int res = (vector unsigned int)a & (vector unsigned int)b;
  return (vector float)res;
}

/* vec_vand */

static vector signed char __ATTRS_o_ai
vec_vand(vector signed char a, vector signed char b)
{
  return a & b;
}

static vector signed char __ATTRS_o_ai
vec_vand(vector bool char a, vector signed char b)
{
  return (vector signed char)a & b;
}

static vector signed char __ATTRS_o_ai
vec_vand(vector signed char a, vector bool char b)
{
  return a & (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_vand(vector unsigned char a, vector unsigned char b)
{
  return a & b;
}

static vector unsigned char __ATTRS_o_ai
vec_vand(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a & b;
}

static vector unsigned char __ATTRS_o_ai
vec_vand(vector unsigned char a, vector bool char b)
{
  return a & (vector unsigned char)b;
}

static vector bool char __ATTRS_o_ai
vec_vand(vector bool char a, vector bool char b)
{
  return a & b;
}

static vector short __ATTRS_o_ai
vec_vand(vector short a, vector short b)
{
  return a & b;
}

static vector short __ATTRS_o_ai
vec_vand(vector bool short a, vector short b)
{
  return (vector short)a & b;
}

static vector short __ATTRS_o_ai
vec_vand(vector short a, vector bool short b)
{
  return a & (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_vand(vector unsigned short a, vector unsigned short b)
{
  return a & b;
}

static vector unsigned short __ATTRS_o_ai
vec_vand(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a & b;
}

static vector unsigned short __ATTRS_o_ai
vec_vand(vector unsigned short a, vector bool short b)
{
  return a & (vector unsigned short)b;
}

static vector bool short __ATTRS_o_ai
vec_vand(vector bool short a, vector bool short b)
{
  return a & b;
}

static vector int __ATTRS_o_ai
vec_vand(vector int a, vector int b)
{
  return a & b;
}

static vector int __ATTRS_o_ai
vec_vand(vector bool int a, vector int b)
{
  return (vector int)a & b;
}

static vector int __ATTRS_o_ai
vec_vand(vector int a, vector bool int b)
{
  return a & (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_vand(vector unsigned int a, vector unsigned int b)
{
  return a & b;
}

static vector unsigned int __ATTRS_o_ai
vec_vand(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a & b;
}

static vector unsigned int __ATTRS_o_ai
vec_vand(vector unsigned int a, vector bool int b)
{
  return a & (vector unsigned int)b;
}

static vector bool int __ATTRS_o_ai
vec_vand(vector bool int a, vector bool int b)
{
  return a & b;
}

static vector float __ATTRS_o_ai
vec_vand(vector float a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a & (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vand(vector bool int a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a & (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vand(vector float a, vector bool int b)
{
  vector unsigned int res = (vector unsigned int)a & (vector unsigned int)b;
  return (vector float)res;
}

/* vec_andc */

#define __builtin_altivec_vandc vec_andc

static vector signed char __ATTRS_o_ai
vec_andc(vector signed char a, vector signed char b)
{
  return a & ~b;
}

static vector signed char __ATTRS_o_ai
vec_andc(vector bool char a, vector signed char b)
{
  return (vector signed char)a & ~b;
}

static vector signed char __ATTRS_o_ai
vec_andc(vector signed char a, vector bool char b)
{
  return a & ~(vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_andc(vector unsigned char a, vector unsigned char b)
{
  return a & ~b;
}

static vector unsigned char __ATTRS_o_ai
vec_andc(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a & ~b;
}

static vector unsigned char __ATTRS_o_ai
vec_andc(vector unsigned char a, vector bool char b)
{
  return a & ~(vector unsigned char)b;
}

static vector bool char __ATTRS_o_ai
vec_andc(vector bool char a, vector bool char b)
{
  return a & ~b;
}

static vector short __ATTRS_o_ai
vec_andc(vector short a, vector short b)
{
  return a & ~b;
}

static vector short __ATTRS_o_ai
vec_andc(vector bool short a, vector short b)
{
  return (vector short)a & ~b;
}

static vector short __ATTRS_o_ai
vec_andc(vector short a, vector bool short b)
{
  return a & ~(vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_andc(vector unsigned short a, vector unsigned short b)
{
  return a & ~b;
}

static vector unsigned short __ATTRS_o_ai
vec_andc(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a & ~b;
}

static vector unsigned short __ATTRS_o_ai
vec_andc(vector unsigned short a, vector bool short b)
{
  return a & ~(vector unsigned short)b;
}

static vector bool short __ATTRS_o_ai
vec_andc(vector bool short a, vector bool short b)
{
  return a & ~b;
}

static vector int __ATTRS_o_ai
vec_andc(vector int a, vector int b)
{
  return a & ~b;
}

static vector int __ATTRS_o_ai
vec_andc(vector bool int a, vector int b)
{
  return (vector int)a & ~b;
}

static vector int __ATTRS_o_ai
vec_andc(vector int a, vector bool int b)
{
  return a & ~(vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_andc(vector unsigned int a, vector unsigned int b)
{
  return a & ~b;
}

static vector unsigned int __ATTRS_o_ai
vec_andc(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a & ~b;
}

static vector unsigned int __ATTRS_o_ai
vec_andc(vector unsigned int a, vector bool int b)
{
  return a & ~(vector unsigned int)b;
}

static vector bool int __ATTRS_o_ai
vec_andc(vector bool int a, vector bool int b)
{
  return a & ~b;
}

static vector float __ATTRS_o_ai
vec_andc(vector float a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a & ~(vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_andc(vector bool int a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a & ~(vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_andc(vector float a, vector bool int b)
{
  vector unsigned int res = (vector unsigned int)a & ~(vector unsigned int)b;
  return (vector float)res;
}

/* vec_vandc */

static vector signed char __ATTRS_o_ai
vec_vandc(vector signed char a, vector signed char b)
{
  return a & ~b;
}

static vector signed char __ATTRS_o_ai
vec_vandc(vector bool char a, vector signed char b)
{
  return (vector signed char)a & ~b;
}

static vector signed char __ATTRS_o_ai
vec_vandc(vector signed char a, vector bool char b)
{
  return a & ~(vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_vandc(vector unsigned char a, vector unsigned char b)
{
  return a & ~b;
}

static vector unsigned char __ATTRS_o_ai
vec_vandc(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a & ~b;
}

static vector unsigned char __ATTRS_o_ai
vec_vandc(vector unsigned char a, vector bool char b)
{
  return a & ~(vector unsigned char)b;
}

static vector bool char __ATTRS_o_ai
vec_vandc(vector bool char a, vector bool char b)
{
  return a & ~b;
}

static vector short __ATTRS_o_ai
vec_vandc(vector short a, vector short b)
{
  return a & ~b;
}

static vector short __ATTRS_o_ai
vec_vandc(vector bool short a, vector short b)
{
  return (vector short)a & ~b;
}

static vector short __ATTRS_o_ai
vec_vandc(vector short a, vector bool short b)
{
  return a & ~(vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_vandc(vector unsigned short a, vector unsigned short b)
{
  return a & ~b;
}

static vector unsigned short __ATTRS_o_ai
vec_vandc(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a & ~b;
}

static vector unsigned short __ATTRS_o_ai
vec_vandc(vector unsigned short a, vector bool short b)
{
  return a & ~(vector unsigned short)b;
}

static vector bool short __ATTRS_o_ai
vec_vandc(vector bool short a, vector bool short b)
{
  return a & ~b;
}

static vector int __ATTRS_o_ai
vec_vandc(vector int a, vector int b)
{
  return a & ~b;
}

static vector int __ATTRS_o_ai
vec_vandc(vector bool int a, vector int b)
{
  return (vector int)a & ~b;
}

static vector int __ATTRS_o_ai
vec_vandc(vector int a, vector bool int b)
{
  return a & ~(vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_vandc(vector unsigned int a, vector unsigned int b)
{
  return a & ~b;
}

static vector unsigned int __ATTRS_o_ai
vec_vandc(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a & ~b;
}

static vector unsigned int __ATTRS_o_ai
vec_vandc(vector unsigned int a, vector bool int b)
{
  return a & ~(vector unsigned int)b;
}

static vector bool int __ATTRS_o_ai
vec_vandc(vector bool int a, vector bool int b)
{
  return a & ~b;
}

static vector float __ATTRS_o_ai
vec_vandc(vector float a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a & ~(vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vandc(vector bool int a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a & ~(vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vandc(vector float a, vector bool int b)
{
  vector unsigned int res = (vector unsigned int)a & ~(vector unsigned int)b;
  return (vector float)res;
}

/* vec_avg */

static vector signed char __ATTRS_o_ai
vec_avg(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vavgsb(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_avg(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vavgub(a, b);
}

static vector short __ATTRS_o_ai
vec_avg(vector short a, vector short b)
{
  return __builtin_altivec_vavgsh(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_avg(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vavguh(a, b);
}

static vector int __ATTRS_o_ai
vec_avg(vector int a, vector int b)
{
  return __builtin_altivec_vavgsw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_avg(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vavguw(a, b);
}

/* vec_vavgsb */

static vector signed char __attribute__((__always_inline__))
vec_vavgsb(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vavgsb(a, b);
}

/* vec_vavgub */

static vector unsigned char __attribute__((__always_inline__))
vec_vavgub(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vavgub(a, b);
}

/* vec_vavgsh */

static vector short __attribute__((__always_inline__))
vec_vavgsh(vector short a, vector short b)
{
  return __builtin_altivec_vavgsh(a, b);
}

/* vec_vavguh */

static vector unsigned short __attribute__((__always_inline__))
vec_vavguh(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vavguh(a, b);
}

/* vec_vavgsw */

static vector int __attribute__((__always_inline__))
vec_vavgsw(vector int a, vector int b)
{
  return __builtin_altivec_vavgsw(a, b);
}

/* vec_vavguw */

static vector unsigned int __attribute__((__always_inline__))
vec_vavguw(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vavguw(a, b);
}

/* vec_ceil */

static vector float __attribute__((__always_inline__))
vec_ceil(vector float a)
{
  return __builtin_altivec_vrfip(a);
}

/* vec_vrfip */

static vector float __attribute__((__always_inline__))
vec_vrfip(vector float a)
{
  return __builtin_altivec_vrfip(a);
}

/* vec_cmpb */

static vector int __attribute__((__always_inline__))
vec_cmpb(vector float a, vector float b)
{
  return __builtin_altivec_vcmpbfp(a, b);
}

/* vec_vcmpbfp */

static vector int __attribute__((__always_inline__))
vec_vcmpbfp(vector float a, vector float b)
{
  return __builtin_altivec_vcmpbfp(a, b);
}

/* vec_cmpeq */

static vector bool char __ATTRS_o_ai
vec_cmpeq(vector signed char a, vector signed char b)
{
  return (vector bool char)
    __builtin_altivec_vcmpequb((vector char)a, (vector char)b);
}

static vector bool char __ATTRS_o_ai
vec_cmpeq(vector unsigned char a, vector unsigned char b)
{
  return (vector bool char)
    __builtin_altivec_vcmpequb((vector char)a, (vector char)b);
}

static vector bool short __ATTRS_o_ai
vec_cmpeq(vector short a, vector short b)
{
  return (vector bool short)__builtin_altivec_vcmpequh(a, b);
}

static vector bool short __ATTRS_o_ai
vec_cmpeq(vector unsigned short a, vector unsigned short b)
{
  return (vector bool short)
    __builtin_altivec_vcmpequh((vector short)a, (vector short)b);
}

static vector bool int __ATTRS_o_ai
vec_cmpeq(vector int a, vector int b)
{
  return (vector bool int)__builtin_altivec_vcmpequw(a, b);
}

static vector bool int __ATTRS_o_ai
vec_cmpeq(vector unsigned int a, vector unsigned int b)
{
  return (vector bool int)
    __builtin_altivec_vcmpequw((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_cmpeq(vector float a, vector float b)
{
  return (vector bool int)__builtin_altivec_vcmpeqfp(a, b);
}

/* vec_cmpge */

static vector bool int __attribute__((__always_inline__))
vec_cmpge(vector float a, vector float b)
{
  return (vector bool int)__builtin_altivec_vcmpgefp(a, b);
}

/* vec_vcmpgefp */

static vector bool int __attribute__((__always_inline__))
vec_vcmpgefp(vector float a, vector float b)
{
  return (vector bool int)__builtin_altivec_vcmpgefp(a, b);
}

/* vec_cmpgt */

static vector bool char __ATTRS_o_ai
vec_cmpgt(vector signed char a, vector signed char b)
{
  return (vector bool char)__builtin_altivec_vcmpgtsb(a, b);
}

static vector bool char __ATTRS_o_ai
vec_cmpgt(vector unsigned char a, vector unsigned char b)
{
  return (vector bool char)__builtin_altivec_vcmpgtub(a, b);
}

static vector bool short __ATTRS_o_ai
vec_cmpgt(vector short a, vector short b)
{
  return (vector bool short)__builtin_altivec_vcmpgtsh(a, b);
}

static vector bool short __ATTRS_o_ai
vec_cmpgt(vector unsigned short a, vector unsigned short b)
{
  return (vector bool short)__builtin_altivec_vcmpgtuh(a, b);
}

static vector bool int __ATTRS_o_ai
vec_cmpgt(vector int a, vector int b)
{
  return (vector bool int)__builtin_altivec_vcmpgtsw(a, b);
}

static vector bool int __ATTRS_o_ai
vec_cmpgt(vector unsigned int a, vector unsigned int b)
{
  return (vector bool int)__builtin_altivec_vcmpgtuw(a, b);
}

static vector bool int __ATTRS_o_ai
vec_cmpgt(vector float a, vector float b)
{
  return (vector bool int)__builtin_altivec_vcmpgtfp(a, b);
}

/* vec_vcmpgtsb */

static vector bool char __attribute__((__always_inline__))
vec_vcmpgtsb(vector signed char a, vector signed char b)
{
  return (vector bool char)__builtin_altivec_vcmpgtsb(a, b);
}

/* vec_vcmpgtub */

static vector bool char __attribute__((__always_inline__))
vec_vcmpgtub(vector unsigned char a, vector unsigned char b)
{
  return (vector bool char)__builtin_altivec_vcmpgtub(a, b);
}

/* vec_vcmpgtsh */

static vector bool short __attribute__((__always_inline__))
vec_vcmpgtsh(vector short a, vector short b)
{
  return (vector bool short)__builtin_altivec_vcmpgtsh(a, b);
}

/* vec_vcmpgtuh */

static vector bool short __attribute__((__always_inline__))
vec_vcmpgtuh(vector unsigned short a, vector unsigned short b)
{
  return (vector bool short)__builtin_altivec_vcmpgtuh(a, b);
}

/* vec_vcmpgtsw */

static vector bool int __attribute__((__always_inline__))
vec_vcmpgtsw(vector int a, vector int b)
{
  return (vector bool int)__builtin_altivec_vcmpgtsw(a, b);
}

/* vec_vcmpgtuw */

static vector bool int __attribute__((__always_inline__))
vec_vcmpgtuw(vector unsigned int a, vector unsigned int b)
{
  return (vector bool int)__builtin_altivec_vcmpgtuw(a, b);
}

/* vec_vcmpgtfp */

static vector bool int __attribute__((__always_inline__))
vec_vcmpgtfp(vector float a, vector float b)
{
  return (vector bool int)__builtin_altivec_vcmpgtfp(a, b);
}

/* vec_cmple */

static vector bool int __attribute__((__always_inline__))
vec_cmple(vector float a, vector float b)
{
  return (vector bool int)__builtin_altivec_vcmpgefp(b, a);
}

/* vec_cmplt */

static vector bool char __ATTRS_o_ai
vec_cmplt(vector signed char a, vector signed char b)
{
  return (vector bool char)__builtin_altivec_vcmpgtsb(b, a);
}

static vector bool char __ATTRS_o_ai
vec_cmplt(vector unsigned char a, vector unsigned char b)
{
  return (vector bool char)__builtin_altivec_vcmpgtub(b, a);
}

static vector bool short __ATTRS_o_ai
vec_cmplt(vector short a, vector short b)
{
  return (vector bool short)__builtin_altivec_vcmpgtsh(b, a);
}

static vector bool short __ATTRS_o_ai
vec_cmplt(vector unsigned short a, vector unsigned short b)
{
  return (vector bool short)__builtin_altivec_vcmpgtuh(b, a);
}

static vector bool int __ATTRS_o_ai
vec_cmplt(vector int a, vector int b)
{
  return (vector bool int)__builtin_altivec_vcmpgtsw(b, a);
}

static vector bool int __ATTRS_o_ai
vec_cmplt(vector unsigned int a, vector unsigned int b)
{
  return (vector bool int)__builtin_altivec_vcmpgtuw(b, a);
}

static vector bool int __ATTRS_o_ai
vec_cmplt(vector float a, vector float b)
{
  return (vector bool int)__builtin_altivec_vcmpgtfp(b, a);
}

/* vec_ctf */

static vector float __ATTRS_o_ai
vec_ctf(vector int a, int b)
{
  return __builtin_altivec_vcfsx(a, b);
}

static vector float __ATTRS_o_ai
vec_ctf(vector unsigned int a, int b)
{
  return __builtin_altivec_vcfux((vector int)a, b);
}

/* vec_vcfsx */

static vector float __attribute__((__always_inline__))
vec_vcfsx(vector int a, int b)
{
  return __builtin_altivec_vcfsx(a, b);
}

/* vec_vcfux */

static vector float __attribute__((__always_inline__))
vec_vcfux(vector unsigned int a, int b)
{
  return __builtin_altivec_vcfux((vector int)a, b);
}

/* vec_cts */

static vector int __attribute__((__always_inline__))
vec_cts(vector float a, int b)
{
  return __builtin_altivec_vctsxs(a, b);
}

/* vec_vctsxs */

static vector int __attribute__((__always_inline__))
vec_vctsxs(vector float a, int b)
{
  return __builtin_altivec_vctsxs(a, b);
}

/* vec_ctu */

static vector unsigned int __attribute__((__always_inline__))
vec_ctu(vector float a, int b)
{
  return __builtin_altivec_vctuxs(a, b);
}

/* vec_vctuxs */

static vector unsigned int __attribute__((__always_inline__))
vec_vctuxs(vector float a, int b)
{
  return __builtin_altivec_vctuxs(a, b);
}

/* vec_dss */

static void __attribute__((__always_inline__))
vec_dss(int a)
{
  __builtin_altivec_dss(a);
}

/* vec_dssall */

static void __attribute__((__always_inline__))
vec_dssall(void)
{
  __builtin_altivec_dssall();
}

/* vec_dst */

static void __attribute__((__always_inline__))
vec_dst(const void *a, int b, int c)
{
  __builtin_altivec_dst(a, b, c);
}

/* vec_dstst */

static void __attribute__((__always_inline__))
vec_dstst(const void *a, int b, int c)
{
  __builtin_altivec_dstst(a, b, c);
}

/* vec_dststt */

static void __attribute__((__always_inline__))
vec_dststt(const void *a, int b, int c)
{
  __builtin_altivec_dststt(a, b, c);
}

/* vec_dstt */

static void __attribute__((__always_inline__))
vec_dstt(const void *a, int b, int c)
{
  __builtin_altivec_dstt(a, b, c);
}

/* vec_expte */

static vector float __attribute__((__always_inline__))
vec_expte(vector float a)
{
  return __builtin_altivec_vexptefp(a);
}

/* vec_vexptefp */

static vector float __attribute__((__always_inline__))
vec_vexptefp(vector float a)
{
  return __builtin_altivec_vexptefp(a);
}

/* vec_floor */

static vector float __attribute__((__always_inline__))
vec_floor(vector float a)
{
  return __builtin_altivec_vrfim(a);
}

/* vec_vrfim */

static vector float __attribute__((__always_inline__))
vec_vrfim(vector float a)
{
  return __builtin_altivec_vrfim(a);
}

/* vec_ld */

static vector signed char __ATTRS_o_ai
vec_ld(int a, const vector signed char *b)
{
  return (vector signed char)__builtin_altivec_lvx(a, b);
}

static vector signed char __ATTRS_o_ai
vec_ld(int a, const signed char *b)
{
  return (vector signed char)__builtin_altivec_lvx(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_ld(int a, const vector unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvx(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_ld(int a, const unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvx(a, b);
}

static vector bool char __ATTRS_o_ai
vec_ld(int a, const vector bool char *b)
{
  return (vector bool char)__builtin_altivec_lvx(a, b);
}

static vector short __ATTRS_o_ai
vec_ld(int a, const vector short *b)
{
  return (vector short)__builtin_altivec_lvx(a, b);
}

static vector short __ATTRS_o_ai
vec_ld(int a, const short *b)
{
  return (vector short)__builtin_altivec_lvx(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_ld(int a, const vector unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvx(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_ld(int a, const unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvx(a, b);
}

static vector bool short __ATTRS_o_ai
vec_ld(int a, const vector bool short *b)
{
  return (vector bool short)__builtin_altivec_lvx(a, b);
}

static vector pixel __ATTRS_o_ai
vec_ld(int a, const vector pixel *b)
{
  return (vector pixel)__builtin_altivec_lvx(a, b);
}

static vector int __ATTRS_o_ai
vec_ld(int a, const vector int *b)
{
  return (vector int)__builtin_altivec_lvx(a, b);
}

static vector int __ATTRS_o_ai
vec_ld(int a, const int *b)
{
  return (vector int)__builtin_altivec_lvx(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_ld(int a, const vector unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvx(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_ld(int a, const unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvx(a, b);
}

static vector bool int __ATTRS_o_ai
vec_ld(int a, const vector bool int *b)
{
  return (vector bool int)__builtin_altivec_lvx(a, b);
}

static vector float __ATTRS_o_ai
vec_ld(int a, const vector float *b)
{
  return (vector float)__builtin_altivec_lvx(a, b);
}

static vector float __ATTRS_o_ai
vec_ld(int a, const float *b)
{
  return (vector float)__builtin_altivec_lvx(a, b);
}

/* vec_lvx */

static vector signed char __ATTRS_o_ai
vec_lvx(int a, const vector signed char *b)
{
  return (vector signed char)__builtin_altivec_lvx(a, b);
}

static vector signed char __ATTRS_o_ai
vec_lvx(int a, const signed char *b)
{
  return (vector signed char)__builtin_altivec_lvx(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvx(int a, const vector unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvx(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvx(int a, const unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvx(a, b);
}

static vector bool char __ATTRS_o_ai
vec_lvx(int a, const vector bool char *b)
{
  return (vector bool char)__builtin_altivec_lvx(a, b);
}

static vector short __ATTRS_o_ai
vec_lvx(int a, const vector short *b)
{
  return (vector short)__builtin_altivec_lvx(a, b);
}

static vector short __ATTRS_o_ai
vec_lvx(int a, const short *b)
{
  return (vector short)__builtin_altivec_lvx(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_lvx(int a, const vector unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvx(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_lvx(int a, const unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvx(a, b);
}

static vector bool short __ATTRS_o_ai
vec_lvx(int a, const vector bool short *b)
{
  return (vector bool short)__builtin_altivec_lvx(a, b);
}

static vector pixel __ATTRS_o_ai
vec_lvx(int a, const vector pixel *b)
{
  return (vector pixel)__builtin_altivec_lvx(a, b);
}

static vector int __ATTRS_o_ai
vec_lvx(int a, const vector int *b)
{
  return (vector int)__builtin_altivec_lvx(a, b);
}

static vector int __ATTRS_o_ai
vec_lvx(int a, const int *b)
{
  return (vector int)__builtin_altivec_lvx(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_lvx(int a, const vector unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvx(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_lvx(int a, const unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvx(a, b);
}

static vector bool int __ATTRS_o_ai
vec_lvx(int a, const vector bool int *b)
{
  return (vector bool int)__builtin_altivec_lvx(a, b);
}

static vector float __ATTRS_o_ai
vec_lvx(int a, const vector float *b)
{
  return (vector float)__builtin_altivec_lvx(a, b);
}

static vector float __ATTRS_o_ai
vec_lvx(int a, const float *b)
{
  return (vector float)__builtin_altivec_lvx(a, b);
}

/* vec_lde */

static vector signed char __ATTRS_o_ai
vec_lde(int a, const vector signed char *b)
{
  return (vector signed char)__builtin_altivec_lvebx(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lde(int a, const vector unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvebx(a, b);
}

static vector short __ATTRS_o_ai
vec_lde(int a, const vector short *b)
{
  return (vector short)__builtin_altivec_lvehx(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_lde(int a, const vector unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvehx(a, b);
}

static vector int __ATTRS_o_ai
vec_lde(int a, const vector int *b)
{
  return (vector int)__builtin_altivec_lvewx(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_lde(int a, const vector unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvewx(a, b);
}

static vector float __ATTRS_o_ai
vec_lde(int a, const vector float *b)
{
  return (vector float)__builtin_altivec_lvewx(a, b);
}

/* vec_lvebx */

static vector signed char __ATTRS_o_ai
vec_lvebx(int a, const vector signed char *b)
{
  return (vector signed char)__builtin_altivec_lvebx(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvebx(int a, const vector unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvebx(a, b);
}

/* vec_lvehx */

static vector short __ATTRS_o_ai
vec_lvehx(int a, const vector short *b)
{
  return (vector short)__builtin_altivec_lvehx(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_lvehx(int a, const vector unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvehx(a, b);
}

/* vec_lvewx */

static vector int __ATTRS_o_ai
vec_lvewx(int a, const vector int *b)
{
  return (vector int)__builtin_altivec_lvewx(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_lvewx(int a, const vector unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvewx(a, b);
}

static vector float __ATTRS_o_ai
vec_lvewx(int a, const vector float *b)
{
  return (vector float)__builtin_altivec_lvewx(a, b);
}

/* vec_ldl */

static vector signed char __ATTRS_o_ai
vec_ldl(int a, const vector signed char *b)
{
  return (vector signed char)__builtin_altivec_lvxl(a, b);
}

static vector signed char __ATTRS_o_ai
vec_ldl(int a, const signed char *b)
{
  return (vector signed char)__builtin_altivec_lvxl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_ldl(int a, const vector unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvxl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_ldl(int a, const unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvxl(a, b);
}

static vector bool char __ATTRS_o_ai
vec_ldl(int a, const vector bool char *b)
{
  return (vector bool char)__builtin_altivec_lvxl(a, b);
}

static vector short __ATTRS_o_ai
vec_ldl(int a, const vector short *b)
{
  return (vector short)__builtin_altivec_lvxl(a, b);
}

static vector short __ATTRS_o_ai
vec_ldl(int a, const short *b)
{
  return (vector short)__builtin_altivec_lvxl(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_ldl(int a, const vector unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvxl(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_ldl(int a, const unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvxl(a, b);
}

static vector bool short __ATTRS_o_ai
vec_ldl(int a, const vector bool short *b)
{
  return (vector bool short)__builtin_altivec_lvxl(a, b);
}

static vector pixel __ATTRS_o_ai
vec_ldl(int a, const vector pixel *b)
{
  return (vector pixel short)__builtin_altivec_lvxl(a, b);
}

static vector int __ATTRS_o_ai
vec_ldl(int a, const vector int *b)
{
  return (vector int)__builtin_altivec_lvxl(a, b);
}

static vector int __ATTRS_o_ai
vec_ldl(int a, const int *b)
{
  return (vector int)__builtin_altivec_lvxl(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_ldl(int a, const vector unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvxl(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_ldl(int a, const unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvxl(a, b);
}

static vector bool int __ATTRS_o_ai
vec_ldl(int a, const vector bool int *b)
{
  return (vector bool int)__builtin_altivec_lvxl(a, b);
}

static vector float __ATTRS_o_ai
vec_ldl(int a, const vector float *b)
{
  return (vector float)__builtin_altivec_lvxl(a, b);
}

static vector float __ATTRS_o_ai
vec_ldl(int a, const float *b)
{
  return (vector float)__builtin_altivec_lvxl(a, b);
}

/* vec_lvxl */

static vector signed char __ATTRS_o_ai
vec_lvxl(int a, const vector signed char *b)
{
  return (vector signed char)__builtin_altivec_lvxl(a, b);
}

static vector signed char __ATTRS_o_ai
vec_lvxl(int a, const signed char *b)
{
  return (vector signed char)__builtin_altivec_lvxl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvxl(int a, const vector unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvxl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvxl(int a, const unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvxl(a, b);
}

static vector bool char __ATTRS_o_ai
vec_lvxl(int a, const vector bool char *b)
{
  return (vector bool char)__builtin_altivec_lvxl(a, b);
}

static vector short __ATTRS_o_ai
vec_lvxl(int a, const vector short *b)
{
  return (vector short)__builtin_altivec_lvxl(a, b);
}

static vector short __ATTRS_o_ai
vec_lvxl(int a, const short *b)
{
  return (vector short)__builtin_altivec_lvxl(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_lvxl(int a, const vector unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvxl(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_lvxl(int a, const unsigned short *b)
{
  return (vector unsigned short)__builtin_altivec_lvxl(a, b);
}

static vector bool short __ATTRS_o_ai
vec_lvxl(int a, const vector bool short *b)
{
  return (vector bool short)__builtin_altivec_lvxl(a, b);
}

static vector pixel __ATTRS_o_ai
vec_lvxl(int a, const vector pixel *b)
{
  return (vector pixel)__builtin_altivec_lvxl(a, b);
}

static vector int __ATTRS_o_ai
vec_lvxl(int a, const vector int *b)
{
  return (vector int)__builtin_altivec_lvxl(a, b);
}

static vector int __ATTRS_o_ai
vec_lvxl(int a, const int *b)
{
  return (vector int)__builtin_altivec_lvxl(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_lvxl(int a, const vector unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvxl(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_lvxl(int a, const unsigned int *b)
{
  return (vector unsigned int)__builtin_altivec_lvxl(a, b);
}

static vector bool int __ATTRS_o_ai
vec_lvxl(int a, const vector bool int *b)
{
  return (vector bool int)__builtin_altivec_lvxl(a, b);
}

static vector float __ATTRS_o_ai
vec_lvxl(int a, const vector float *b)
{
  return (vector float)__builtin_altivec_lvxl(a, b);
}

static vector float __ATTRS_o_ai
vec_lvxl(int a, const float *b)
{
  return (vector float)__builtin_altivec_lvxl(a, b);
}

/* vec_loge */

static vector float __attribute__((__always_inline__))
vec_loge(vector float a)
{
  return __builtin_altivec_vlogefp(a);
}

/* vec_vlogefp */

static vector float __attribute__((__always_inline__))
vec_vlogefp(vector float a)
{
  return __builtin_altivec_vlogefp(a);
}

/* vec_lvsl */

static vector unsigned char __ATTRS_o_ai
vec_lvsl(int a, const signed char *b)
{
  return (vector unsigned char)__builtin_altivec_lvsl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsl(int a, const unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvsl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsl(int a, const short *b)
{
  return (vector unsigned char)__builtin_altivec_lvsl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsl(int a, const unsigned short *b)
{
  return (vector unsigned char)__builtin_altivec_lvsl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsl(int a, const int *b)
{
  return (vector unsigned char)__builtin_altivec_lvsl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsl(int a, const unsigned int *b)
{
  return (vector unsigned char)__builtin_altivec_lvsl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsl(int a, const float *b)
{
  return (vector unsigned char)__builtin_altivec_lvsl(a, b);
}

/* vec_lvsr */

static vector unsigned char __ATTRS_o_ai
vec_lvsr(int a, const signed char *b)
{
  return (vector unsigned char)__builtin_altivec_lvsr(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsr(int a, const unsigned char *b)
{
  return (vector unsigned char)__builtin_altivec_lvsr(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsr(int a, const short *b)
{
  return (vector unsigned char)__builtin_altivec_lvsr(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsr(int a, const unsigned short *b)
{
  return (vector unsigned char)__builtin_altivec_lvsr(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsr(int a, const int *b)
{
  return (vector unsigned char)__builtin_altivec_lvsr(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsr(int a, const unsigned int *b)
{
  return (vector unsigned char)__builtin_altivec_lvsr(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_lvsr(int a, const float *b)
{
  return (vector unsigned char)__builtin_altivec_lvsr(a, b);
}

/* vec_madd */

static vector float __attribute__((__always_inline__))
vec_madd(vector float a, vector float b, vector float c)
{
  return __builtin_altivec_vmaddfp(a, b, c);
}

/* vec_vmaddfp */

static vector float __attribute__((__always_inline__))
vec_vmaddfp(vector float a, vector float b, vector float c)
{
  return __builtin_altivec_vmaddfp(a, b, c);
}

/* vec_madds */

static vector signed short __attribute__((__always_inline__))
vec_madds(vector signed short a, vector signed short b, vector signed short c)
{
  return __builtin_altivec_vmhaddshs(a, b, c);
}

/* vec_vmhaddshs */
static vector signed short __attribute__((__always_inline__))
vec_vmhaddshs(vector signed short a,
              vector signed short b, 
              vector signed short c)
{
  return __builtin_altivec_vmhaddshs(a, b, c);
}

/* vec_max */

static vector signed char __ATTRS_o_ai
vec_max(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vmaxsb(a, b);
}

static vector signed char __ATTRS_o_ai
vec_max(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vmaxsb((vector signed char)a, b);
}

static vector signed char __ATTRS_o_ai
vec_max(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vmaxsb(a, (vector signed char)b);
}

static vector unsigned char __ATTRS_o_ai
vec_max(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vmaxub(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_max(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vmaxub((vector unsigned char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_max(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vmaxub(a, (vector unsigned char)b);
}

static vector short __ATTRS_o_ai
vec_max(vector short a, vector short b)
{
  return __builtin_altivec_vmaxsh(a, b);
}

static vector short __ATTRS_o_ai
vec_max(vector bool short a, vector short b)
{
  return __builtin_altivec_vmaxsh((vector short)a, b);
}

static vector short __ATTRS_o_ai
vec_max(vector short a, vector bool short b)
{
  return __builtin_altivec_vmaxsh(a, (vector short)b);
}

static vector unsigned short __ATTRS_o_ai
vec_max(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vmaxuh(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_max(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vmaxuh((vector unsigned short)a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_max(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vmaxuh(a, (vector unsigned short)b);
}

static vector int __ATTRS_o_ai
vec_max(vector int a, vector int b)
{
  return __builtin_altivec_vmaxsw(a, b);
}

static vector int __ATTRS_o_ai
vec_max(vector bool int a, vector int b)
{
  return __builtin_altivec_vmaxsw((vector int)a, b);
}

static vector int __ATTRS_o_ai
vec_max(vector int a, vector bool int b)
{
  return __builtin_altivec_vmaxsw(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_max(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vmaxuw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_max(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vmaxuw((vector unsigned int)a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_max(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vmaxuw(a, (vector unsigned int)b);
}

static vector float __ATTRS_o_ai
vec_max(vector float a, vector float b)
{
  return __builtin_altivec_vmaxfp(a, b);
}

/* vec_vmaxsb */

static vector signed char __ATTRS_o_ai
vec_vmaxsb(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vmaxsb(a, b);
}

static vector signed char __ATTRS_o_ai
vec_vmaxsb(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vmaxsb((vector signed char)a, b);
}

static vector signed char __ATTRS_o_ai
vec_vmaxsb(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vmaxsb(a, (vector signed char)b);
}

/* vec_vmaxub */

static vector unsigned char __ATTRS_o_ai
vec_vmaxub(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vmaxub(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vmaxub(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vmaxub((vector unsigned char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vmaxub(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vmaxub(a, (vector unsigned char)b);
}

/* vec_vmaxsh */

static vector short __ATTRS_o_ai
vec_vmaxsh(vector short a, vector short b)
{
  return __builtin_altivec_vmaxsh(a, b);
}

static vector short __ATTRS_o_ai
vec_vmaxsh(vector bool short a, vector short b)
{
  return __builtin_altivec_vmaxsh((vector short)a, b);
}

static vector short __ATTRS_o_ai
vec_vmaxsh(vector short a, vector bool short b)
{
  return __builtin_altivec_vmaxsh(a, (vector short)b);
}

/* vec_vmaxuh */

static vector unsigned short __ATTRS_o_ai
vec_vmaxuh(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vmaxuh(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vmaxuh(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vmaxuh((vector unsigned short)a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vmaxuh(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vmaxuh(a, (vector unsigned short)b);
}

/* vec_vmaxsw */

static vector int __ATTRS_o_ai
vec_vmaxsw(vector int a, vector int b)
{
  return __builtin_altivec_vmaxsw(a, b);
}

static vector int __ATTRS_o_ai
vec_vmaxsw(vector bool int a, vector int b)
{
  return __builtin_altivec_vmaxsw((vector int)a, b);
}

static vector int __ATTRS_o_ai
vec_vmaxsw(vector int a, vector bool int b)
{
  return __builtin_altivec_vmaxsw(a, (vector int)b);
}

/* vec_vmaxuw */

static vector unsigned int __ATTRS_o_ai
vec_vmaxuw(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vmaxuw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vmaxuw(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vmaxuw((vector unsigned int)a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vmaxuw(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vmaxuw(a, (vector unsigned int)b);
}

/* vec_vmaxfp */

static vector float __attribute__((__always_inline__))
vec_vmaxfp(vector float a, vector float b)
{
  return __builtin_altivec_vmaxfp(a, b);
}

/* vec_mergeh */

static vector signed char __ATTRS_o_ai
vec_mergeh(vector signed char a, vector signed char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 
     0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
}

static vector unsigned char __ATTRS_o_ai
vec_mergeh(vector unsigned char a, vector unsigned char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 
     0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
}

static vector bool char __ATTRS_o_ai
vec_mergeh(vector bool char a, vector bool char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 
     0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
}

static vector short __ATTRS_o_ai
vec_mergeh(vector short a, vector short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
     0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
}

static vector unsigned short __ATTRS_o_ai
vec_mergeh(vector unsigned short a, vector unsigned short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
     0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
}

static vector bool short __ATTRS_o_ai
vec_mergeh(vector bool short a, vector bool short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
     0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
}

static vector pixel __ATTRS_o_ai
vec_mergeh(vector pixel a, vector pixel b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
     0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
}

static vector int __ATTRS_o_ai
vec_mergeh(vector int a, vector int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
     0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
}

static vector unsigned int __ATTRS_o_ai
vec_mergeh(vector unsigned int a, vector unsigned int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
     0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
}

static vector bool int __ATTRS_o_ai
vec_mergeh(vector bool int a, vector bool int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
     0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
}

static vector float __ATTRS_o_ai
vec_mergeh(vector float a, vector float b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
     0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
}

/* vec_vmrghb */

#define __builtin_altivec_vmrghb vec_vmrghb

static vector signed char __ATTRS_o_ai
vec_vmrghb(vector signed char a, vector signed char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 
     0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
}

static vector unsigned char __ATTRS_o_ai
vec_vmrghb(vector unsigned char a, vector unsigned char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 
     0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
}

static vector bool char __ATTRS_o_ai
vec_vmrghb(vector bool char a, vector bool char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x10, 0x01, 0x11, 0x02, 0x12, 0x03, 0x13, 
     0x04, 0x14, 0x05, 0x15, 0x06, 0x16, 0x07, 0x17));
}

/* vec_vmrghh */

#define __builtin_altivec_vmrghh vec_vmrghh

static vector short __ATTRS_o_ai
vec_vmrghh(vector short a, vector short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
     0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
}

static vector unsigned short __ATTRS_o_ai
vec_vmrghh(vector unsigned short a, vector unsigned short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
     0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
}

static vector bool short __ATTRS_o_ai
vec_vmrghh(vector bool short a, vector bool short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
     0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
}

static vector pixel __ATTRS_o_ai
vec_vmrghh(vector pixel a, vector pixel b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x10, 0x11, 0x02, 0x03, 0x12, 0x13,
     0x04, 0x05, 0x14, 0x15, 0x06, 0x07, 0x16, 0x17));
}

/* vec_vmrghw */

#define __builtin_altivec_vmrghw vec_vmrghw

static vector int __ATTRS_o_ai
vec_vmrghw(vector int a, vector int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
     0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
}

static vector unsigned int __ATTRS_o_ai
vec_vmrghw(vector unsigned int a, vector unsigned int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
     0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
}

static vector bool int __ATTRS_o_ai
vec_vmrghw(vector bool int a, vector bool int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
     0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
}

static vector float __ATTRS_o_ai
vec_vmrghw(vector float a, vector float b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
     0x04, 0x05, 0x06, 0x07, 0x14, 0x15, 0x16, 0x17));
}

/* vec_mergel */

static vector signed char __ATTRS_o_ai
vec_mergel(vector signed char a, vector signed char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B, 
     0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
}

static vector unsigned char __ATTRS_o_ai
vec_mergel(vector unsigned char a, vector unsigned char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B, 
     0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
}

static vector bool char __ATTRS_o_ai
vec_mergel(vector bool char a, vector bool char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B, 
     0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
}

static vector short __ATTRS_o_ai
vec_mergel(vector short a, vector short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
     0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
}

static vector unsigned short __ATTRS_o_ai
vec_mergel(vector unsigned short a, vector unsigned short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
     0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
}

static vector bool short __ATTRS_o_ai
vec_mergel(vector bool short a, vector bool short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
     0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
}

static vector pixel __ATTRS_o_ai
vec_mergel(vector pixel a, vector pixel b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
     0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
}

static vector int __ATTRS_o_ai
vec_mergel(vector int a, vector int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
     0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
}

static vector unsigned int __ATTRS_o_ai
vec_mergel(vector unsigned int a, vector unsigned int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
     0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
}

static vector bool int __ATTRS_o_ai
vec_mergel(vector bool int a, vector bool int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
     0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
}

static vector float __ATTRS_o_ai
vec_mergel(vector float a, vector float b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
     0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
}

/* vec_vmrglb */

#define __builtin_altivec_vmrglb vec_vmrglb

static vector signed char __ATTRS_o_ai
vec_vmrglb(vector signed char a, vector signed char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B, 
     0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
}

static vector unsigned char __ATTRS_o_ai
vec_vmrglb(vector unsigned char a, vector unsigned char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B, 
     0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
}

static vector bool char __ATTRS_o_ai
vec_vmrglb(vector bool char a, vector bool char b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x18, 0x09, 0x19, 0x0A, 0x1A, 0x0B, 0x1B, 
     0x0C, 0x1C, 0x0D, 0x1D, 0x0E, 0x1E, 0x0F, 0x1F));
}

/* vec_vmrglh */

#define __builtin_altivec_vmrglh vec_vmrglh

static vector short __ATTRS_o_ai
vec_vmrglh(vector short a, vector short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
     0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
}

static vector unsigned short __ATTRS_o_ai
vec_vmrglh(vector unsigned short a, vector unsigned short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
     0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
}

static vector bool short __ATTRS_o_ai
vec_vmrglh(vector bool short a, vector bool short b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
     0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
}

static vector pixel __ATTRS_o_ai
vec_vmrglh(vector pixel a, vector pixel b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x18, 0x19, 0x0A, 0x0B, 0x1A, 0x1B,
     0x0C, 0x0D, 0x1C, 0x1D, 0x0E, 0x0F, 0x1E, 0x1F));
}

/* vec_vmrglw */

#define __builtin_altivec_vmrglw vec_vmrglw

static vector int __ATTRS_o_ai
vec_vmrglw(vector int a, vector int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
     0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
}

static vector unsigned int __ATTRS_o_ai
vec_vmrglw(vector unsigned int a, vector unsigned int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
     0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
}

static vector bool int __ATTRS_o_ai
vec_vmrglw(vector bool int a, vector bool int b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
     0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
}

static vector float __ATTRS_o_ai
vec_vmrglw(vector float a, vector float b)
{
  return vec_perm(a, b, (vector unsigned char)
    (0x08, 0x09, 0x0A, 0x0B, 0x18, 0x19, 0x1A, 0x1B,
     0x0C, 0x0D, 0x0E, 0x0F, 0x1C, 0x1D, 0x1E, 0x1F));
}

/* vec_mfvscr */

static vector unsigned short __attribute__((__always_inline__))
vec_mfvscr(void)
{
  return __builtin_altivec_mfvscr();
}

/* vec_min */

static vector signed char __ATTRS_o_ai
vec_min(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vminsb(a, b);
}

static vector signed char __ATTRS_o_ai
vec_min(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vminsb((vector signed char)a, b);
}

static vector signed char __ATTRS_o_ai
vec_min(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vminsb(a, (vector signed char)b);
}

static vector unsigned char __ATTRS_o_ai
vec_min(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vminub(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_min(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vminub((vector unsigned char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_min(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vminub(a, (vector unsigned char)b);
}

static vector short __ATTRS_o_ai
vec_min(vector short a, vector short b)
{
  return __builtin_altivec_vminsh(a, b);
}

static vector short __ATTRS_o_ai
vec_min(vector bool short a, vector short b)
{
  return __builtin_altivec_vminsh((vector short)a, b);
}

static vector short __ATTRS_o_ai
vec_min(vector short a, vector bool short b)
{
  return __builtin_altivec_vminsh(a, (vector short)b);
}

static vector unsigned short __ATTRS_o_ai
vec_min(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vminuh(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_min(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vminuh((vector unsigned short)a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_min(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vminuh(a, (vector unsigned short)b);
}

static vector int __ATTRS_o_ai
vec_min(vector int a, vector int b)
{
  return __builtin_altivec_vminsw(a, b);
}

static vector int __ATTRS_o_ai
vec_min(vector bool int a, vector int b)
{
  return __builtin_altivec_vminsw((vector int)a, b);
}

static vector int __ATTRS_o_ai
vec_min(vector int a, vector bool int b)
{
  return __builtin_altivec_vminsw(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_min(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vminuw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_min(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vminuw((vector unsigned int)a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_min(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vminuw(a, (vector unsigned int)b);
}

static vector float __ATTRS_o_ai
vec_min(vector float a, vector float b)
{
  return __builtin_altivec_vminfp(a, b);
}

/* vec_vminsb */

static vector signed char __ATTRS_o_ai
vec_vminsb(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vminsb(a, b);
}

static vector signed char __ATTRS_o_ai
vec_vminsb(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vminsb((vector signed char)a, b);
}

static vector signed char __ATTRS_o_ai
vec_vminsb(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vminsb(a, (vector signed char)b);
}

/* vec_vminub */

static vector unsigned char __ATTRS_o_ai
vec_vminub(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vminub(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vminub(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vminub((vector unsigned char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vminub(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vminub(a, (vector unsigned char)b);
}

/* vec_vminsh */

static vector short __ATTRS_o_ai
vec_vminsh(vector short a, vector short b)
{
  return __builtin_altivec_vminsh(a, b);
}

static vector short __ATTRS_o_ai
vec_vminsh(vector bool short a, vector short b)
{
  return __builtin_altivec_vminsh((vector short)a, b);
}

static vector short __ATTRS_o_ai
vec_vminsh(vector short a, vector bool short b)
{
  return __builtin_altivec_vminsh(a, (vector short)b);
}

/* vec_vminuh */

static vector unsigned short __ATTRS_o_ai
vec_vminuh(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vminuh(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vminuh(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vminuh((vector unsigned short)a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vminuh(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vminuh(a, (vector unsigned short)b);
}

/* vec_vminsw */

static vector int __ATTRS_o_ai
vec_vminsw(vector int a, vector int b)
{
  return __builtin_altivec_vminsw(a, b);
}

static vector int __ATTRS_o_ai
vec_vminsw(vector bool int a, vector int b)
{
  return __builtin_altivec_vminsw((vector int)a, b);
}

static vector int __ATTRS_o_ai
vec_vminsw(vector int a, vector bool int b)
{
  return __builtin_altivec_vminsw(a, (vector int)b);
}

/* vec_vminuw */

static vector unsigned int __ATTRS_o_ai
vec_vminuw(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vminuw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vminuw(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vminuw((vector unsigned int)a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vminuw(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vminuw(a, (vector unsigned int)b);
}

/* vec_vminfp */

static vector float __attribute__((__always_inline__))
vec_vminfp(vector float a, vector float b)
{
  return __builtin_altivec_vminfp(a, b);
}

/* vec_mladd */

#define __builtin_altivec_vmladduhm vec_mladd

static vector short __ATTRS_o_ai
vec_mladd(vector short a, vector short b, vector short c)
{
  return a * b + c;
}

static vector short __ATTRS_o_ai
vec_mladd(vector short a, vector unsigned short b, vector unsigned short c)
{
  return a * (vector short)b + (vector short)c;
}

static vector short __ATTRS_o_ai
vec_mladd(vector unsigned short a, vector short b, vector short c)
{
  return (vector short)a * b + c;
}

static vector unsigned short __ATTRS_o_ai
vec_mladd(vector unsigned short a,
          vector unsigned short b, 
          vector unsigned short c)
{
  return a * b + c;
}

/* vec_vmladduhm */

static vector short __ATTRS_o_ai
vec_vmladduhm(vector short a, vector short b, vector short c)
{
  return a * b + c;
}

static vector short __ATTRS_o_ai
vec_vmladduhm(vector short a, vector unsigned short b, vector unsigned short c)
{
  return a * (vector short)b + (vector short)c;
}

static vector short __ATTRS_o_ai
vec_vmladduhm(vector unsigned short a, vector short b, vector short c)
{
  return (vector short)a * b + c;
}

static vector unsigned short __ATTRS_o_ai
vec_vmladduhm(vector unsigned short a,
              vector unsigned short b,
              vector unsigned short c)
{
  return a * b + c;
}

/* vec_mradds */

static vector short __attribute__((__always_inline__))
vec_mradds(vector short a, vector short b, vector short c)
{
  return __builtin_altivec_vmhraddshs(a, b, c);
}

/* vec_vmhraddshs */

static vector short __attribute__((__always_inline__))
vec_vmhraddshs(vector short a, vector short b, vector short c)
{
  return __builtin_altivec_vmhraddshs(a, b, c);
}

/* vec_msum */

static vector int __ATTRS_o_ai
vec_msum(vector signed char a, vector unsigned char b, vector int c)
{
  return __builtin_altivec_vmsummbm(a, b, c);
}

static vector unsigned int __ATTRS_o_ai
vec_msum(vector unsigned char a, vector unsigned char b, vector unsigned int c)
{
  return __builtin_altivec_vmsumubm(a, b, c);
}

static vector int __ATTRS_o_ai
vec_msum(vector short a, vector short b, vector int c)
{
  return __builtin_altivec_vmsumshm(a, b, c);
}

static vector unsigned int __ATTRS_o_ai
vec_msum(vector unsigned short a,
         vector unsigned short b,
         vector unsigned int c)
{
  return __builtin_altivec_vmsumuhm(a, b, c);
}

/* vec_vmsummbm */

static vector int __attribute__((__always_inline__))
vec_vmsummbm(vector signed char a, vector unsigned char b, vector int c)
{
  return __builtin_altivec_vmsummbm(a, b, c);
}

/* vec_vmsumubm */

static vector unsigned int __attribute__((__always_inline__))
vec_vmsumubm(vector unsigned char a,
             vector unsigned char b,
             vector unsigned int c)
{
  return __builtin_altivec_vmsumubm(a, b, c);
}

/* vec_vmsumshm */

static vector int __attribute__((__always_inline__))
vec_vmsumshm(vector short a, vector short b, vector int c)
{
  return __builtin_altivec_vmsumshm(a, b, c);
}

/* vec_vmsumuhm */

static vector unsigned int __attribute__((__always_inline__))
vec_vmsumuhm(vector unsigned short a,
             vector unsigned short b,
             vector unsigned int c)
{
  return __builtin_altivec_vmsumuhm(a, b, c);
}

/* vec_msums */

static vector int __ATTRS_o_ai
vec_msums(vector short a, vector short b, vector int c)
{
  return __builtin_altivec_vmsumshs(a, b, c);
}

static vector unsigned int __ATTRS_o_ai
vec_msums(vector unsigned short a,
          vector unsigned short b,
          vector unsigned int c)
{
  return __builtin_altivec_vmsumuhs(a, b, c);
}

/* vec_vmsumshs */

static vector int __attribute__((__always_inline__))
vec_vmsumshs(vector short a, vector short b, vector int c)
{
  return __builtin_altivec_vmsumshs(a, b, c);
}

/* vec_vmsumuhs */

static vector unsigned int __attribute__((__always_inline__))
vec_vmsumuhs(vector unsigned short a,
             vector unsigned short b,
             vector unsigned int c)
{
  return __builtin_altivec_vmsumuhs(a, b, c);
}

/* vec_mtvscr */

static void __ATTRS_o_ai
vec_mtvscr(vector signed char a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector unsigned char a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector bool char a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector short a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector unsigned short a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector bool short a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector pixel a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector int a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector unsigned int a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector bool int a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

static void __ATTRS_o_ai
vec_mtvscr(vector float a)
{
  __builtin_altivec_mtvscr((vector int)a);
}

/* vec_mule */

static vector short __ATTRS_o_ai
vec_mule(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vmulesb(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_mule(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vmuleub(a, b);
}

static vector int __ATTRS_o_ai
vec_mule(vector short a, vector short b)
{
  return __builtin_altivec_vmulesh(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_mule(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vmuleuh(a, b);
}

/* vec_vmulesb */

static vector short __attribute__((__always_inline__))
vec_vmulesb(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vmulesb(a, b);
}

/* vec_vmuleub */

static vector unsigned short __attribute__((__always_inline__))
vec_vmuleub(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vmuleub(a, b);
}

/* vec_vmulesh */

static vector int __attribute__((__always_inline__))
vec_vmulesh(vector short a, vector short b)
{
  return __builtin_altivec_vmulesh(a, b);
}

/* vec_vmuleuh */

static vector unsigned int __attribute__((__always_inline__))
vec_vmuleuh(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vmuleuh(a, b);
}

/* vec_mulo */

static vector short __ATTRS_o_ai
vec_mulo(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vmulosb(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_mulo(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vmuloub(a, b);
}

static vector int __ATTRS_o_ai
vec_mulo(vector short a, vector short b)
{
  return __builtin_altivec_vmulosh(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_mulo(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vmulouh(a, b);
}

/* vec_vmulosb */

static vector short __attribute__((__always_inline__))
vec_vmulosb(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vmulosb(a, b);
}

/* vec_vmuloub */

static vector unsigned short __attribute__((__always_inline__))
vec_vmuloub(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vmuloub(a, b);
}

/* vec_vmulosh */

static vector int __attribute__((__always_inline__))
vec_vmulosh(vector short a, vector short b)
{
  return __builtin_altivec_vmulosh(a, b);
}

/* vec_vmulouh */

static vector unsigned int __attribute__((__always_inline__))
vec_vmulouh(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vmulouh(a, b);
}

/* vec_nmsub */

static vector float __attribute__((__always_inline__))
vec_nmsub(vector float a, vector float b, vector float c)
{
  return __builtin_altivec_vnmsubfp(a, b, c);
}

/* vec_vnmsubfp */

static vector float __attribute__((__always_inline__))
vec_vnmsubfp(vector float a, vector float b, vector float c)
{
  return __builtin_altivec_vnmsubfp(a, b, c);
}

/* vec_nor */

#define __builtin_altivec_vnor vec_nor

static vector signed char __ATTRS_o_ai
vec_nor(vector signed char a, vector signed char b)
{
  return ~(a | b);
}

static vector unsigned char __ATTRS_o_ai
vec_nor(vector unsigned char a, vector unsigned char b)
{
  return ~(a | b);
}

static vector bool char __ATTRS_o_ai
vec_nor(vector bool char a, vector bool char b)
{
  return ~(a | b);
}

static vector short __ATTRS_o_ai
vec_nor(vector short a, vector short b)
{
  return ~(a | b);
}

static vector unsigned short __ATTRS_o_ai
vec_nor(vector unsigned short a, vector unsigned short b)
{
  return ~(a | b);
}

static vector bool short __ATTRS_o_ai
vec_nor(vector bool short a, vector bool short b)
{
  return ~(a | b);
}

static vector int __ATTRS_o_ai
vec_nor(vector int a, vector int b)
{
  return ~(a | b);
}

static vector unsigned int __ATTRS_o_ai
vec_nor(vector unsigned int a, vector unsigned int b)
{
  return ~(a | b);
}

static vector bool int __ATTRS_o_ai
vec_nor(vector bool int a, vector bool int b)
{
  return ~(a | b);
}

static vector float __ATTRS_o_ai
vec_nor(vector float a, vector float b)
{
  vector unsigned int res = ~((vector unsigned int)a | (vector unsigned int)b);
  return (vector float)res;
}

/* vec_vnor */

static vector signed char __ATTRS_o_ai
vec_vnor(vector signed char a, vector signed char b)
{
  return ~(a | b);
}

static vector unsigned char __ATTRS_o_ai
vec_vnor(vector unsigned char a, vector unsigned char b)
{
  return ~(a | b);
}

static vector bool char __ATTRS_o_ai
vec_vnor(vector bool char a, vector bool char b)
{
  return ~(a | b);
}

static vector short __ATTRS_o_ai
vec_vnor(vector short a, vector short b)
{
  return ~(a | b);
}

static vector unsigned short __ATTRS_o_ai
vec_vnor(vector unsigned short a, vector unsigned short b)
{
  return ~(a | b);
}

static vector bool short __ATTRS_o_ai
vec_vnor(vector bool short a, vector bool short b)
{
  return ~(a | b);
}

static vector int __ATTRS_o_ai
vec_vnor(vector int a, vector int b)
{
  return ~(a | b);
}

static vector unsigned int __ATTRS_o_ai
vec_vnor(vector unsigned int a, vector unsigned int b)
{
  return ~(a | b);
}

static vector bool int __ATTRS_o_ai
vec_vnor(vector bool int a, vector bool int b)
{
  return ~(a | b);
}

static vector float __ATTRS_o_ai
vec_vnor(vector float a, vector float b)
{
  vector unsigned int res = ~((vector unsigned int)a | (vector unsigned int)b);
  return (vector float)res;
}

/* vec_or */

#define __builtin_altivec_vor vec_or

static vector signed char __ATTRS_o_ai
vec_or(vector signed char a, vector signed char b)
{
  return a | b;
}

static vector signed char __ATTRS_o_ai
vec_or(vector bool char a, vector signed char b)
{
  return (vector signed char)a | b;
}

static vector signed char __ATTRS_o_ai
vec_or(vector signed char a, vector bool char b)
{
  return a | (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_or(vector unsigned char a, vector unsigned char b)
{
  return a | b;
}

static vector unsigned char __ATTRS_o_ai
vec_or(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a | b;
}

static vector unsigned char __ATTRS_o_ai
vec_or(vector unsigned char a, vector bool char b)
{
  return a | (vector unsigned char)b;
}

static vector bool char __ATTRS_o_ai
vec_or(vector bool char a, vector bool char b)
{
  return a | b;
}

static vector short __ATTRS_o_ai
vec_or(vector short a, vector short b)
{
  return a | b;
}

static vector short __ATTRS_o_ai
vec_or(vector bool short a, vector short b)
{
  return (vector short)a | b;
}

static vector short __ATTRS_o_ai
vec_or(vector short a, vector bool short b)
{
  return a | (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_or(vector unsigned short a, vector unsigned short b)
{
  return a | b;
}

static vector unsigned short __ATTRS_o_ai
vec_or(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a | b;
}

static vector unsigned short __ATTRS_o_ai
vec_or(vector unsigned short a, vector bool short b)
{
  return a | (vector unsigned short)b;
}

static vector bool short __ATTRS_o_ai
vec_or(vector bool short a, vector bool short b)
{
  return a | b;
}

static vector int __ATTRS_o_ai
vec_or(vector int a, vector int b)
{
  return a | b;
}

static vector int __ATTRS_o_ai
vec_or(vector bool int a, vector int b)
{
  return (vector int)a | b;
}

static vector int __ATTRS_o_ai
vec_or(vector int a, vector bool int b)
{
  return a | (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_or(vector unsigned int a, vector unsigned int b)
{
  return a | b;
}

static vector unsigned int __ATTRS_o_ai
vec_or(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a | b;
}

static vector unsigned int __ATTRS_o_ai
vec_or(vector unsigned int a, vector bool int b)
{
  return a | (vector unsigned int)b;
}

static vector bool int __ATTRS_o_ai
vec_or(vector bool int a, vector bool int b)
{
  return a | b;
}

static vector float __ATTRS_o_ai
vec_or(vector float a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a | (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_or(vector bool int a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a | (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_or(vector float a, vector bool int b)
{
  vector unsigned int res = (vector unsigned int)a | (vector unsigned int)b;
  return (vector float)res;
}

/* vec_vor */

static vector signed char __ATTRS_o_ai
vec_vor(vector signed char a, vector signed char b)
{
  return a | b;
}

static vector signed char __ATTRS_o_ai
vec_vor(vector bool char a, vector signed char b)
{
  return (vector signed char)a | b;
}

static vector signed char __ATTRS_o_ai
vec_vor(vector signed char a, vector bool char b)
{
  return a | (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_vor(vector unsigned char a, vector unsigned char b)
{
  return a | b;
}

static vector unsigned char __ATTRS_o_ai
vec_vor(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a | b;
}

static vector unsigned char __ATTRS_o_ai
vec_vor(vector unsigned char a, vector bool char b)
{
  return a | (vector unsigned char)b;
}

static vector bool char __ATTRS_o_ai
vec_vor(vector bool char a, vector bool char b)
{
  return a | b;
}

static vector short __ATTRS_o_ai
vec_vor(vector short a, vector short b)
{
  return a | b;
}

static vector short __ATTRS_o_ai
vec_vor(vector bool short a, vector short b)
{
  return (vector short)a | b;
}

static vector short __ATTRS_o_ai
vec_vor(vector short a, vector bool short b)
{
  return a | (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_vor(vector unsigned short a, vector unsigned short b)
{
  return a | b;
}

static vector unsigned short __ATTRS_o_ai
vec_vor(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a | b;
}

static vector unsigned short __ATTRS_o_ai
vec_vor(vector unsigned short a, vector bool short b)
{
  return a | (vector unsigned short)b;
}

static vector bool short __ATTRS_o_ai
vec_vor(vector bool short a, vector bool short b)
{
  return a | b;
}

static vector int __ATTRS_o_ai
vec_vor(vector int a, vector int b)
{
  return a | b;
}

static vector int __ATTRS_o_ai
vec_vor(vector bool int a, vector int b)
{
  return (vector int)a | b;
}

static vector int __ATTRS_o_ai
vec_vor(vector int a, vector bool int b)
{
  return a | (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_vor(vector unsigned int a, vector unsigned int b)
{
  return a | b;
}

static vector unsigned int __ATTRS_o_ai
vec_vor(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a | b;
}

static vector unsigned int __ATTRS_o_ai
vec_vor(vector unsigned int a, vector bool int b)
{
  return a | (vector unsigned int)b;
}

static vector bool int __ATTRS_o_ai
vec_vor(vector bool int a, vector bool int b)
{
  return a | b;
}

static vector float __ATTRS_o_ai
vec_vor(vector float a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a | (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vor(vector bool int a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a | (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vor(vector float a, vector bool int b)
{
  vector unsigned int res = (vector unsigned int)a | (vector unsigned int)b;
  return (vector float)res;
}

/* vec_pack */

static vector signed char __ATTRS_o_ai
vec_pack(vector signed short a, vector signed short b)
{
  return (vector signed char)vec_perm(a, b, (vector unsigned char)
    (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
     0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
}

static vector unsigned char __ATTRS_o_ai
vec_pack(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned char)vec_perm(a, b, (vector unsigned char)
    (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
     0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
}

static vector bool char __ATTRS_o_ai
vec_pack(vector bool short a, vector bool short b)
{
  return (vector bool char)vec_perm(a, b, (vector unsigned char)
    (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
     0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
}

static vector short __ATTRS_o_ai
vec_pack(vector int a, vector int b)
{
  return (vector short)vec_perm(a, b, (vector unsigned char)
    (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
     0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
}

static vector unsigned short __ATTRS_o_ai
vec_pack(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned short)vec_perm(a, b, (vector unsigned char)
    (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
     0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
}

static vector bool short __ATTRS_o_ai
vec_pack(vector bool int a, vector bool int b)
{
  return (vector bool short)vec_perm(a, b, (vector unsigned char)
    (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
     0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
}

/* vec_vpkuhum */

#define __builtin_altivec_vpkuhum vec_vpkuhum

static vector signed char __ATTRS_o_ai
vec_vpkuhum(vector signed short a, vector signed short b)
{
  return (vector signed char)vec_perm(a, b, (vector unsigned char)
    (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
     0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
}

static vector unsigned char __ATTRS_o_ai
vec_vpkuhum(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned char)vec_perm(a, b, (vector unsigned char)
    (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
     0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
}

static vector bool char __ATTRS_o_ai
vec_vpkuhum(vector bool short a, vector bool short b)
{
  return (vector bool char)vec_perm(a, b, (vector unsigned char)
    (0x01, 0x03, 0x05, 0x07, 0x09, 0x0B, 0x0D, 0x0F,
     0x11, 0x13, 0x15, 0x17, 0x19, 0x1B, 0x1D, 0x1F));
}

/* vec_vpkuwum */

#define __builtin_altivec_vpkuwum vec_vpkuwum

static vector short __ATTRS_o_ai
vec_vpkuwum(vector int a, vector int b)
{
  return (vector short)vec_perm(a, b, (vector unsigned char)
    (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
     0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
}

static vector unsigned short __ATTRS_o_ai
vec_vpkuwum(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned short)vec_perm(a, b, (vector unsigned char)
    (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
     0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
}

static vector bool short __ATTRS_o_ai
vec_vpkuwum(vector bool int a, vector bool int b)
{
  return (vector bool short)vec_perm(a, b, (vector unsigned char)
    (0x02, 0x03, 0x06, 0x07, 0x0A, 0x0B, 0x0E, 0x0F,
     0x12, 0x13, 0x16, 0x17, 0x1A, 0x1B, 0x1E, 0x1F));
}

/* vec_packpx */

static vector pixel __attribute__((__always_inline__))
vec_packpx(vector unsigned int a, vector unsigned int b)
{
  return (vector pixel)__builtin_altivec_vpkpx(a, b);
}

/* vec_vpkpx */

static vector pixel __attribute__((__always_inline__))
vec_vpkpx(vector unsigned int a, vector unsigned int b)
{
  return (vector pixel)__builtin_altivec_vpkpx(a, b);
}

/* vec_packs */

static vector signed char __ATTRS_o_ai
vec_packs(vector short a, vector short b)
{
  return __builtin_altivec_vpkshss(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_packs(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vpkuhus(a, b);
}

static vector signed short __ATTRS_o_ai
vec_packs(vector int a, vector int b)
{
  return __builtin_altivec_vpkswss(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_packs(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vpkuwus(a, b);
}

/* vec_vpkshss */

static vector signed char __attribute__((__always_inline__))
vec_vpkshss(vector short a, vector short b)
{
  return __builtin_altivec_vpkshss(a, b);
}

/* vec_vpkuhus */

static vector unsigned char __attribute__((__always_inline__))
vec_vpkuhus(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vpkuhus(a, b);
}

/* vec_vpkswss */

static vector signed short __attribute__((__always_inline__))
vec_vpkswss(vector int a, vector int b)
{
  return __builtin_altivec_vpkswss(a, b);
}

/* vec_vpkuwus */

static vector unsigned short __attribute__((__always_inline__))
vec_vpkuwus(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vpkuwus(a, b);
}

/* vec_packsu */

static vector unsigned char __ATTRS_o_ai
vec_packsu(vector short a, vector short b)
{
  return __builtin_altivec_vpkshus(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_packsu(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vpkuhus(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_packsu(vector int a, vector int b)
{
  return __builtin_altivec_vpkswus(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_packsu(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vpkuwus(a, b);
}

/* vec_vpkshus */

static vector unsigned char __ATTRS_o_ai
vec_vpkshus(vector short a, vector short b)
{
  return __builtin_altivec_vpkshus(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vpkshus(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vpkuhus(a, b);
}

/* vec_vpkswus */

static vector unsigned short __ATTRS_o_ai
vec_vpkswus(vector int a, vector int b)
{
  return __builtin_altivec_vpkswus(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vpkswus(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vpkuwus(a, b);
}

/* vec_perm */

vector signed char __ATTRS_o_ai
vec_perm(vector signed char a, vector signed char b, vector unsigned char c)
{
  return (vector signed char)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector unsigned char __ATTRS_o_ai
vec_perm(vector unsigned char a,
         vector unsigned char b,
         vector unsigned char c)
{
  return (vector unsigned char)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector bool char __ATTRS_o_ai
vec_perm(vector bool char a, vector bool char b, vector unsigned char c)
{
  return (vector bool char)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector short __ATTRS_o_ai
vec_perm(vector short a, vector short b, vector unsigned char c)
{
  return (vector short)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector unsigned short __ATTRS_o_ai
vec_perm(vector unsigned short a,
         vector unsigned short b,
         vector unsigned char c)
{
  return (vector unsigned short)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector bool short __ATTRS_o_ai
vec_perm(vector bool short a, vector bool short b, vector unsigned char c)
{
  return (vector bool short)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector pixel __ATTRS_o_ai
vec_perm(vector pixel a, vector pixel b, vector unsigned char c)
{
  return (vector pixel)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector int __ATTRS_o_ai
vec_perm(vector int a, vector int b, vector unsigned char c)
{
  return (vector int)__builtin_altivec_vperm_4si(a, b, c);
}

vector unsigned int __ATTRS_o_ai
vec_perm(vector unsigned int a, vector unsigned int b, vector unsigned char c)
{
  return (vector unsigned int)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector bool int __ATTRS_o_ai
vec_perm(vector bool int a, vector bool int b, vector unsigned char c)
{
  return (vector bool int)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector float __ATTRS_o_ai
vec_perm(vector float a, vector float b, vector unsigned char c)
{
  return (vector float)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

/* vec_vperm */

vector signed char __ATTRS_o_ai
vec_vperm(vector signed char a, vector signed char b, vector unsigned char c)
{
  return (vector signed char)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector unsigned char __ATTRS_o_ai
vec_vperm(vector unsigned char a,
          vector unsigned char b,
          vector unsigned char c)
{
  return (vector unsigned char)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector bool char __ATTRS_o_ai
vec_vperm(vector bool char a, vector bool char b, vector unsigned char c)
{
  return (vector bool char)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector short __ATTRS_o_ai
vec_vperm(vector short a, vector short b, vector unsigned char c)
{
  return (vector short)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector unsigned short __ATTRS_o_ai
vec_vperm(vector unsigned short a,
          vector unsigned short b,
          vector unsigned char c)
{
  return (vector unsigned short)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector bool short __ATTRS_o_ai
vec_vperm(vector bool short a, vector bool short b, vector unsigned char c)
{
  return (vector bool short)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector pixel __ATTRS_o_ai
vec_vperm(vector pixel a, vector pixel b, vector unsigned char c)
{
  return (vector pixel)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector int __ATTRS_o_ai
vec_vperm(vector int a, vector int b, vector unsigned char c)
{
  return (vector int)__builtin_altivec_vperm_4si(a, b, c);
}

vector unsigned int __ATTRS_o_ai
vec_vperm(vector unsigned int a, vector unsigned int b, vector unsigned char c)
{
  return (vector unsigned int)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector bool int __ATTRS_o_ai
vec_vperm(vector bool int a, vector bool int b, vector unsigned char c)
{
  return (vector bool int)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

vector float __ATTRS_o_ai
vec_vperm(vector float a, vector float b, vector unsigned char c)
{
  return (vector float)
           __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c);
}

/* vec_re */

vector float __attribute__((__always_inline__))
vec_re(vector float a)
{
  return __builtin_altivec_vrefp(a);
}

/* vec_vrefp */

vector float __attribute__((__always_inline__))
vec_vrefp(vector float a)
{
  return __builtin_altivec_vrefp(a);
}

/* vec_rl */

static vector signed char __ATTRS_o_ai
vec_rl(vector signed char a, vector unsigned char b)
{
  return (vector signed char)__builtin_altivec_vrlb((vector char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_rl(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)__builtin_altivec_vrlb((vector char)a, b);
}

static vector short __ATTRS_o_ai
vec_rl(vector short a, vector unsigned short b)
{
  return __builtin_altivec_vrlh(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_rl(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned short)__builtin_altivec_vrlh((vector short)a, b);
}

static vector int __ATTRS_o_ai
vec_rl(vector int a, vector unsigned int b)
{
  return __builtin_altivec_vrlw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_rl(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned int)__builtin_altivec_vrlw((vector int)a, b);
}

/* vec_vrlb */

static vector signed char __ATTRS_o_ai
vec_vrlb(vector signed char a, vector unsigned char b)
{
  return (vector signed char)__builtin_altivec_vrlb((vector char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vrlb(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)__builtin_altivec_vrlb((vector char)a, b);
}

/* vec_vrlh */

static vector short __ATTRS_o_ai
vec_vrlh(vector short a, vector unsigned short b)
{
  return __builtin_altivec_vrlh(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vrlh(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned short)__builtin_altivec_vrlh((vector short)a, b);
}

/* vec_vrlw */

static vector int __ATTRS_o_ai
vec_vrlw(vector int a, vector unsigned int b)
{
  return __builtin_altivec_vrlw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vrlw(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned int)__builtin_altivec_vrlw((vector int)a, b);
}

/* vec_round */

static vector float __attribute__((__always_inline__))
vec_round(vector float a)
{
  return __builtin_altivec_vrfin(a);
}

/* vec_vrfin */

static vector float __attribute__((__always_inline__))
vec_vrfin(vector float a)
{
  return __builtin_altivec_vrfin(a);
}

/* vec_rsqrte */

static __vector float __attribute__((__always_inline__))
vec_rsqrte(vector float a)
{
  return __builtin_altivec_vrsqrtefp(a);
}

/* vec_vrsqrtefp */

static __vector float __attribute__((__always_inline__))
vec_vrsqrtefp(vector float a)
{
  return __builtin_altivec_vrsqrtefp(a);
}

/* vec_sel */

#define __builtin_altivec_vsel_4si vec_sel

static vector signed char __ATTRS_o_ai
vec_sel(vector signed char a, vector signed char b, vector unsigned char c)
{
  return (a & ~(vector signed char)c) | (b & (vector signed char)c);
}

static vector signed char __ATTRS_o_ai
vec_sel(vector signed char a, vector signed char b, vector bool char c)
{
  return (a & ~(vector signed char)c) | (b & (vector signed char)c);
}

static vector unsigned char __ATTRS_o_ai
vec_sel(vector unsigned char a, vector unsigned char b, vector unsigned char c)
{
  return (a & ~c) | (b & c);
}

static vector unsigned char __ATTRS_o_ai
vec_sel(vector unsigned char a, vector unsigned char b, vector bool char c)
{
  return (a & ~(vector unsigned char)c) | (b & (vector unsigned char)c);
}

static vector bool char __ATTRS_o_ai
vec_sel(vector bool char a, vector bool char b, vector unsigned char c)
{
  return (a & ~(vector bool char)c) | (b & (vector bool char)c);
}

static vector bool char __ATTRS_o_ai
vec_sel(vector bool char a, vector bool char b, vector bool char c)
{
  return (a & ~c) | (b & c);
}

static vector short __ATTRS_o_ai
vec_sel(vector short a, vector short b, vector unsigned short c)
{
  return (a & ~(vector short)c) | (b & (vector short)c);
}

static vector short __ATTRS_o_ai
vec_sel(vector short a, vector short b, vector bool short c)
{
  return (a & ~(vector short)c) | (b & (vector short)c);
}

static vector unsigned short __ATTRS_o_ai
vec_sel(vector unsigned short a,
        vector unsigned short b,
        vector unsigned short c)
{
  return (a & ~c) | (b & c);
}

static vector unsigned short __ATTRS_o_ai
vec_sel(vector unsigned short a, vector unsigned short b, vector bool short c)
{
  return (a & ~(vector unsigned short)c) | (b & (vector unsigned short)c);
}

static vector bool short __ATTRS_o_ai
vec_sel(vector bool short a, vector bool short b, vector unsigned short c)
{
  return (a & ~(vector bool short)c) | (b & (vector bool short)c);
}

static vector bool short __ATTRS_o_ai
vec_sel(vector bool short a, vector bool short b, vector bool short c)
{
  return (a & ~c) | (b & c);
}

static vector int __ATTRS_o_ai
vec_sel(vector int a, vector int b, vector unsigned int c)
{
  return (a & ~(vector int)c) | (b & (vector int)c);
}

static vector int __ATTRS_o_ai
vec_sel(vector int a, vector int b, vector bool int c)
{
  return (a & ~(vector int)c) | (b & (vector int)c);
}

static vector unsigned int __ATTRS_o_ai
vec_sel(vector unsigned int a, vector unsigned int b, vector unsigned int c)
{
  return (a & ~c) | (b & c);
}

static vector unsigned int __ATTRS_o_ai
vec_sel(vector unsigned int a, vector unsigned int b, vector bool int c)
{
  return (a & ~(vector unsigned int)c) | (b & (vector unsigned int)c);
}

static vector bool int __ATTRS_o_ai
vec_sel(vector bool int a, vector bool int b, vector unsigned int c)
{
  return (a & ~(vector bool int)c) | (b & (vector bool int)c);
}

static vector bool int __ATTRS_o_ai
vec_sel(vector bool int a, vector bool int b, vector bool int c)
{
  return (a & ~c) | (b & c);
}

static vector float __ATTRS_o_ai
vec_sel(vector float a, vector float b, vector unsigned int c)
{
  vector int res = ((vector int)a & ~(vector int)c) 
                   | ((vector int)b & (vector int)c);
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_sel(vector float a, vector float b, vector bool int c)
{
  vector int res = ((vector int)a & ~(vector int)c)
                   | ((vector int)b & (vector int)c);
  return (vector float)res;
}

/* vec_vsel */

static vector signed char __ATTRS_o_ai
vec_vsel(vector signed char a, vector signed char b, vector unsigned char c)
{
  return (a & ~(vector signed char)c) | (b & (vector signed char)c);
}

static vector signed char __ATTRS_o_ai
vec_vsel(vector signed char a, vector signed char b, vector bool char c)
{
  return (a & ~(vector signed char)c) | (b & (vector signed char)c);
}

static vector unsigned char __ATTRS_o_ai
vec_vsel(vector unsigned char a, vector unsigned char b, vector unsigned char c)
{
  return (a & ~c) | (b & c);
}

static vector unsigned char __ATTRS_o_ai
vec_vsel(vector unsigned char a, vector unsigned char b, vector bool char c)
{
  return (a & ~(vector unsigned char)c) | (b & (vector unsigned char)c);
}

static vector bool char __ATTRS_o_ai
vec_vsel(vector bool char a, vector bool char b, vector unsigned char c)
{
  return (a & ~(vector bool char)c) | (b & (vector bool char)c);
}

static vector bool char __ATTRS_o_ai
vec_vsel(vector bool char a, vector bool char b, vector bool char c)
{
  return (a & ~c) | (b & c);
}

static vector short __ATTRS_o_ai
vec_vsel(vector short a, vector short b, vector unsigned short c)
{
  return (a & ~(vector short)c) | (b & (vector short)c);
}

static vector short __ATTRS_o_ai
vec_vsel(vector short a, vector short b, vector bool short c)
{
  return (a & ~(vector short)c) | (b & (vector short)c);
}

static vector unsigned short __ATTRS_o_ai
vec_vsel(vector unsigned short a,
         vector unsigned short b,
         vector unsigned short c)
{
  return (a & ~c) | (b & c);
}

static vector unsigned short __ATTRS_o_ai
vec_vsel(vector unsigned short a, vector unsigned short b, vector bool short c)
{
  return (a & ~(vector unsigned short)c) | (b & (vector unsigned short)c);
}

static vector bool short __ATTRS_o_ai
vec_vsel(vector bool short a, vector bool short b, vector unsigned short c)
{
  return (a & ~(vector bool short)c) | (b & (vector bool short)c);
}

static vector bool short __ATTRS_o_ai
vec_vsel(vector bool short a, vector bool short b, vector bool short c)
{
  return (a & ~c) | (b & c);
}

static vector int __ATTRS_o_ai
vec_vsel(vector int a, vector int b, vector unsigned int c)
{
  return (a & ~(vector int)c) | (b & (vector int)c);
}

static vector int __ATTRS_o_ai
vec_vsel(vector int a, vector int b, vector bool int c)
{
  return (a & ~(vector int)c) | (b & (vector int)c);
}

static vector unsigned int __ATTRS_o_ai
vec_vsel(vector unsigned int a, vector unsigned int b, vector unsigned int c)
{
  return (a & ~c) | (b & c);
}

static vector unsigned int __ATTRS_o_ai
vec_vsel(vector unsigned int a, vector unsigned int b, vector bool int c)
{
  return (a & ~(vector unsigned int)c) | (b & (vector unsigned int)c);
}

static vector bool int __ATTRS_o_ai
vec_vsel(vector bool int a, vector bool int b, vector unsigned int c)
{
  return (a & ~(vector bool int)c) | (b & (vector bool int)c);
}

static vector bool int __ATTRS_o_ai
vec_vsel(vector bool int a, vector bool int b, vector bool int c)
{
  return (a & ~c) | (b & c);
}

static vector float __ATTRS_o_ai
vec_vsel(vector float a, vector float b, vector unsigned int c)
{
  vector int res = ((vector int)a & ~(vector int)c)
                   | ((vector int)b & (vector int)c);
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vsel(vector float a, vector float b, vector bool int c)
{
  vector int res = ((vector int)a & ~(vector int)c)
                   | ((vector int)b & (vector int)c);
  return (vector float)res;
}

/* vec_sl */

static vector signed char __ATTRS_o_ai
vec_sl(vector signed char a, vector unsigned char b)
{
  return a << (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_sl(vector unsigned char a, vector unsigned char b)
{
  return a << b;
}

static vector short __ATTRS_o_ai
vec_sl(vector short a, vector unsigned short b)
{
  return a << (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_sl(vector unsigned short a, vector unsigned short b)
{
  return a << b;
}

static vector int __ATTRS_o_ai
vec_sl(vector int a, vector unsigned int b)
{
  return a << (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_sl(vector unsigned int a, vector unsigned int b)
{
  return a << b;
}

/* vec_vslb */

#define __builtin_altivec_vslb vec_vslb

static vector signed char __ATTRS_o_ai
vec_vslb(vector signed char a, vector unsigned char b)
{
  return vec_sl(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vslb(vector unsigned char a, vector unsigned char b)
{
  return vec_sl(a, b);
}

/* vec_vslh */

#define __builtin_altivec_vslh vec_vslh

static vector short __ATTRS_o_ai
vec_vslh(vector short a, vector unsigned short b)
{
  return vec_sl(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vslh(vector unsigned short a, vector unsigned short b)
{
  return vec_sl(a, b);
}

/* vec_vslw */

#define __builtin_altivec_vslw vec_vslw

static vector int __ATTRS_o_ai
vec_vslw(vector int a, vector unsigned int b)
{
  return vec_sl(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vslw(vector unsigned int a, vector unsigned int b)
{
  return vec_sl(a, b);
}

/* vec_sld */

#define __builtin_altivec_vsldoi_4si vec_sld

static vector signed char __ATTRS_o_ai
vec_sld(vector signed char a, vector signed char b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector unsigned char __ATTRS_o_ai
vec_sld(vector unsigned char a, vector unsigned char b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector short __ATTRS_o_ai
vec_sld(vector short a, vector short b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector unsigned short __ATTRS_o_ai
vec_sld(vector unsigned short a, vector unsigned short b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector pixel __ATTRS_o_ai
vec_sld(vector pixel a, vector pixel b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector int __ATTRS_o_ai
vec_sld(vector int a, vector int b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector unsigned int __ATTRS_o_ai
vec_sld(vector unsigned int a, vector unsigned int b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector float __ATTRS_o_ai
vec_sld(vector float a, vector float b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

/* vec_vsldoi */

static vector signed char __ATTRS_o_ai
vec_vsldoi(vector signed char a, vector signed char b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector unsigned char __ATTRS_o_ai
vec_vsldoi(vector unsigned char a, vector unsigned char b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector short __ATTRS_o_ai
vec_vsldoi(vector short a, vector short b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector unsigned short __ATTRS_o_ai
vec_vsldoi(vector unsigned short a, vector unsigned short b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector pixel __ATTRS_o_ai
vec_vsldoi(vector pixel a, vector pixel b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector int __ATTRS_o_ai
vec_vsldoi(vector int a, vector int b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector unsigned int __ATTRS_o_ai
vec_vsldoi(vector unsigned int a, vector unsigned int b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

static vector float __ATTRS_o_ai
vec_vsldoi(vector float a, vector float b, unsigned char c)
{
  return vec_perm(a, b, (vector unsigned char)
    (c,   c+1, c+2,  c+3,  c+4,  c+5,  c+6,  c+7, 
     c+8, c+9, c+10, c+11, c+12, c+13, c+14, c+15));
}

/* vec_sll */

static vector signed char __ATTRS_o_ai
vec_sll(vector signed char a, vector unsigned char b)
{
  return (vector signed char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_sll(vector signed char a, vector unsigned short b)
{
  return (vector signed char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_sll(vector signed char a, vector unsigned int b)
{
  return (vector signed char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_sll(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_sll(vector unsigned char a, vector unsigned short b)
{
  return (vector unsigned char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_sll(vector unsigned char a, vector unsigned int b)
{
  return (vector unsigned char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_sll(vector bool char a, vector unsigned char b)
{
  return (vector bool char)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_sll(vector bool char a, vector unsigned short b)
{
  return (vector bool char)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_sll(vector bool char a, vector unsigned int b)
{
  return (vector bool char)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_sll(vector short a, vector unsigned char b)
{
  return (vector short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_sll(vector short a, vector unsigned short b)
{
  return (vector short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_sll(vector short a, vector unsigned int b)
{
  return (vector short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_sll(vector unsigned short a, vector unsigned char b)
{
  return (vector unsigned short)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_sll(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned short)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_sll(vector unsigned short a, vector unsigned int b)
{
  return (vector unsigned short)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_sll(vector bool short a, vector unsigned char b)
{
  return (vector bool short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_sll(vector bool short a, vector unsigned short b)
{
  return (vector bool short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_sll(vector bool short a, vector unsigned int b)
{
  return (vector bool short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_sll(vector pixel a, vector unsigned char b)
{
  return (vector pixel)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_sll(vector pixel a, vector unsigned short b)
{
  return (vector pixel)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_sll(vector pixel a, vector unsigned int b)
{
  return (vector pixel)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_sll(vector int a, vector unsigned char b)
{
  return (vector int)__builtin_altivec_vsl(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_sll(vector int a, vector unsigned short b)
{
  return (vector int)__builtin_altivec_vsl(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_sll(vector int a, vector unsigned int b)
{
  return (vector int)__builtin_altivec_vsl(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_sll(vector unsigned int a, vector unsigned char b)
{
  return (vector unsigned int)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_sll(vector unsigned int a, vector unsigned short b)
{
  return (vector unsigned int)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_sll(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned int)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_sll(vector bool int a, vector unsigned char b)
{
  return (vector bool int)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_sll(vector bool int a, vector unsigned short b)
{
  return (vector bool int)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_sll(vector bool int a, vector unsigned int b)
{
  return (vector bool int)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

/* vec_vsl */

static vector signed char __ATTRS_o_ai
vec_vsl(vector signed char a, vector unsigned char b)
{
  return (vector signed char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_vsl(vector signed char a, vector unsigned short b)
{
  return (vector signed char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_vsl(vector signed char a, vector unsigned int b)
{
  return (vector signed char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsl(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsl(vector unsigned char a, vector unsigned short b)
{
  return (vector unsigned char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsl(vector unsigned char a, vector unsigned int b)
{
  return (vector unsigned char)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_vsl(vector bool char a, vector unsigned char b)
{
  return (vector bool char)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_vsl(vector bool char a, vector unsigned short b)
{
  return (vector bool char)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_vsl(vector bool char a, vector unsigned int b)
{
  return (vector bool char)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vsl(vector short a, vector unsigned char b)
{
  return (vector short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vsl(vector short a, vector unsigned short b)
{
  return (vector short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vsl(vector short a, vector unsigned int b)
{
  return (vector short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsl(vector unsigned short a, vector unsigned char b)
{
  return (vector unsigned short)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsl(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned short)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsl(vector unsigned short a, vector unsigned int b)
{
  return (vector unsigned short)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_vsl(vector bool short a, vector unsigned char b)
{
  return (vector bool short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_vsl(vector bool short a, vector unsigned short b)
{
  return (vector bool short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_vsl(vector bool short a, vector unsigned int b)
{
  return (vector bool short)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vsl(vector pixel a, vector unsigned char b)
{
  return (vector pixel)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vsl(vector pixel a, vector unsigned short b)
{
  return (vector pixel)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vsl(vector pixel a, vector unsigned int b)
{
  return (vector pixel)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vsl(vector int a, vector unsigned char b)
{
  return (vector int)__builtin_altivec_vsl(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vsl(vector int a, vector unsigned short b)
{
  return (vector int)__builtin_altivec_vsl(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vsl(vector int a, vector unsigned int b)
{
  return (vector int)__builtin_altivec_vsl(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsl(vector unsigned int a, vector unsigned char b)
{
  return (vector unsigned int)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsl(vector unsigned int a, vector unsigned short b)
{
  return (vector unsigned int)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsl(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned int)
           __builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_vsl(vector bool int a, vector unsigned char b)
{
  return (vector bool int)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_vsl(vector bool int a, vector unsigned short b)
{
  return (vector bool int)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_vsl(vector bool int a, vector unsigned int b)
{
  return (vector bool int)__builtin_altivec_vsl((vector int)a, (vector int)b);
}

/* vec_slo */

static vector signed char __ATTRS_o_ai
vec_slo(vector signed char a, vector signed char b)
{
  return (vector signed char)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_slo(vector signed char a, vector unsigned char b)
{
  return (vector signed char)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_slo(vector unsigned char a, vector signed char b)
{
  return (vector unsigned char)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_slo(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_slo(vector short a, vector signed char b)
{
  return (vector short)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_slo(vector short a, vector unsigned char b)
{
  return (vector short)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_slo(vector unsigned short a, vector signed char b)
{
  return (vector unsigned short)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_slo(vector unsigned short a, vector unsigned char b)
{
  return (vector unsigned short)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_slo(vector pixel a, vector signed char b)
{
  return (vector pixel)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_slo(vector pixel a, vector unsigned char b)
{
  return (vector pixel)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_slo(vector int a, vector signed char b)
{
  return (vector int)__builtin_altivec_vslo(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_slo(vector int a, vector unsigned char b)
{
  return (vector int)__builtin_altivec_vslo(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_slo(vector unsigned int a, vector signed char b)
{
  return (vector unsigned int)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_slo(vector unsigned int a, vector unsigned char b)
{
  return (vector unsigned int)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector float __ATTRS_o_ai
vec_slo(vector float a, vector signed char b)
{
  return (vector float)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector float __ATTRS_o_ai
vec_slo(vector float a, vector unsigned char b)
{
  return (vector float)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

/* vec_vslo */

static vector signed char __ATTRS_o_ai
vec_vslo(vector signed char a, vector signed char b)
{
  return (vector signed char)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_vslo(vector signed char a, vector unsigned char b)
{
  return (vector signed char)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vslo(vector unsigned char a, vector signed char b)
{
  return (vector unsigned char)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vslo(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vslo(vector short a, vector signed char b)
{
  return (vector short)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vslo(vector short a, vector unsigned char b)
{
  return (vector short)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vslo(vector unsigned short a, vector signed char b)
{
  return (vector unsigned short)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vslo(vector unsigned short a, vector unsigned char b)
{
  return (vector unsigned short)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vslo(vector pixel a, vector signed char b)
{
  return (vector pixel)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vslo(vector pixel a, vector unsigned char b)
{
  return (vector pixel)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vslo(vector int a, vector signed char b)
{
  return (vector int)__builtin_altivec_vslo(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vslo(vector int a, vector unsigned char b)
{
  return (vector int)__builtin_altivec_vslo(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vslo(vector unsigned int a, vector signed char b)
{
  return (vector unsigned int)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vslo(vector unsigned int a, vector unsigned char b)
{
  return (vector unsigned int)
           __builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector float __ATTRS_o_ai
vec_vslo(vector float a, vector signed char b)
{
  return (vector float)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

static vector float __ATTRS_o_ai
vec_vslo(vector float a, vector unsigned char b)
{
  return (vector float)__builtin_altivec_vslo((vector int)a, (vector int)b);
}

/* vec_splat */

static vector signed char __ATTRS_o_ai
vec_splat(vector signed char a, unsigned char b)
{
  return vec_perm(a, a, (vector unsigned char)(b));
}

static vector unsigned char __ATTRS_o_ai
vec_splat(vector unsigned char a, unsigned char b)
{
  return vec_perm(a, a, (vector unsigned char)(b));
}

static vector bool char __ATTRS_o_ai
vec_splat(vector bool char a, unsigned char b)
{
  return vec_perm(a, a, (vector unsigned char)(b));
}

static vector short __ATTRS_o_ai
vec_splat(vector short a, unsigned char b)
{ 
  b *= 2;
  unsigned char b1=b+1;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1));
}

static vector unsigned short __ATTRS_o_ai
vec_splat(vector unsigned short a, unsigned char b)
{ 
  b *= 2;
  unsigned char b1=b+1;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1));
}

static vector bool short __ATTRS_o_ai
vec_splat(vector bool short a, unsigned char b)
{ 
  b *= 2;
  unsigned char b1=b+1;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1));
}

static vector pixel __ATTRS_o_ai
vec_splat(vector pixel a, unsigned char b)
{ 
  b *= 2;
  unsigned char b1=b+1;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1));
}

static vector int __ATTRS_o_ai
vec_splat(vector int a, unsigned char b)
{ 
  b *= 4;
  unsigned char b1=b+1, b2=b+2, b3=b+3;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3));
}

static vector unsigned int __ATTRS_o_ai
vec_splat(vector unsigned int a, unsigned char b)
{ 
  b *= 4;
  unsigned char b1=b+1, b2=b+2, b3=b+3;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3));
}

static vector bool int __ATTRS_o_ai
vec_splat(vector bool int a, unsigned char b)
{ 
  b *= 4;
  unsigned char b1=b+1, b2=b+2, b3=b+3;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3));
}

static vector float __ATTRS_o_ai
vec_splat(vector float a, unsigned char b)
{ 
  b *= 4;
  unsigned char b1=b+1, b2=b+2, b3=b+3;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3));
}

/* vec_vspltb */

#define __builtin_altivec_vspltb vec_vspltb

static vector signed char __ATTRS_o_ai
vec_vspltb(vector signed char a, unsigned char b)
{
  return vec_perm(a, a, (vector unsigned char)(b));
}

static vector unsigned char __ATTRS_o_ai
vec_vspltb(vector unsigned char a, unsigned char b)
{
  return vec_perm(a, a, (vector unsigned char)(b));
}

static vector bool char __ATTRS_o_ai
vec_vspltb(vector bool char a, unsigned char b)
{
  return vec_perm(a, a, (vector unsigned char)(b));
}

/* vec_vsplth */

#define __builtin_altivec_vsplth vec_vsplth

static vector short __ATTRS_o_ai
vec_vsplth(vector short a, unsigned char b)
{
  b *= 2;
  unsigned char b1=b+1;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1));
}

static vector unsigned short __ATTRS_o_ai
vec_vsplth(vector unsigned short a, unsigned char b)
{
  b *= 2;
  unsigned char b1=b+1;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1));
}

static vector bool short __ATTRS_o_ai
vec_vsplth(vector bool short a, unsigned char b)
{
  b *= 2;
  unsigned char b1=b+1;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1));
}

static vector pixel __ATTRS_o_ai
vec_vsplth(vector pixel a, unsigned char b)
{
  b *= 2;
  unsigned char b1=b+1;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1, b, b1));
}

/* vec_vspltw */

#define __builtin_altivec_vspltw vec_vspltw

static vector int __ATTRS_o_ai
vec_vspltw(vector int a, unsigned char b)
{
  b *= 4;
  unsigned char b1=b+1, b2=b+2, b3=b+3;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3));
}

static vector unsigned int __ATTRS_o_ai
vec_vspltw(vector unsigned int a, unsigned char b)
{
  b *= 4;
  unsigned char b1=b+1, b2=b+2, b3=b+3;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3));
}

static vector bool int __ATTRS_o_ai
vec_vspltw(vector bool int a, unsigned char b)
{
  b *= 4;
  unsigned char b1=b+1, b2=b+2, b3=b+3;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3));
}

static vector float __ATTRS_o_ai
vec_vspltw(vector float a, unsigned char b)
{
  b *= 4;
  unsigned char b1=b+1, b2=b+2, b3=b+3;
  return vec_perm(a, a, (vector unsigned char)
    (b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3, b, b1, b2, b3));
}

/* vec_splat_s8 */

#define __builtin_altivec_vspltisb vec_splat_s8

// FIXME: parameter should be treated as 5-bit signed literal
static vector signed char __ATTRS_o_ai
vec_splat_s8(signed char a)
{
  return (vector signed char)(a);
}

/* vec_vspltisb */

// FIXME: parameter should be treated as 5-bit signed literal
static vector signed char __ATTRS_o_ai
vec_vspltisb(signed char a)
{
  return (vector signed char)(a);
}

/* vec_splat_s16 */

#define __builtin_altivec_vspltish vec_splat_s16

// FIXME: parameter should be treated as 5-bit signed literal
static vector short __ATTRS_o_ai
vec_splat_s16(signed char a)
{
  return (vector short)(a);
}

/* vec_vspltish */

// FIXME: parameter should be treated as 5-bit signed literal
static vector short __ATTRS_o_ai
vec_vspltish(signed char a)
{
  return (vector short)(a);
}

/* vec_splat_s32 */

#define __builtin_altivec_vspltisw vec_splat_s32

// FIXME: parameter should be treated as 5-bit signed literal
static vector int __ATTRS_o_ai
vec_splat_s32(signed char a)
{
  return (vector int)(a);
}

/* vec_vspltisw */

// FIXME: parameter should be treated as 5-bit signed literal
static vector int __ATTRS_o_ai
vec_vspltisw(signed char a)
{
  return (vector int)(a);
}

/* vec_splat_u8 */

// FIXME: parameter should be treated as 5-bit signed literal
static vector unsigned char __ATTRS_o_ai
vec_splat_u8(unsigned char a)
{
  return (vector unsigned char)(a);
}

/* vec_splat_u16 */

// FIXME: parameter should be treated as 5-bit signed literal
static vector unsigned short __ATTRS_o_ai
vec_splat_u16(signed char a)
{
  return (vector unsigned short)(a);
}

/* vec_splat_u32 */

// FIXME: parameter should be treated as 5-bit signed literal
static vector unsigned int __ATTRS_o_ai
vec_splat_u32(signed char a)
{
  return (vector unsigned int)(a);
}

/* vec_sr */

static vector signed char __ATTRS_o_ai
vec_sr(vector signed char a, vector unsigned char b)
{
  return a >> (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_sr(vector unsigned char a, vector unsigned char b)
{
  return a >> b;
}

static vector short __ATTRS_o_ai
vec_sr(vector short a, vector unsigned short b)
{
  return a >> (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_sr(vector unsigned short a, vector unsigned short b)
{
  return a >> b;
}

static vector int __ATTRS_o_ai
vec_sr(vector int a, vector unsigned int b)
{
  return a >> (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_sr(vector unsigned int a, vector unsigned int b)
{
  return a >> b;
}

/* vec_vsrb */

#define __builtin_altivec_vsrb vec_vsrb

static vector signed char __ATTRS_o_ai
vec_vsrb(vector signed char a, vector unsigned char b)
{
  return a >> (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_vsrb(vector unsigned char a, vector unsigned char b)
{
  return a >> b;
}

/* vec_vsrh */

#define __builtin_altivec_vsrh vec_vsrh

static vector short __ATTRS_o_ai
vec_vsrh(vector short a, vector unsigned short b)
{
  return a >> (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_vsrh(vector unsigned short a, vector unsigned short b)
{
  return a >> b;
}

/* vec_vsrw */

#define __builtin_altivec_vsrw vec_vsrw

static vector int __ATTRS_o_ai
vec_vsrw(vector int a, vector unsigned int b)
{
  return a >> (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_vsrw(vector unsigned int a, vector unsigned int b)
{
  return a >> b;
}

/* vec_sra */

static vector signed char __ATTRS_o_ai
vec_sra(vector signed char a, vector unsigned char b)
{
  return (vector signed char)__builtin_altivec_vsrab((vector char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_sra(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)__builtin_altivec_vsrab((vector char)a, b);
}

static vector short __ATTRS_o_ai
vec_sra(vector short a, vector unsigned short b)
{
  return __builtin_altivec_vsrah(a, (vector unsigned short)b);
}

static vector unsigned short __ATTRS_o_ai
vec_sra(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned short)__builtin_altivec_vsrah((vector short)a, b);
}

static vector int __ATTRS_o_ai
vec_sra(vector int a, vector unsigned int b)
{
  return __builtin_altivec_vsraw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_sra(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned int)__builtin_altivec_vsraw((vector int)a, b);
}

/* vec_vsrab */

static vector signed char __ATTRS_o_ai
vec_vsrab(vector signed char a, vector unsigned char b)
{
  return (vector signed char)__builtin_altivec_vsrab((vector char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsrab(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)__builtin_altivec_vsrab((vector char)a, b);
}

/* vec_vsrah */

static vector short __ATTRS_o_ai
vec_vsrah(vector short a, vector unsigned short b)
{
  return __builtin_altivec_vsrah(a, (vector unsigned short)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsrah(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned short)__builtin_altivec_vsrah((vector short)a, b);
}

/* vec_vsraw */

static vector int __ATTRS_o_ai
vec_vsraw(vector int a, vector unsigned int b)
{
  return __builtin_altivec_vsraw(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsraw(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned int)__builtin_altivec_vsraw((vector int)a, b);
}

/* vec_srl */

static vector signed char __ATTRS_o_ai
vec_srl(vector signed char a, vector unsigned char b)
{
  return (vector signed char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_srl(vector signed char a, vector unsigned short b)
{
  return (vector signed char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_srl(vector signed char a, vector unsigned int b)
{
  return (vector signed char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_srl(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_srl(vector unsigned char a, vector unsigned short b)
{
  return (vector unsigned char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_srl(vector unsigned char a, vector unsigned int b)
{
  return (vector unsigned char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_srl(vector bool char a, vector unsigned char b)
{
  return (vector bool char)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_srl(vector bool char a, vector unsigned short b)
{
  return (vector bool char)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_srl(vector bool char a, vector unsigned int b)
{
  return (vector bool char)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_srl(vector short a, vector unsigned char b)
{
  return (vector short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_srl(vector short a, vector unsigned short b)
{
  return (vector short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_srl(vector short a, vector unsigned int b)
{
  return (vector short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_srl(vector unsigned short a, vector unsigned char b)
{
  return (vector unsigned short)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_srl(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned short)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_srl(vector unsigned short a, vector unsigned int b)
{
  return (vector unsigned short)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_srl(vector bool short a, vector unsigned char b)
{
  return (vector bool short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_srl(vector bool short a, vector unsigned short b)
{
  return (vector bool short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_srl(vector bool short a, vector unsigned int b)
{
  return (vector bool short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_srl(vector pixel a, vector unsigned char b)
{
  return (vector pixel)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_srl(vector pixel a, vector unsigned short b)
{
  return (vector pixel)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_srl(vector pixel a, vector unsigned int b)
{
  return (vector pixel)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_srl(vector int a, vector unsigned char b)
{
  return (vector int)__builtin_altivec_vsr(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_srl(vector int a, vector unsigned short b)
{
  return (vector int)__builtin_altivec_vsr(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_srl(vector int a, vector unsigned int b)
{
  return (vector int)__builtin_altivec_vsr(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_srl(vector unsigned int a, vector unsigned char b)
{
  return (vector unsigned int)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_srl(vector unsigned int a, vector unsigned short b)
{
  return (vector unsigned int)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_srl(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned int)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_srl(vector bool int a, vector unsigned char b)
{
  return (vector bool int)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_srl(vector bool int a, vector unsigned short b)
{
  return (vector bool int)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_srl(vector bool int a, vector unsigned int b)
{
  return (vector bool int)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

/* vec_vsr */

static vector signed char __ATTRS_o_ai
vec_vsr(vector signed char a, vector unsigned char b)
{
  return (vector signed char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_vsr(vector signed char a, vector unsigned short b)
{
  return (vector signed char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_vsr(vector signed char a, vector unsigned int b)
{
  return (vector signed char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsr(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsr(vector unsigned char a, vector unsigned short b)
{
  return (vector unsigned char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsr(vector unsigned char a, vector unsigned int b)
{
  return (vector unsigned char)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_vsr(vector bool char a, vector unsigned char b)
{
  return (vector bool char)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_vsr(vector bool char a, vector unsigned short b)
{
  return (vector bool char)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool char __ATTRS_o_ai
vec_vsr(vector bool char a, vector unsigned int b)
{
  return (vector bool char)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vsr(vector short a, vector unsigned char b)
{
  return (vector short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vsr(vector short a, vector unsigned short b)
{
  return (vector short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vsr(vector short a, vector unsigned int b)
{
  return (vector short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsr(vector unsigned short a, vector unsigned char b)
{
  return (vector unsigned short)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsr(vector unsigned short a, vector unsigned short b)
{
  return (vector unsigned short)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsr(vector unsigned short a, vector unsigned int b)
{
  return (vector unsigned short)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_vsr(vector bool short a, vector unsigned char b)
{
  return (vector bool short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_vsr(vector bool short a, vector unsigned short b)
{
  return (vector bool short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool short __ATTRS_o_ai
vec_vsr(vector bool short a, vector unsigned int b)
{
  return (vector bool short)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vsr(vector pixel a, vector unsigned char b)
{
  return (vector pixel)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vsr(vector pixel a, vector unsigned short b)
{
  return (vector pixel)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vsr(vector pixel a, vector unsigned int b)
{
  return (vector pixel)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vsr(vector int a, vector unsigned char b)
{
  return (vector int)__builtin_altivec_vsr(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vsr(vector int a, vector unsigned short b)
{
  return (vector int)__builtin_altivec_vsr(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vsr(vector int a, vector unsigned int b)
{
  return (vector int)__builtin_altivec_vsr(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsr(vector unsigned int a, vector unsigned char b)
{
  return (vector unsigned int)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsr(vector unsigned int a, vector unsigned short b)
{
  return (vector unsigned int)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsr(vector unsigned int a, vector unsigned int b)
{
  return (vector unsigned int)
           __builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_vsr(vector bool int a, vector unsigned char b)
{
  return (vector bool int)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_vsr(vector bool int a, vector unsigned short b)
{
  return (vector bool int)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

static vector bool int __ATTRS_o_ai
vec_vsr(vector bool int a, vector unsigned int b)
{
  return (vector bool int)__builtin_altivec_vsr((vector int)a, (vector int)b);
}

/* vec_sro */

static vector signed char __ATTRS_o_ai
vec_sro(vector signed char a, vector signed char b)
{
  return (vector signed char)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_sro(vector signed char a, vector unsigned char b)
{
  return (vector signed char)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_sro(vector unsigned char a, vector signed char b)
{
  return (vector unsigned char)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_sro(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_sro(vector short a, vector signed char b)
{
  return (vector short)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_sro(vector short a, vector unsigned char b)
{
  return (vector short)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_sro(vector unsigned short a, vector signed char b)
{
  return (vector unsigned short)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_sro(vector unsigned short a, vector unsigned char b)
{
  return (vector unsigned short)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_sro(vector pixel a, vector signed char b)
{
  return (vector pixel)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_sro(vector pixel a, vector unsigned char b)
{
  return (vector pixel)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_sro(vector int a, vector signed char b)
{
  return (vector int)__builtin_altivec_vsro(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_sro(vector int a, vector unsigned char b)
{
  return (vector int)__builtin_altivec_vsro(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_sro(vector unsigned int a, vector signed char b)
{
  return (vector unsigned int)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_sro(vector unsigned int a, vector unsigned char b)
{
  return (vector unsigned int)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector float __ATTRS_o_ai
vec_sro(vector float a, vector signed char b)
{
  return (vector float)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector float __ATTRS_o_ai
vec_sro(vector float a, vector unsigned char b)
{
  return (vector float)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

/* vec_vsro */

static vector signed char __ATTRS_o_ai
vec_vsro(vector signed char a, vector signed char b)
{
  return (vector signed char)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector signed char __ATTRS_o_ai
vec_vsro(vector signed char a, vector unsigned char b)
{
  return (vector signed char)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsro(vector unsigned char a, vector signed char b)
{
  return (vector unsigned char)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsro(vector unsigned char a, vector unsigned char b)
{
  return (vector unsigned char)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vsro(vector short a, vector signed char b)
{
  return (vector short)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector short __ATTRS_o_ai
vec_vsro(vector short a, vector unsigned char b)
{
  return (vector short)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsro(vector unsigned short a, vector signed char b)
{
  return (vector unsigned short)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsro(vector unsigned short a, vector unsigned char b)
{
  return (vector unsigned short)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vsro(vector pixel a, vector signed char b)
{
  return (vector pixel)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector pixel __ATTRS_o_ai
vec_vsro(vector pixel a, vector unsigned char b)
{
  return (vector pixel)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vsro(vector int a, vector signed char b)
{
  return (vector int)__builtin_altivec_vsro(a, (vector int)b);
}

static vector int __ATTRS_o_ai
vec_vsro(vector int a, vector unsigned char b)
{
  return (vector int)__builtin_altivec_vsro(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsro(vector unsigned int a, vector signed char b)
{
  return (vector unsigned int)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsro(vector unsigned int a, vector unsigned char b)
{
  return (vector unsigned int)
           __builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector float __ATTRS_o_ai
vec_vsro(vector float a, vector signed char b)
{
  return (vector float)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

static vector float __ATTRS_o_ai
vec_vsro(vector float a, vector unsigned char b)
{
  return (vector float)__builtin_altivec_vsro((vector int)a, (vector int)b);
}

/* vec_st */

static void __ATTRS_o_ai
vec_st(vector signed char a, int b, vector signed char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector signed char a, int b, signed char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector unsigned char a, int b, vector unsigned char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector unsigned char a, int b, unsigned char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool char a, int b, signed char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool char a, int b, unsigned char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool char a, int b, vector bool char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector short a, int b, vector short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector short a, int b, short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector unsigned short a, int b, vector unsigned short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector unsigned short a, int b, unsigned short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool short a, int b, short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool short a, int b, unsigned short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool short a, int b, vector bool short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector pixel a, int b, short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector pixel a, int b, unsigned short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector pixel a, int b, vector pixel *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector int a, int b, vector int *c)
{
  __builtin_altivec_stvx(a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector int a, int b, int *c)
{
  __builtin_altivec_stvx(a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector unsigned int a, int b, vector unsigned int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector unsigned int a, int b, unsigned int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool int a, int b, int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool int a, int b, unsigned int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector bool int a, int b, vector bool int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector float a, int b, vector float *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_st(vector float a, int b, float *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

/* vec_stvx */

static void __ATTRS_o_ai
vec_stvx(vector signed char a, int b, vector signed char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector signed char a, int b, signed char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector unsigned char a, int b, vector unsigned char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector unsigned char a, int b, unsigned char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool char a, int b, signed char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool char a, int b, unsigned char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool char a, int b, vector bool char *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector short a, int b, vector short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector short a, int b, short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector unsigned short a, int b, vector unsigned short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector unsigned short a, int b, unsigned short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool short a, int b, short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool short a, int b, unsigned short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool short a, int b, vector bool short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector pixel a, int b, short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector pixel a, int b, unsigned short *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector pixel a, int b, vector pixel *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector int a, int b, vector int *c)
{
  __builtin_altivec_stvx(a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector int a, int b, int *c)
{
  __builtin_altivec_stvx(a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector unsigned int a, int b, vector unsigned int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector unsigned int a, int b, unsigned int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool int a, int b, int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool int a, int b, unsigned int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector bool int a, int b, vector bool int *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector float a, int b, vector float *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvx(vector float a, int b, float *c)
{
  __builtin_altivec_stvx((vector int)a, b, c);
}

/* vec_ste */

static void __ATTRS_o_ai
vec_ste(vector signed char a, int b, signed char *c)
{
  __builtin_altivec_stvebx((vector char)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector unsigned char a, int b, unsigned char *c)
{
  __builtin_altivec_stvebx((vector char)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector bool char a, int b, signed char *c)
{
  __builtin_altivec_stvebx((vector char)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector bool char a, int b, unsigned char *c)
{
  __builtin_altivec_stvebx((vector char)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector short a, int b, short *c)
{
  __builtin_altivec_stvehx(a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector unsigned short a, int b, unsigned short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector bool short a, int b, short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector bool short a, int b, unsigned short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector pixel a, int b, short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector pixel a, int b, unsigned short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector int a, int b, int *c)
{
  __builtin_altivec_stvewx(a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector unsigned int a, int b, unsigned int *c)
{
  __builtin_altivec_stvewx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector bool int a, int b, int *c)
{
  __builtin_altivec_stvewx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector bool int a, int b, unsigned int *c)
{
  __builtin_altivec_stvewx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_ste(vector float a, int b, float *c)
{
  __builtin_altivec_stvewx((vector int)a, b, c);
}

/* vec_stvebx */

static void __ATTRS_o_ai
vec_stvebx(vector signed char a, int b, signed char *c)
{
  __builtin_altivec_stvebx((vector char)a, b, c);
}

static void __ATTRS_o_ai
vec_stvebx(vector unsigned char a, int b, unsigned char *c)
{
  __builtin_altivec_stvebx((vector char)a, b, c);
}

static void __ATTRS_o_ai
vec_stvebx(vector bool char a, int b, signed char *c)
{
  __builtin_altivec_stvebx((vector char)a, b, c);
}

static void __ATTRS_o_ai
vec_stvebx(vector bool char a, int b, unsigned char *c)
{
  __builtin_altivec_stvebx((vector char)a, b, c);
}

/* vec_stvehx */

static void __ATTRS_o_ai
vec_stvehx(vector short a, int b, short *c)
{
  __builtin_altivec_stvehx(a, b, c);
}

static void __ATTRS_o_ai
vec_stvehx(vector unsigned short a, int b, unsigned short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_stvehx(vector bool short a, int b, short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_stvehx(vector bool short a, int b, unsigned short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_stvehx(vector pixel a, int b, short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

static void __ATTRS_o_ai
vec_stvehx(vector pixel a, int b, unsigned short *c)
{
  __builtin_altivec_stvehx((vector short)a, b, c);
}

/* vec_stvewx */

static void __ATTRS_o_ai
vec_stvewx(vector int a, int b, int *c)
{
  __builtin_altivec_stvewx(a, b, c);
}

static void __ATTRS_o_ai
vec_stvewx(vector unsigned int a, int b, unsigned int *c)
{
  __builtin_altivec_stvewx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvewx(vector bool int a, int b, int *c)
{
  __builtin_altivec_stvewx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvewx(vector bool int a, int b, unsigned int *c)
{
  __builtin_altivec_stvewx((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvewx(vector float a, int b, float *c)
{
  __builtin_altivec_stvewx((vector int)a, b, c);
}

/* vec_stl */

static void __ATTRS_o_ai
vec_stl(vector signed char a, int b, vector signed char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector signed char a, int b, signed char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector unsigned char a, int b, vector unsigned char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector unsigned char a, int b, unsigned char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool char a, int b, signed char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool char a, int b, unsigned char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool char a, int b, vector bool char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector short a, int b, vector short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector short a, int b, short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector unsigned short a, int b, vector unsigned short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector unsigned short a, int b, unsigned short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool short a, int b, short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool short a, int b, unsigned short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool short a, int b, vector bool short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector pixel a, int b, short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector pixel a, int b, unsigned short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector pixel a, int b, vector pixel *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector int a, int b, vector int *c)
{
  __builtin_altivec_stvxl(a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector int a, int b, int *c)
{
  __builtin_altivec_stvxl(a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector unsigned int a, int b, vector unsigned int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector unsigned int a, int b, unsigned int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool int a, int b, int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool int a, int b, unsigned int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector bool int a, int b, vector bool int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector float a, int b, vector float *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stl(vector float a, int b, float *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

/* vec_stvxl */

static void __ATTRS_o_ai
vec_stvxl(vector signed char a, int b, vector signed char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector signed char a, int b, signed char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector unsigned char a, int b, vector unsigned char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector unsigned char a, int b, unsigned char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool char a, int b, signed char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool char a, int b, unsigned char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool char a, int b, vector bool char *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector short a, int b, vector short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector short a, int b, short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector unsigned short a, int b, vector unsigned short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector unsigned short a, int b, unsigned short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool short a, int b, short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool short a, int b, unsigned short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool short a, int b, vector bool short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector pixel a, int b, short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector pixel a, int b, unsigned short *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector pixel a, int b, vector pixel *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector int a, int b, vector int *c)
{
  __builtin_altivec_stvxl(a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector int a, int b, int *c)
{
  __builtin_altivec_stvxl(a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector unsigned int a, int b, vector unsigned int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector unsigned int a, int b, unsigned int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool int a, int b, int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool int a, int b, unsigned int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector bool int a, int b, vector bool int *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector float a, int b, vector float *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

static void __ATTRS_o_ai
vec_stvxl(vector float a, int b, float *c)
{
  __builtin_altivec_stvxl((vector int)a, b, c);
}

/* vec_sub */

static vector signed char __ATTRS_o_ai
vec_sub(vector signed char a, vector signed char b)
{
  return a - b;
}

static vector signed char __ATTRS_o_ai
vec_sub(vector bool char a, vector signed char b)
{
  return (vector signed char)a - b;
}

static vector signed char __ATTRS_o_ai
vec_sub(vector signed char a, vector bool char b)
{
  return a - (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_sub(vector unsigned char a, vector unsigned char b)
{
  return a - b;
}

static vector unsigned char __ATTRS_o_ai
vec_sub(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a - b;
}

static vector unsigned char __ATTRS_o_ai
vec_sub(vector unsigned char a, vector bool char b)
{
  return a - (vector unsigned char)b;
}

static vector short __ATTRS_o_ai
vec_sub(vector short a, vector short b)
{
  return a - b;
}

static vector short __ATTRS_o_ai
vec_sub(vector bool short a, vector short b)
{
  return (vector short)a - b;
}

static vector short __ATTRS_o_ai
vec_sub(vector short a, vector bool short b)
{
  return a - (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_sub(vector unsigned short a, vector unsigned short b)
{
  return a - b;
}

static vector unsigned short __ATTRS_o_ai
vec_sub(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a - b;
}

static vector unsigned short __ATTRS_o_ai
vec_sub(vector unsigned short a, vector bool short b)
{
  return a - (vector unsigned short)b;
}

static vector int __ATTRS_o_ai
vec_sub(vector int a, vector int b)
{
  return a - b;
}

static vector int __ATTRS_o_ai
vec_sub(vector bool int a, vector int b)
{
  return (vector int)a - b;
}

static vector int __ATTRS_o_ai
vec_sub(vector int a, vector bool int b)
{
  return a - (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_sub(vector unsigned int a, vector unsigned int b)
{
  return a - b;
}

static vector unsigned int __ATTRS_o_ai
vec_sub(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a - b;
}

static vector unsigned int __ATTRS_o_ai
vec_sub(vector unsigned int a, vector bool int b)
{
  return a - (vector unsigned int)b;
}

static vector float __ATTRS_o_ai
vec_sub(vector float a, vector float b)
{
  return a - b;
}

/* vec_vsububm */

#define __builtin_altivec_vsububm vec_vsububm

static vector signed char __ATTRS_o_ai
vec_vsububm(vector signed char a, vector signed char b)
{
  return a - b;
}

static vector signed char __ATTRS_o_ai
vec_vsububm(vector bool char a, vector signed char b)
{
  return (vector signed char)a - b;
}

static vector signed char __ATTRS_o_ai
vec_vsububm(vector signed char a, vector bool char b)
{
  return a - (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_vsububm(vector unsigned char a, vector unsigned char b)
{
  return a - b;
}

static vector unsigned char __ATTRS_o_ai
vec_vsububm(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a - b;
}

static vector unsigned char __ATTRS_o_ai
vec_vsububm(vector unsigned char a, vector bool char b)
{
  return a - (vector unsigned char)b;
}

/* vec_vsubuhm */

#define __builtin_altivec_vsubuhm vec_vsubuhm

static vector short __ATTRS_o_ai
vec_vsubuhm(vector short a, vector short b)
{
  return a - b;
}

static vector short __ATTRS_o_ai
vec_vsubuhm(vector bool short a, vector short b)
{
  return (vector short)a - b;
}

static vector short __ATTRS_o_ai
vec_vsubuhm(vector short a, vector bool short b)
{
  return a - (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_vsubuhm(vector unsigned short a, vector unsigned short b)
{
  return a - b;
}

static vector unsigned short __ATTRS_o_ai
vec_vsubuhm(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a - b;
}

static vector unsigned short __ATTRS_o_ai
vec_vsubuhm(vector unsigned short a, vector bool short b)
{
  return a - (vector unsigned short)b;
}

/* vec_vsubuwm */

#define __builtin_altivec_vsubuwm vec_vsubuwm

static vector int __ATTRS_o_ai
vec_vsubuwm(vector int a, vector int b)
{
  return a - b;
}

static vector int __ATTRS_o_ai
vec_vsubuwm(vector bool int a, vector int b)
{
  return (vector int)a - b;
}

static vector int __ATTRS_o_ai
vec_vsubuwm(vector int a, vector bool int b)
{
  return a - (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_vsubuwm(vector unsigned int a, vector unsigned int b)
{
  return a - b;
}

static vector unsigned int __ATTRS_o_ai
vec_vsubuwm(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a - b;
}

static vector unsigned int __ATTRS_o_ai
vec_vsubuwm(vector unsigned int a, vector bool int b)
{
  return a - (vector unsigned int)b;
}

/* vec_vsubfp */

#define __builtin_altivec_vsubfp vec_vsubfp

static vector float __attribute__((__always_inline__))
vec_vsubfp(vector float a, vector float b)
{
  return a - b;
}

/* vec_subc */

static vector unsigned int __attribute__((__always_inline__))
vec_subc(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vsubcuw(a, b);
}

/* vec_vsubcuw */

static vector unsigned int __attribute__((__always_inline__))
vec_vsubcuw(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vsubcuw(a, b);
}

/* vec_subs */

static vector signed char __ATTRS_o_ai
vec_subs(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vsubsbs(a, b);
}

static vector signed char __ATTRS_o_ai
vec_subs(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vsubsbs((vector signed char)a, b);
}

static vector signed char __ATTRS_o_ai
vec_subs(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vsubsbs(a, (vector signed char)b);
}

static vector unsigned char __ATTRS_o_ai
vec_subs(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vsububs(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_subs(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vsububs((vector unsigned char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_subs(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vsububs(a, (vector unsigned char)b);
}

static vector short __ATTRS_o_ai
vec_subs(vector short a, vector short b)
{
  return __builtin_altivec_vsubshs(a, b);
}

static vector short __ATTRS_o_ai
vec_subs(vector bool short a, vector short b)
{
  return __builtin_altivec_vsubshs((vector short)a, b);
}

static vector short __ATTRS_o_ai
vec_subs(vector short a, vector bool short b)
{
  return __builtin_altivec_vsubshs(a, (vector short)b);
}

static vector unsigned short __ATTRS_o_ai
vec_subs(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vsubuhs(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_subs(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vsubuhs((vector unsigned short)a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_subs(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vsubuhs(a, (vector unsigned short)b);
}

static vector int __ATTRS_o_ai
vec_subs(vector int a, vector int b)
{
  return __builtin_altivec_vsubsws(a, b);
}

static vector int __ATTRS_o_ai
vec_subs(vector bool int a, vector int b)
{
  return __builtin_altivec_vsubsws((vector int)a, b);
}

static vector int __ATTRS_o_ai
vec_subs(vector int a, vector bool int b)
{
  return __builtin_altivec_vsubsws(a, (vector int)b);
}

static vector unsigned int __ATTRS_o_ai
vec_subs(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vsubuws(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_subs(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vsubuws((vector unsigned int)a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_subs(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vsubuws(a, (vector unsigned int)b);
}

/* vec_vsubsbs */

static vector signed char __ATTRS_o_ai
vec_vsubsbs(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vsubsbs(a, b);
}

static vector signed char __ATTRS_o_ai
vec_vsubsbs(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vsubsbs((vector signed char)a, b);
}

static vector signed char __ATTRS_o_ai
vec_vsubsbs(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vsubsbs(a, (vector signed char)b);
}

/* vec_vsububs */

static vector unsigned char __ATTRS_o_ai
vec_vsububs(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vsububs(a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsububs(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vsububs((vector unsigned char)a, b);
}

static vector unsigned char __ATTRS_o_ai
vec_vsububs(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vsububs(a, (vector unsigned char)b);
}

/* vec_vsubshs */

static vector short __ATTRS_o_ai
vec_vsubshs(vector short a, vector short b)
{
  return __builtin_altivec_vsubshs(a, b);
}

static vector short __ATTRS_o_ai
vec_vsubshs(vector bool short a, vector short b)
{
  return __builtin_altivec_vsubshs((vector short)a, b);
}

static vector short __ATTRS_o_ai
vec_vsubshs(vector short a, vector bool short b)
{
  return __builtin_altivec_vsubshs(a, (vector short)b);
}

/* vec_vsubuhs */

static vector unsigned short __ATTRS_o_ai
vec_vsubuhs(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vsubuhs(a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsubuhs(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vsubuhs((vector unsigned short)a, b);
}

static vector unsigned short __ATTRS_o_ai
vec_vsubuhs(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vsubuhs(a, (vector unsigned short)b);
}

/* vec_vsubsws */

static vector int __ATTRS_o_ai
vec_vsubsws(vector int a, vector int b)
{
  return __builtin_altivec_vsubsws(a, b);
}

static vector int __ATTRS_o_ai
vec_vsubsws(vector bool int a, vector int b)
{
  return __builtin_altivec_vsubsws((vector int)a, b);
}

static vector int __ATTRS_o_ai
vec_vsubsws(vector int a, vector bool int b)
{
  return __builtin_altivec_vsubsws(a, (vector int)b);
}

/* vec_vsubuws */

static vector unsigned int __ATTRS_o_ai
vec_vsubuws(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vsubuws(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsubuws(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vsubuws((vector unsigned int)a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_vsubuws(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vsubuws(a, (vector unsigned int)b);
}

/* vec_sum4s */

static vector int __ATTRS_o_ai
vec_sum4s(vector signed char a, vector int b)
{
  return __builtin_altivec_vsum4sbs(a, b);
}

static vector unsigned int __ATTRS_o_ai
vec_sum4s(vector unsigned char a, vector unsigned int b)
{
  return __builtin_altivec_vsum4ubs(a, b);
}

static vector int __ATTRS_o_ai
vec_sum4s(vector signed short a, vector int b)
{
  return __builtin_altivec_vsum4shs(a, b);
}

/* vec_vsum4sbs */

static vector int __attribute__((__always_inline__))
vec_vsum4sbs(vector signed char a, vector int b)
{
  return __builtin_altivec_vsum4sbs(a, b);
}

/* vec_vsum4ubs */

static vector unsigned int __attribute__((__always_inline__))
vec_vsum4ubs(vector unsigned char a, vector unsigned int b)
{
  return __builtin_altivec_vsum4ubs(a, b);
}

/* vec_vsum4shs */

static vector int __attribute__((__always_inline__))
vec_vsum4shs(vector signed short a, vector int b)
{
  return __builtin_altivec_vsum4shs(a, b);
}

/* vec_sum2s */

static vector signed int __attribute__((__always_inline__))
vec_sum2s(vector int a, vector int b)
{
  return __builtin_altivec_vsum2sws(a, b);
}

/* vec_vsum2sws */

static vector signed int __attribute__((__always_inline__))
vec_vsum2sws(vector int a, vector int b)
{
  return __builtin_altivec_vsum2sws(a, b);
}

/* vec_sums */

static vector signed int __attribute__((__always_inline__))
vec_sums(vector signed int a, vector signed int b)
{
  return __builtin_altivec_vsumsws(a, b);
}

/* vec_vsumsws */

static vector signed int __attribute__((__always_inline__))
vec_vsumsws(vector signed int a, vector signed int b)
{
  return __builtin_altivec_vsumsws(a, b);
}

/* vec_trunc */

static vector float __attribute__((__always_inline__))
vec_trunc(vector float a)
{
  return __builtin_altivec_vrfiz(a);
}

/* vec_vrfiz */

static vector float __attribute__((__always_inline__))
vec_vrfiz(vector float a)
{
  return __builtin_altivec_vrfiz(a);
}

/* vec_unpackh */

static vector short __ATTRS_o_ai
vec_unpackh(vector signed char a)
{
  return __builtin_altivec_vupkhsb((vector char)a);
}

static vector bool short __ATTRS_o_ai
vec_unpackh(vector bool char a)
{
  return (vector bool short)__builtin_altivec_vupkhsb((vector char)a);
}

static vector int __ATTRS_o_ai
vec_unpackh(vector short a)
{
  return __builtin_altivec_vupkhsh(a);
}

static vector bool int __ATTRS_o_ai
vec_unpackh(vector bool short a)
{
  return (vector bool int)__builtin_altivec_vupkhsh((vector short)a);
}

static vector unsigned int __ATTRS_o_ai
vec_unpackh(vector pixel a)
{
  return (vector unsigned int)__builtin_altivec_vupkhsh((vector short)a);
}

/* vec_vupkhsb */

static vector short __ATTRS_o_ai
vec_vupkhsb(vector signed char a)
{
  return __builtin_altivec_vupkhsb((vector char)a);
}

static vector bool short __ATTRS_o_ai
vec_vupkhsb(vector bool char a)
{
  return (vector bool short)__builtin_altivec_vupkhsb((vector char)a);
}

/* vec_vupkhsh */

static vector int __ATTRS_o_ai
vec_vupkhsh(vector short a)
{
  return __builtin_altivec_vupkhsh(a);
}

static vector bool int __ATTRS_o_ai
vec_vupkhsh(vector bool short a)
{
  return (vector bool int)__builtin_altivec_vupkhsh((vector short)a);
}

static vector unsigned int __ATTRS_o_ai
vec_vupkhsh(vector pixel a)
{
  return (vector unsigned int)__builtin_altivec_vupkhsh((vector short)a);
}

/* vec_unpackl */

static vector short __ATTRS_o_ai
vec_unpackl(vector signed char a)
{
  return __builtin_altivec_vupklsb((vector char)a);
}

static vector bool short __ATTRS_o_ai
vec_unpackl(vector bool char a)
{
  return (vector bool short)__builtin_altivec_vupklsb((vector char)a);
}

static vector int __ATTRS_o_ai
vec_unpackl(vector short a)
{
  return __builtin_altivec_vupklsh(a);
}

static vector bool int __ATTRS_o_ai
vec_unpackl(vector bool short a)
{
  return (vector bool int)__builtin_altivec_vupklsh((vector short)a);
}

static vector unsigned int __ATTRS_o_ai
vec_unpackl(vector pixel a)
{
  return (vector unsigned int)__builtin_altivec_vupklsh((vector short)a);
}

/* vec_vupklsb */

static vector short __ATTRS_o_ai
vec_vupklsb(vector signed char a)
{
  return __builtin_altivec_vupklsb((vector char)a);
}

static vector bool short __ATTRS_o_ai
vec_vupklsb(vector bool char a)
{
  return (vector bool short)__builtin_altivec_vupklsb((vector char)a);
}

/* vec_vupklsh */

static vector int __ATTRS_o_ai
vec_vupklsh(vector short a)
{
  return __builtin_altivec_vupklsh(a);
}

static vector bool int __ATTRS_o_ai
vec_vupklsh(vector bool short a)
{
  return (vector bool int)__builtin_altivec_vupklsh((vector short)a);
}

static vector unsigned int __ATTRS_o_ai
vec_vupklsh(vector pixel a)
{
  return (vector unsigned int)__builtin_altivec_vupklsh((vector short)a);
}

/* vec_xor */

#define __builtin_altivec_vxor vec_xor

static vector signed char __ATTRS_o_ai
vec_xor(vector signed char a, vector signed char b)
{
  return a ^ b;
}

static vector signed char __ATTRS_o_ai
vec_xor(vector bool char a, vector signed char b)
{
  return (vector signed char)a ^ b;
}

static vector signed char __ATTRS_o_ai
vec_xor(vector signed char a, vector bool char b)
{
  return a ^ (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_xor(vector unsigned char a, vector unsigned char b)
{
  return a ^ b;
}

static vector unsigned char __ATTRS_o_ai
vec_xor(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a ^ b;
}

static vector unsigned char __ATTRS_o_ai
vec_xor(vector unsigned char a, vector bool char b)
{
  return a ^ (vector unsigned char)b;
}

static vector bool char __ATTRS_o_ai
vec_xor(vector bool char a, vector bool char b)
{
  return a ^ b;
}

static vector short __ATTRS_o_ai
vec_xor(vector short a, vector short b)
{
  return a ^ b;
}

static vector short __ATTRS_o_ai
vec_xor(vector bool short a, vector short b)
{
  return (vector short)a ^ b;
}

static vector short __ATTRS_o_ai
vec_xor(vector short a, vector bool short b)
{
  return a ^ (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_xor(vector unsigned short a, vector unsigned short b)
{
  return a ^ b;
}

static vector unsigned short __ATTRS_o_ai
vec_xor(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a ^ b;
}

static vector unsigned short __ATTRS_o_ai
vec_xor(vector unsigned short a, vector bool short b)
{
  return a ^ (vector unsigned short)b;
}

static vector bool short __ATTRS_o_ai
vec_xor(vector bool short a, vector bool short b)
{
  return a ^ b;
}

static vector int __ATTRS_o_ai
vec_xor(vector int a, vector int b)
{
  return a ^ b;
}

static vector int __ATTRS_o_ai
vec_xor(vector bool int a, vector int b)
{
  return (vector int)a ^ b;
}

static vector int __ATTRS_o_ai
vec_xor(vector int a, vector bool int b)
{
  return a ^ (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_xor(vector unsigned int a, vector unsigned int b)
{
  return a ^ b;
}

static vector unsigned int __ATTRS_o_ai
vec_xor(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a ^ b;
}

static vector unsigned int __ATTRS_o_ai
vec_xor(vector unsigned int a, vector bool int b)
{
  return a ^ (vector unsigned int)b;
}

static vector bool int __ATTRS_o_ai
vec_xor(vector bool int a, vector bool int b)
{
  return a ^ b;
}

static vector float __ATTRS_o_ai
vec_xor(vector float a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a ^ (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_xor(vector bool int a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a ^ (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_xor(vector float a, vector bool int b)
{
  vector unsigned int res = (vector unsigned int)a ^ (vector unsigned int)b;
  return (vector float)res;
}

/* vec_vxor */

static vector signed char __ATTRS_o_ai
vec_vxor(vector signed char a, vector signed char b)
{
  return a ^ b;
}

static vector signed char __ATTRS_o_ai
vec_vxor(vector bool char a, vector signed char b)
{
  return (vector signed char)a ^ b;
}

static vector signed char __ATTRS_o_ai
vec_vxor(vector signed char a, vector bool char b)
{
  return a ^ (vector signed char)b;
}

static vector unsigned char __ATTRS_o_ai
vec_vxor(vector unsigned char a, vector unsigned char b)
{
  return a ^ b;
}

static vector unsigned char __ATTRS_o_ai
vec_vxor(vector bool char a, vector unsigned char b)
{
  return (vector unsigned char)a ^ b;
}

static vector unsigned char __ATTRS_o_ai
vec_vxor(vector unsigned char a, vector bool char b)
{
  return a ^ (vector unsigned char)b;
}

static vector bool char __ATTRS_o_ai
vec_vxor(vector bool char a, vector bool char b)
{
  return a ^ b;
}

static vector short __ATTRS_o_ai
vec_vxor(vector short a, vector short b)
{
  return a ^ b;
}

static vector short __ATTRS_o_ai
vec_vxor(vector bool short a, vector short b)
{
  return (vector short)a ^ b;
}

static vector short __ATTRS_o_ai
vec_vxor(vector short a, vector bool short b)
{
  return a ^ (vector short)b;
}

static vector unsigned short __ATTRS_o_ai
vec_vxor(vector unsigned short a, vector unsigned short b)
{
  return a ^ b;
}

static vector unsigned short __ATTRS_o_ai
vec_vxor(vector bool short a, vector unsigned short b)
{
  return (vector unsigned short)a ^ b;
}

static vector unsigned short __ATTRS_o_ai
vec_vxor(vector unsigned short a, vector bool short b)
{
  return a ^ (vector unsigned short)b;
}

static vector bool short __ATTRS_o_ai
vec_vxor(vector bool short a, vector bool short b)
{
  return a ^ b;
}

static vector int __ATTRS_o_ai
vec_vxor(vector int a, vector int b)
{
  return a ^ b;
}

static vector int __ATTRS_o_ai
vec_vxor(vector bool int a, vector int b)
{
  return (vector int)a ^ b;
}

static vector int __ATTRS_o_ai
vec_vxor(vector int a, vector bool int b)
{
  return a ^ (vector int)b;
}

static vector unsigned int __ATTRS_o_ai
vec_vxor(vector unsigned int a, vector unsigned int b)
{
  return a ^ b;
}

static vector unsigned int __ATTRS_o_ai
vec_vxor(vector bool int a, vector unsigned int b)
{
  return (vector unsigned int)a ^ b;
}

static vector unsigned int __ATTRS_o_ai
vec_vxor(vector unsigned int a, vector bool int b)
{
  return a ^ (vector unsigned int)b;
}

static vector bool int __ATTRS_o_ai
vec_vxor(vector bool int a, vector bool int b)
{
  return a ^ b;
}

static vector float __ATTRS_o_ai
vec_vxor(vector float a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a ^ (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vxor(vector bool int a, vector float b)
{
  vector unsigned int res = (vector unsigned int)a ^ (vector unsigned int)b;
  return (vector float)res;
}

static vector float __ATTRS_o_ai
vec_vxor(vector float a, vector bool int b)
{
  vector unsigned int res = (vector unsigned int)a ^ (vector unsigned int)b;
  return (vector float)res;
}

/* ------------------------ extensions for CBEA ----------------------------- */

/* vec_extract */

static signed char __ATTRS_o_ai
vec_extract(vector signed char a, int b)
{
  return a[b];
}

static unsigned char __ATTRS_o_ai
vec_extract(vector unsigned char a, int b)
{
  return a[b];
}

static short __ATTRS_o_ai
vec_extract(vector short a, int b)
{
  return a[b];
}

static unsigned short __ATTRS_o_ai
vec_extract(vector unsigned short a, int b)
{
  return a[b];
}

static int __ATTRS_o_ai
vec_extract(vector int a, int b)
{
  return a[b];
}

static unsigned int __ATTRS_o_ai
vec_extract(vector unsigned int a, int b)
{
  return a[b];
}

static float __ATTRS_o_ai
vec_extract(vector float a, int b)
{
  return a[b];
}

/* vec_insert */

static vector signed char __ATTRS_o_ai
vec_insert(signed char a, vector signed char b, int c)
{
  b[c] = a;
  return b;
}

static vector unsigned char __ATTRS_o_ai
vec_insert(unsigned char a, vector unsigned char b, int c)
{
  b[c] = a;
  return b;
}

static vector short __ATTRS_o_ai
vec_insert(short a, vector short b, int c)
{
  b[c] = a;
  return b;
}

static vector unsigned short __ATTRS_o_ai
vec_insert(unsigned short a, vector unsigned short b, int c)
{
  b[c] = a;
  return b;
}

static vector int __ATTRS_o_ai
vec_insert(int a, vector int b, int c)
{
  b[c] = a;
  return b;
}

static vector unsigned int __ATTRS_o_ai
vec_insert(unsigned int a, vector unsigned int b, int c)
{
  b[c] = a;
  return b;
}

static vector float __ATTRS_o_ai
vec_insert(float a, vector float b, int c)
{
  b[c] = a;
  return b;
}

/* vec_lvlx */

static vector signed char __ATTRS_o_ai
vec_lvlx(int a, const signed char *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector signed char)(0),
                  vec_lvsl(a, b));
}

static vector signed char __ATTRS_o_ai
vec_lvlx(int a, const vector signed char *b)
{
  return vec_perm(vec_ld(a, b), 
                  (vector signed char)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned char __ATTRS_o_ai
vec_lvlx(int a, const unsigned char *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector unsigned char)(0),
                  vec_lvsl(a, b));
}

static vector unsigned char __ATTRS_o_ai
vec_lvlx(int a, const vector unsigned char *b)
{
  return vec_perm(vec_ld(a, b), 
                  (vector unsigned char)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool char __ATTRS_o_ai
vec_lvlx(int a, const vector bool char *b)
{
  return vec_perm(vec_ld(a, b), 
                  (vector bool char)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector short __ATTRS_o_ai
vec_lvlx(int a, const short *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector short)(0),
                  vec_lvsl(a, b));
}

static vector short __ATTRS_o_ai
vec_lvlx(int a, const vector short *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector short)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned short __ATTRS_o_ai
vec_lvlx(int a, const unsigned short *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector unsigned short)(0),
                  vec_lvsl(a, b));
}

static vector unsigned short __ATTRS_o_ai
vec_lvlx(int a, const vector unsigned short *b)
{
  return vec_perm(vec_ld(a, b), 
                  (vector unsigned short)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool short __ATTRS_o_ai
vec_lvlx(int a, const vector bool short *b)
{
  return vec_perm(vec_ld(a, b), 
                  (vector bool short)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector pixel __ATTRS_o_ai
vec_lvlx(int a, const vector pixel *b)
{
  return vec_perm(vec_ld(a, b), 
                  (vector pixel)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector int __ATTRS_o_ai
vec_lvlx(int a, const int *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector int)(0),
                  vec_lvsl(a, b));
}

static vector int __ATTRS_o_ai
vec_lvlx(int a, const vector int *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector int)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned int __ATTRS_o_ai
vec_lvlx(int a, const unsigned int *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector unsigned int)(0),
                  vec_lvsl(a, b));
}

static vector unsigned int __ATTRS_o_ai
vec_lvlx(int a, const vector unsigned int *b)
{
  return vec_perm(vec_ld(a, b), 
                  (vector unsigned int)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool int __ATTRS_o_ai
vec_lvlx(int a, const vector bool int *b)
{
  return vec_perm(vec_ld(a, b), 
                  (vector bool int)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector float __ATTRS_o_ai
vec_lvlx(int a, const float *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector float)(0),
                  vec_lvsl(a, b));
}

static vector float __ATTRS_o_ai
vec_lvlx(int a, const vector float *b)
{
  return vec_perm(vec_ld(a, b),
                  (vector float)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

/* vec_lvlxl */

static vector signed char __ATTRS_o_ai
vec_lvlxl(int a, const signed char *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector signed char)(0),
                  vec_lvsl(a, b));
}

static vector signed char __ATTRS_o_ai
vec_lvlxl(int a, const vector signed char *b)
{
  return vec_perm(vec_ldl(a, b), 
                  (vector signed char)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned char __ATTRS_o_ai
vec_lvlxl(int a, const unsigned char *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector unsigned char)(0),
                  vec_lvsl(a, b));
}

static vector unsigned char __ATTRS_o_ai
vec_lvlxl(int a, const vector unsigned char *b)
{
  return vec_perm(vec_ldl(a, b), 
                  (vector unsigned char)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool char __ATTRS_o_ai
vec_lvlxl(int a, const vector bool char *b)
{
  return vec_perm(vec_ldl(a, b), 
                  (vector bool char)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector short __ATTRS_o_ai
vec_lvlxl(int a, const short *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector short)(0),
                  vec_lvsl(a, b));
}

static vector short __ATTRS_o_ai
vec_lvlxl(int a, const vector short *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector short)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned short __ATTRS_o_ai
vec_lvlxl(int a, const unsigned short *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector unsigned short)(0),
                  vec_lvsl(a, b));
}

static vector unsigned short __ATTRS_o_ai
vec_lvlxl(int a, const vector unsigned short *b)
{
  return vec_perm(vec_ldl(a, b), 
                  (vector unsigned short)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool short __ATTRS_o_ai
vec_lvlxl(int a, const vector bool short *b)
{
  return vec_perm(vec_ldl(a, b), 
                  (vector bool short)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector pixel __ATTRS_o_ai
vec_lvlxl(int a, const vector pixel *b)
{
  return vec_perm(vec_ldl(a, b), 
                  (vector pixel)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector int __ATTRS_o_ai
vec_lvlxl(int a, const int *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector int)(0),
                  vec_lvsl(a, b));
}

static vector int __ATTRS_o_ai
vec_lvlxl(int a, const vector int *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector int)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned int __ATTRS_o_ai
vec_lvlxl(int a, const unsigned int *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector unsigned int)(0),
                  vec_lvsl(a, b));
}

static vector unsigned int __ATTRS_o_ai
vec_lvlxl(int a, const vector unsigned int *b)
{
  return vec_perm(vec_ldl(a, b), 
                  (vector unsigned int)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool int __ATTRS_o_ai
vec_lvlxl(int a, const vector bool int *b)
{
  return vec_perm(vec_ldl(a, b), 
                  (vector bool int)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector float __ATTRS_o_ai
vec_lvlxl(int a, const float *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector float)(0),
                  vec_lvsl(a, b));
}

static vector float __ATTRS_o_ai
vec_lvlxl(int a, vector float *b)
{
  return vec_perm(vec_ldl(a, b),
                  (vector float)(0),
                  vec_lvsl(a, (unsigned char *)b));
}

/* vec_lvrx */

static vector signed char __ATTRS_o_ai
vec_lvrx(int a, const signed char *b)
{
  return vec_perm((vector signed char)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, b));
}

static vector signed char __ATTRS_o_ai
vec_lvrx(int a, const vector signed char *b)
{
  return vec_perm((vector signed char)(0),
                  vec_ld(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned char __ATTRS_o_ai
vec_lvrx(int a, const unsigned char *b)
{
  return vec_perm((vector unsigned char)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, b));
}

static vector unsigned char __ATTRS_o_ai
vec_lvrx(int a, const vector unsigned char *b)
{
  return vec_perm((vector unsigned char)(0),
                  vec_ld(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool char __ATTRS_o_ai
vec_lvrx(int a, const vector bool char *b)
{
  return vec_perm((vector bool char)(0),
                  vec_ld(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector short __ATTRS_o_ai
vec_lvrx(int a, const short *b)
{
  return vec_perm((vector short)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, b));
}

static vector short __ATTRS_o_ai
vec_lvrx(int a, const vector short *b)
{
  return vec_perm((vector short)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned short __ATTRS_o_ai
vec_lvrx(int a, const unsigned short *b)
{
  return vec_perm((vector unsigned short)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, b));
}

static vector unsigned short __ATTRS_o_ai
vec_lvrx(int a, const vector unsigned short *b)
{
  return vec_perm((vector unsigned short)(0),
                  vec_ld(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool short __ATTRS_o_ai
vec_lvrx(int a, const vector bool short *b)
{
  return vec_perm((vector bool short)(0),
                  vec_ld(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector pixel __ATTRS_o_ai
vec_lvrx(int a, const vector pixel *b)
{
  return vec_perm((vector pixel)(0),
                  vec_ld(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector int __ATTRS_o_ai
vec_lvrx(int a, const int *b)
{
  return vec_perm((vector int)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, b));
}

static vector int __ATTRS_o_ai
vec_lvrx(int a, const vector int *b)
{
  return vec_perm((vector int)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned int __ATTRS_o_ai
vec_lvrx(int a, const unsigned int *b)
{
  return vec_perm((vector unsigned int)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, b));
}

static vector unsigned int __ATTRS_o_ai
vec_lvrx(int a, const vector unsigned int *b)
{
  return vec_perm((vector unsigned int)(0),
                  vec_ld(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool int __ATTRS_o_ai
vec_lvrx(int a, const vector bool int *b)
{
  return vec_perm((vector bool int)(0),
                  vec_ld(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector float __ATTRS_o_ai
vec_lvrx(int a, const float *b)
{
  return vec_perm((vector float)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, b));
}

static vector float __ATTRS_o_ai
vec_lvrx(int a, const vector float *b)
{
  return vec_perm((vector float)(0),
                  vec_ld(a, b),
                  vec_lvsl(a, (unsigned char *)b));
}

/* vec_lvrxl */

static vector signed char __ATTRS_o_ai
vec_lvrxl(int a, const signed char *b)
{
  return vec_perm((vector signed char)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, b));
}

static vector signed char __ATTRS_o_ai
vec_lvrxl(int a, const vector signed char *b)
{
  return vec_perm((vector signed char)(0),
                  vec_ldl(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned char __ATTRS_o_ai
vec_lvrxl(int a, const unsigned char *b)
{
  return vec_perm((vector unsigned char)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, b));
}

static vector unsigned char __ATTRS_o_ai
vec_lvrxl(int a, const vector unsigned char *b)
{
  return vec_perm((vector unsigned char)(0),
                  vec_ldl(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool char __ATTRS_o_ai
vec_lvrxl(int a, const vector bool char *b)
{
  return vec_perm((vector bool char)(0),
                  vec_ldl(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector short __ATTRS_o_ai
vec_lvrxl(int a, const short *b)
{
  return vec_perm((vector short)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, b));
}

static vector short __ATTRS_o_ai
vec_lvrxl(int a, const vector short *b)
{
  return vec_perm((vector short)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned short __ATTRS_o_ai
vec_lvrxl(int a, const unsigned short *b)
{
  return vec_perm((vector unsigned short)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, b));
}

static vector unsigned short __ATTRS_o_ai
vec_lvrxl(int a, const vector unsigned short *b)
{
  return vec_perm((vector unsigned short)(0),
                  vec_ldl(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool short __ATTRS_o_ai
vec_lvrxl(int a, const vector bool short *b)
{
  return vec_perm((vector bool short)(0),
                  vec_ldl(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector pixel __ATTRS_o_ai
vec_lvrxl(int a, const vector pixel *b)
{
  return vec_perm((vector pixel)(0),
                  vec_ldl(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector int __ATTRS_o_ai
vec_lvrxl(int a, const int *b)
{
  return vec_perm((vector int)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, b));
}

static vector int __ATTRS_o_ai
vec_lvrxl(int a, const vector int *b)
{
  return vec_perm((vector int)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, (unsigned char *)b));
}

static vector unsigned int __ATTRS_o_ai
vec_lvrxl(int a, const unsigned int *b)
{
  return vec_perm((vector unsigned int)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, b));
}

static vector unsigned int __ATTRS_o_ai
vec_lvrxl(int a, const vector unsigned int *b)
{
  return vec_perm((vector unsigned int)(0),
                  vec_ldl(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector bool int __ATTRS_o_ai
vec_lvrxl(int a, const vector bool int *b)
{
  return vec_perm((vector bool int)(0),
                  vec_ldl(a, b), 
                  vec_lvsl(a, (unsigned char *)b));
}

static vector float __ATTRS_o_ai
vec_lvrxl(int a, const float *b)
{
  return vec_perm((vector float)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, b));
}

static vector float __ATTRS_o_ai
vec_lvrxl(int a, const vector float *b)
{
  return vec_perm((vector float)(0),
                  vec_ldl(a, b),
                  vec_lvsl(a, (unsigned char *)b));
}

/* vec_stvlx */

static void __ATTRS_o_ai
vec_stvlx(vector signed char a, int b, signed char *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector signed char a, int b, vector signed char *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector unsigned char a, int b, unsigned char *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector unsigned char a, int b, vector unsigned char *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector bool char a, int b, vector bool char *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector short a, int b, short *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector short a, int b, vector short *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector unsigned short a, int b, unsigned short *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector unsigned short a, int b, vector unsigned short *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector bool short a, int b, vector bool short *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector pixel a, int b, vector pixel *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector int a, int b, int *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector int a, int b, vector int *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector unsigned int a, int b, unsigned int *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector unsigned int a, int b, vector unsigned int *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector bool int a, int b, vector bool int *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvlx(vector float a, int b, vector float *c)
{
  return vec_st(vec_perm(vec_lvrx(b, c),
                         a,
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

/* vec_stvlxl */

static void __ATTRS_o_ai
vec_stvlxl(vector signed char a, int b, signed char *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector signed char a, int b, vector signed char *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector unsigned char a, int b, unsigned char *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector unsigned char a, int b, vector unsigned char *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector bool char a, int b, vector bool char *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector short a, int b, short *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector short a, int b, vector short *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector unsigned short a, int b, unsigned short *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector unsigned short a, int b, vector unsigned short *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector bool short a, int b, vector bool short *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector pixel a, int b, vector pixel *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector int a, int b, int *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector int a, int b, vector int *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector unsigned int a, int b, unsigned int *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector unsigned int a, int b, vector unsigned int *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector bool int a, int b, vector bool int *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvlxl(vector float a, int b, vector float *c)
{
  return vec_stl(vec_perm(vec_lvrx(b, c),
                          a,
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

/* vec_stvrx */

static void __ATTRS_o_ai
vec_stvrx(vector signed char a, int b, signed char *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector signed char a, int b, vector signed char *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector unsigned char a, int b, unsigned char *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector unsigned char a, int b, vector unsigned char *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector bool char a, int b, vector bool char *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector short a, int b, short *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector short a, int b, vector short *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector unsigned short a, int b, unsigned short *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector unsigned short a, int b, vector unsigned short *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector bool short a, int b, vector bool short *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector pixel a, int b, vector pixel *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector int a, int b, int *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector int a, int b, vector int *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector unsigned int a, int b, unsigned int *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector unsigned int a, int b, vector unsigned int *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector bool int a, int b, vector bool int *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

static void __ATTRS_o_ai
vec_stvrx(vector float a, int b, vector float *c)
{
  return vec_st(vec_perm(a,
                         vec_lvlx(b, c),
                         vec_lvsr(b, (unsigned char *)c)),
                b, c);
}

/* vec_stvrxl */

static void __ATTRS_o_ai
vec_stvrxl(vector signed char a, int b, signed char *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector signed char a, int b, vector signed char *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector unsigned char a, int b, unsigned char *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector unsigned char a, int b, vector unsigned char *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector bool char a, int b, vector bool char *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector short a, int b, short *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector short a, int b, vector short *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector unsigned short a, int b, unsigned short *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector unsigned short a, int b, vector unsigned short *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector bool short a, int b, vector bool short *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector pixel a, int b, vector pixel *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector int a, int b, int *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector int a, int b, vector int *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector unsigned int a, int b, unsigned int *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector unsigned int a, int b, vector unsigned int *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector bool int a, int b, vector bool int *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

static void __ATTRS_o_ai
vec_stvrxl(vector float a, int b, vector float *c)
{
  return vec_stl(vec_perm(a,
                          vec_lvlx(b, c),
                          vec_lvsr(b, (unsigned char *)c)),
                 b, c);
}

/* vec_promote */

static vector signed char __ATTRS_o_ai
vec_promote(signed char a, int b)
{
  vector signed char res = (vector signed char)(0);
  res[b] = a;
  return res;
}

static vector unsigned char __ATTRS_o_ai
vec_promote(unsigned char a, int b)
{
  vector unsigned char res = (vector unsigned char)(0);
  res[b] = a;
  return res;
}

static vector short __ATTRS_o_ai
vec_promote(short a, int b)
{
  vector short res = (vector short)(0);
  res[b] = a;
  return res;
}

static vector unsigned short __ATTRS_o_ai
vec_promote(unsigned short a, int b)
{
  vector unsigned short res = (vector unsigned short)(0);
  res[b] = a;
  return res;
}

static vector int __ATTRS_o_ai
vec_promote(int a, int b)
{
  vector int res = (vector int)(0);
  res[b] = a;
  return res;
}

static vector unsigned int __ATTRS_o_ai
vec_promote(unsigned int a, int b)
{
  vector unsigned int res = (vector unsigned int)(0);
  res[b] = a;
  return res;
}

static vector float __ATTRS_o_ai
vec_promote(float a, int b)
{
  vector float res = (vector float)(0);
  res[b] = a;
  return res;
}

/* vec_splats */

static vector signed char __ATTRS_o_ai
vec_splats(signed char a)
{
  return (vector signed char)(a);
}

static vector unsigned char __ATTRS_o_ai
vec_splats(unsigned char a)
{
  return (vector unsigned char)(a);
}

static vector short __ATTRS_o_ai
vec_splats(short a)
{
  return (vector short)(a);
}

static vector unsigned short __ATTRS_o_ai
vec_splats(unsigned short a)
{
  return (vector unsigned short)(a);
}

static vector int __ATTRS_o_ai
vec_splats(int a)
{
  return (vector int)(a);
}

static vector unsigned int __ATTRS_o_ai
vec_splats(unsigned int a)
{
  return (vector unsigned int)(a);
}

static vector float __ATTRS_o_ai
vec_splats(float a)
{
  return (vector float)(a);
}

/* ----------------------------- predicates --------------------------------- */

/* vec_all_eq */

static int __ATTRS_o_ai
vec_all_eq(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_LT, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector short a, vector short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT, a, b);
}

static int __ATTRS_o_ai
vec_all_eq(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT, a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector unsigned short a, vector unsigned short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector unsigned short a, vector bool short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool short a, vector short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool short a, vector unsigned short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool short a, vector bool short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector pixel a, vector pixel b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_LT, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector int a, vector int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT, a, b);
}

static int __ATTRS_o_ai
vec_all_eq(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT, a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_eq(vector float a, vector float b)
{
  return __builtin_altivec_vcmpeqfp_p(__CR6_LT, a, b);
}

/* vec_all_ge */

static int __ATTRS_o_ai
vec_all_ge(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_EQ, b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_EQ, (vector signed char)b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ, b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ, (vector unsigned char)b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ,
                                      (vector unsigned char)b,
                                      (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ, b, (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ,
                                      (vector unsigned char)b,
                                      (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector short a, vector short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_EQ, b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_EQ, (vector short)b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, (vector unsigned short)b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ,
                                      (vector unsigned short)b,
                                      (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, b, (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ,
                                      (vector unsigned short)b,
                                      (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector int a, vector int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_EQ, b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_EQ, (vector int)b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, (vector unsigned int)b, a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ,
                                      (vector unsigned int)b,
                                      (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, b, (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ,
                                      (vector unsigned int)b,
                                      (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_all_ge(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgefp_p(__CR6_LT, a, b);
}

/* vec_all_gt */

static int __ATTRS_o_ai
vec_all_gt(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_LT, a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_LT, a, (vector signed char)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT, a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT, a, (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT,
                                      (vector unsigned char)a,
                                      (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT, (vector unsigned char)a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT,
                                      (vector unsigned char)a,
                                      (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector short a, vector short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_LT, a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_LT, a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT, a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT, a, (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT,
                                      (vector unsigned short)a,
                                      (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT, (vector unsigned short)a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT,
                                      (vector unsigned short)a,
                                      (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector int a, vector int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_LT, a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_LT, a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT, a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT, a, (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT,
                                      (vector unsigned int)a,
                                      (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT, (vector unsigned int)a, b);
}

static int __ATTRS_o_ai
vec_all_gt(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT,
                                      (vector unsigned int)a,
                                      (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_all_gt(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgtfp_p(__CR6_LT, a, b);
}

/* vec_all_in */

static int __attribute__((__always_inline__))
vec_all_in(vector float a, vector float b)
{
  return __builtin_altivec_vcmpbfp_p(__CR6_EQ, a, b);
}

/* vec_all_le */

static int __ATTRS_o_ai
vec_all_le(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_EQ, a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_EQ, a, (vector signed char)b);
}

static int __ATTRS_o_ai
vec_all_le(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ, a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ, a, (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ,
                                      (vector unsigned char)a,
                                      (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ, (vector unsigned char)a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ,
                                      (vector unsigned char)a,
                                      (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_all_le(vector short a, vector short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_EQ, a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_EQ, a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_le(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, a, (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ,
                                      (vector unsigned short)a,
                                      (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ, (vector unsigned short)a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ,
                                      (vector unsigned short)a,
                                      (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_all_le(vector int a, vector int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_EQ, a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_EQ, a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_le(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, a, (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ,
                                      (vector unsigned int)a,
                                      (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ, (vector unsigned int)a, b);
}

static int __ATTRS_o_ai
vec_all_le(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ,
                                      (vector unsigned int)a,
                                      (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_all_le(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgefp_p(__CR6_LT, b, a);
}

/* vec_all_lt */

static int __ATTRS_o_ai
vec_all_lt(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_LT, b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_LT, (vector signed char)b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT, b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT, (vector unsigned char)b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT,
                                      (vector unsigned char)b,
                                      (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT, b, (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT,
                                      (vector unsigned char)b,
                                      (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector short a, vector short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_LT, b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_LT, (vector short)b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT, b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT, (vector unsigned short)b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT,
                                      (vector unsigned short)b,
                                      (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT, b, (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT,
                                      (vector unsigned short)b,
                                      (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector int a, vector int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_LT, b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_LT, (vector int)b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT, b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT, (vector unsigned int)b, a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT,
                                      (vector unsigned int)b,
                                      (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT, b, (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT,
                                      (vector unsigned int)b,
                                      (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_all_lt(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgtfp_p(__CR6_LT, b, a);
}

/* vec_all_nan */

static int __attribute__((__always_inline__))
vec_all_nan(vector float a)
{
  return __builtin_altivec_vcmpeqfp_p(__CR6_EQ, a, a);
}

/* vec_all_ne */

static int __ATTRS_o_ai
vec_all_ne(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpequb_p(__CR6_EQ, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector short a, vector short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ, a, b);
}

static int __ATTRS_o_ai
vec_all_ne(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ, a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector unsigned short a, vector unsigned short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector unsigned short a, vector bool short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool short a, vector short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool short a, vector unsigned short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool short a, vector bool short b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector pixel a, vector pixel b)
{
  return
    __builtin_altivec_vcmpequh_p(__CR6_EQ, (vector short)a, (vector short)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector int a, vector int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ, a, b);
}

static int __ATTRS_o_ai
vec_all_ne(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ, a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_all_ne(vector float a, vector float b)
{
  return __builtin_altivec_vcmpeqfp_p(__CR6_EQ, a, b);
}

/* vec_all_nge */

static int __attribute__((__always_inline__))
vec_all_nge(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgefp_p(__CR6_EQ, a, b);
}

/* vec_all_ngt */

static int __attribute__((__always_inline__))
vec_all_ngt(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgtfp_p(__CR6_EQ, a, b);
}

/* vec_all_nle */

static int __attribute__((__always_inline__))
vec_all_nle(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgefp_p(__CR6_EQ, b, a);
}

/* vec_all_nlt */

static int __attribute__((__always_inline__))
vec_all_nlt(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgtfp_p(__CR6_EQ, b, a);
}

/* vec_all_numeric */

static int __attribute__((__always_inline__))
vec_all_numeric(vector float a)
{
  return __builtin_altivec_vcmpeqfp_p(__CR6_LT, a, a);
}

/* vec_any_eq */

static int __ATTRS_o_ai
vec_any_eq(vector signed char a, vector signed char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector signed char a, vector bool char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector unsigned char a, vector unsigned char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector unsigned char a, vector bool char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool char a, vector signed char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool char a, vector unsigned char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool char a, vector bool char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_EQ_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector short a, vector short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_eq(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV, a, (vector short)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV, 
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV, 
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV,
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector pixel a, vector pixel b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_EQ_REV, 
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector int a, vector int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_eq(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector unsigned int a, vector unsigned int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector unsigned int a, vector bool int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool int a, vector int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool int a, vector unsigned int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector bool int a, vector bool int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_EQ_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_eq(vector float a, vector float b)
{
  return __builtin_altivec_vcmpeqfp_p(__CR6_EQ_REV, a, b);
}

/* vec_any_ge */

static int __ATTRS_o_ai
vec_any_ge(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_LT_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_LT_REV, (vector signed char)b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector unsigned char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, (vector unsigned char)b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV,
                                      (vector unsigned char)b,
                                      (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, b, (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV,
                                      (vector unsigned char)b,
                                      (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector short a, vector short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_LT_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_LT_REV, (vector short)b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector unsigned short a, vector bool short b)
{
  return
    __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, (vector unsigned short)b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV,
                                      (vector unsigned short)b,
                                      (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool short a, vector unsigned short b)
{
  return 
    __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, b, (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV,
                                      (vector unsigned short)b,
                                      (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector int a, vector int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_LT_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_LT_REV, (vector int)b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, (vector unsigned int)b, a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV,
                                      (vector unsigned int)b,
                                      (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, b, (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV,
                                      (vector unsigned int)b,
                                      (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_any_ge(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgefp_p(__CR6_EQ_REV, a, b);
}

/* vec_any_gt */

static int __ATTRS_o_ai
vec_any_gt(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_EQ_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_EQ_REV, a, (vector signed char)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector unsigned char a, vector bool char b)
{
  return 
    __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, a, (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV,
                                      (vector unsigned char)a,
                                      (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool char a, vector unsigned char b)
{
  return 
    __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, (vector unsigned char)a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV,
                                      (vector unsigned char)a,
                                      (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector short a, vector short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_EQ_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_EQ_REV, a, (vector short)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector unsigned short a, vector bool short b)
{
  return 
    __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, a, (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV,
                                      (vector unsigned short)a,
                                      (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool short a, vector unsigned short b)
{
  return
    __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, (vector unsigned short)a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV,
                                      (vector unsigned short)a,
                                      (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector int a, vector int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_EQ_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_EQ_REV, a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, a, (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV,
                                      (vector unsigned int)a,
                                      (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, (vector unsigned int)a, b);
}

static int __ATTRS_o_ai
vec_any_gt(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV,
                                      (vector unsigned int)a,
                                      (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_any_gt(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgtfp_p(__CR6_EQ_REV, a, b);
}

/* vec_any_le */

static int __ATTRS_o_ai
vec_any_le(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_LT_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_LT_REV, a, (vector signed char)b);
}

static int __ATTRS_o_ai
vec_any_le(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector unsigned char a, vector bool char b)
{
  return 
    __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, a, (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV,
                                      (vector unsigned char)a,
                                      (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool char a, vector unsigned char b)
{
  return 
    __builtin_altivec_vcmpgtub_p(__CR6_LT_REV, (vector unsigned char)a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_LT_REV,
                                      (vector unsigned char)a,
                                      (vector unsigned char)b);
}

static int __ATTRS_o_ai
vec_any_le(vector short a, vector short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_LT_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_LT_REV, a, (vector short)b);
}

static int __ATTRS_o_ai
vec_any_le(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector unsigned short a, vector bool short b)
{
  return 
    __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, a, (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV,
                                      (vector unsigned short)a,
                                      (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool short a, vector unsigned short b)
{
  return 
    __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV, (vector unsigned short)a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_LT_REV,
                                      (vector unsigned short)a,
                                      (vector unsigned short)b);
}

static int __ATTRS_o_ai
vec_any_le(vector int a, vector int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_LT_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_LT_REV, a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_le(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, a, (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV,
                                      (vector unsigned int)a,
                                      (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV, (vector unsigned int)a, b);
}

static int __ATTRS_o_ai
vec_any_le(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_LT_REV,
                                      (vector unsigned int)a,
                                      (vector unsigned int)b);
}

static int __ATTRS_o_ai
vec_any_le(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgefp_p(__CR6_EQ_REV, b, a);
}

/* vec_any_lt */

static int __ATTRS_o_ai
vec_any_lt(vector signed char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_EQ_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector signed char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtsb_p(__CR6_EQ_REV, (vector signed char)b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector unsigned char a, vector unsigned char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector unsigned char a, vector bool char b)
{
  return 
    __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, (vector unsigned char)b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool char a, vector signed char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV,
                                      (vector unsigned char)b,
                                      (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool char a, vector unsigned char b)
{
  return 
    __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV, b, (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool char a, vector bool char b)
{
  return __builtin_altivec_vcmpgtub_p(__CR6_EQ_REV,
                                      (vector unsigned char)b,
                                      (vector unsigned char)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector short a, vector short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_EQ_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtsh_p(__CR6_EQ_REV, (vector short)b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector unsigned short a, vector bool short b)
{
  return 
    __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, (vector unsigned short)b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV,
                                      (vector unsigned short)b,
                                      (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool short a, vector unsigned short b)
{
  return 
    __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV, b, (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpgtuh_p(__CR6_EQ_REV,
                                      (vector unsigned short)b,
                                      (vector unsigned short)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector int a, vector int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_EQ_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtsw_p(__CR6_EQ_REV, (vector int)b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector unsigned int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector unsigned int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, (vector unsigned int)b, a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool int a, vector int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV,
                                      (vector unsigned int)b,
                                      (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool int a, vector unsigned int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV, b, (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector bool int a, vector bool int b)
{
  return __builtin_altivec_vcmpgtuw_p(__CR6_EQ_REV,
                                      (vector unsigned int)b,
                                      (vector unsigned int)a);
}

static int __ATTRS_o_ai
vec_any_lt(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgtfp_p(__CR6_EQ_REV, b, a);
}

/* vec_any_nan */

static int __attribute__((__always_inline__))
vec_any_nan(vector float a)
{
  return __builtin_altivec_vcmpeqfp_p(__CR6_LT_REV, a, a);
}

/* vec_any_ne */

static int __ATTRS_o_ai
vec_any_ne(vector signed char a, vector signed char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector signed char a, vector bool char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector unsigned char a, vector unsigned char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector unsigned char a, vector bool char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool char a, vector signed char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool char a, vector unsigned char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool char a, vector bool char b)
{
  return
    __builtin_altivec_vcmpequb_p(__CR6_LT_REV, (vector char)a, (vector char)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector short a, vector short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_ne(vector short a, vector bool short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT_REV, a, (vector short)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector unsigned short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT_REV, 
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector unsigned short a, vector bool short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool short a, vector short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool short a, vector unsigned short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool short a, vector bool short b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector pixel a, vector pixel b)
{
  return __builtin_altivec_vcmpequh_p(__CR6_LT_REV,
                                      (vector short)a,
                                      (vector short)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector int a, vector int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT_REV, a, b);
}

static int __ATTRS_o_ai
vec_any_ne(vector int a, vector bool int b)
{
  return __builtin_altivec_vcmpequw_p(__CR6_LT_REV, a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector unsigned int a, vector unsigned int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector unsigned int a, vector bool int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool int a, vector int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool int a, vector unsigned int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector bool int a, vector bool int b)
{
  return
    __builtin_altivec_vcmpequw_p(__CR6_LT_REV, (vector int)a, (vector int)b);
}

static int __ATTRS_o_ai
vec_any_ne(vector float a, vector float b)
{
  return __builtin_altivec_vcmpeqfp_p(__CR6_LT_REV, a, b);
}

/* vec_any_nge */

static int __attribute__((__always_inline__))
vec_any_nge(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgefp_p(__CR6_LT_REV, a, b);
}

/* vec_any_ngt */

static int __attribute__((__always_inline__))
vec_any_ngt(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgtfp_p(__CR6_LT_REV, a, b);
}

/* vec_any_nle */

static int __attribute__((__always_inline__))
vec_any_nle(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgefp_p(__CR6_LT_REV, b, a);
}

/* vec_any_nlt */

static int __attribute__((__always_inline__))
vec_any_nlt(vector float a, vector float b)
{
  return __builtin_altivec_vcmpgtfp_p(__CR6_LT_REV, b, a);
}

/* vec_any_numeric */

static int __attribute__((__always_inline__))
vec_any_numeric(vector float a)
{
  return __builtin_altivec_vcmpeqfp_p(__CR6_EQ_REV, a, a);
}

/* vec_any_out */

static int __attribute__((__always_inline__))
vec_any_out(vector float a, vector float b)
{
  return __builtin_altivec_vcmpbfp_p(__CR6_EQ_REV, a, b);
}

#undef __ATTRS_o_ai

#endif /* __ALTIVEC_H */
