/* Cell SPU 2 VMX intrinsics header
   Copyright (C) 2007, 2009 Free Software Foundation, Inc.

   This file is free software; you can redistribute it and/or modify it under
   the terms of the GNU General Public License as published by the Free
   Software Foundation; either version 3 of the License, or (at your option) 
   any later version.

   This file is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
   for more details.

   Under Section 7 of GPL version 3, you are granted additional
   permissions described in the GCC Runtime Library Exception, version
   3.1, as published by the Free Software Foundation.

   You should have received a copy of the GNU General Public License and
   a copy of the GCC Runtime Library Exception along with this program;
   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
   <http://www.gnu.org/licenses/>.  */

#ifndef _SPU2VMX_H_
#define _SPU2VMX_H_	1

#ifdef __cplusplus

#ifndef __SPU__

#include <si2vmx.h>

/* spu_absd (absolute difference)
 * ========
 */
static __inline vec_uchar16 spu_absd(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_uchar16)(si_absdb((qword)(a), (qword)(b))));

}


/* spu_add
 * =======
 */
static __inline vec_uint4 spu_add(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_a((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_add(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_a((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_add(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_ah((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_add(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_ah((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_add(vec_uint4 a, unsigned int b)
{
  return ((vec_uint4)(si_ai((qword)(a), (int)(b))));
}

static __inline vec_int4 spu_add(vec_int4 a, int b)
{
  return ((vec_int4)(si_ai((qword)(a), b)));
}

static __inline vec_ushort8 spu_add(vec_ushort8 a, unsigned short b)
{
  return ((vec_ushort8)(si_ahi((qword)(a), (short)(b))));
}

static __inline vec_short8 spu_add(vec_short8 a, short b)
{
  return ((vec_short8)(si_ahi((qword)(a), b)));
}

static __inline vec_float4 spu_add(vec_float4 a, vec_float4 b)
{
  return ((vec_float4)(si_fa((qword)(a), (qword)(b))));
}

static __inline vec_double2 spu_add(vec_double2 a, vec_double2 b)
{
  return ((vec_double2)(si_dfa((qword)(a), (qword)(b))));
}


/* spu_addx
 * ========
 */
static __inline vec_uint4 spu_addx(vec_uint4 a, vec_uint4 b, vec_uint4 c)
{
  return ((vec_uint4)(si_addx((qword)(a), (qword)(b), (qword)(c))));
}

static __inline vec_int4 spu_addx(vec_int4 a, vec_int4 b, vec_int4 c)
{
  return ((vec_int4)(si_addx((qword)(a), (qword)(b), (qword)(c))));
}


/* spu_and
 * =======
 */
static __inline vec_uchar16 spu_and(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_uchar16)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_char16 spu_and(vec_char16 a, vec_char16 b)
{
  return ((vec_char16)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_and(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_and(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_and(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_and(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_float4 spu_and(vec_float4 a, vec_float4 b)
{
  return ((vec_float4)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_ullong2 spu_and(vec_ullong2 a, vec_ullong2 b)
{
  return ((vec_ullong2)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_llong2 spu_and(vec_llong2 a, vec_llong2 b)
{
  return ((vec_llong2)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_double2 spu_and(vec_double2 a, vec_double2 b)
{
  return ((vec_double2)(si_and((qword)(a), (qword)(b))));
}

static __inline vec_uchar16 spu_and(vec_uchar16 a, unsigned char b)
{
  return ((vec_uchar16)(si_andbi((qword)(a), (signed char)(b))));
}


static __inline vec_char16 spu_and(vec_char16 a, signed char b)
{
  return ((vec_char16)(si_andbi((qword)(a), b)));
}

static __inline vec_ushort8 spu_and(vec_ushort8 a, unsigned short b)
{
  return ((vec_ushort8)(si_andhi((qword)(a), (signed short)(b))));
}

static __inline vec_short8 spu_and(vec_short8 a, signed short b)
{
  return ((vec_short8)(si_andhi((qword)(a), b)));
}

static __inline vec_uint4 spu_and(vec_uint4 a, unsigned int b)
{
  return ((vec_uint4)(si_andi((qword)(a), (signed int)(b))));
}

static __inline vec_int4 spu_and(vec_int4 a, signed int b)
{
  return ((vec_int4)(si_andi((qword)(a), b)));
}


/* spu_andc
 * ========
 */
#define spu_andc(_a, _b)	vec_andc(_a, _b)


/* spu_avg
 * =======
 */
#define spu_avg(_a, _b)		vec_avg(_a, _b)
  

/* spu_bisled
 * spu_bisled_d
 * spu_bisled_e
 * ============
 */
#define spu_bisled(_func)	/* not mappable */
#define spu_bisled_d(_func)	/* not mappable */
#define spu_bisled_e(_func)	/* not mappable */

/* spu_cmpabseq
 * ============
 */
static __inline vec_uint4 spu_cmpabseq(vec_float4 a, vec_float4 b)
{
  return ((vec_uint4)(si_fcmeq((qword)(a), (qword)(b))));

}

static __inline vec_ullong2 spu_cmpabseq(vec_double2 a, vec_double2 b)
{
  return ((vec_ullong2)(si_dfcmeq((qword)(a), (qword)(b))));
}


/* spu_cmpabsgt
 * ============
 */
static __inline vec_uint4 spu_cmpabsgt(vec_float4 a, vec_float4 b)
{
  return ((vec_uint4)(si_fcmgt((qword)(a), (qword)(b))));
}

static __inline vec_ullong2 spu_cmpabsgt(vec_double2 a, vec_double2 b)
{
  return ((vec_ullong2)(si_dfcmgt((qword)(a), (qword)(b))));
}


/* spu_cmpeq
 * ========
 */
static __inline vec_uchar16 spu_cmpeq(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_uchar16)(si_ceqb((qword)(a), (qword)(b))));
}

static __inline vec_uchar16 spu_cmpeq(vec_char16 a, vec_char16 b)
{
  return ((vec_uchar16)(si_ceqb((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_cmpeq(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_ceqh((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_cmpeq(vec_short8 a, vec_short8 b)
{
  return ((vec_ushort8)(si_ceqh((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_cmpeq(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_ceq((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_cmpeq(vec_int4 a, vec_int4 b)
{
  return ((vec_uint4)(si_ceq((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_cmpeq(vec_float4 a, vec_float4 b)
{
  return ((vec_uint4)(si_fceq((qword)(a), (qword)(b))));
}

static __inline vec_uchar16 spu_cmpeq(vec_uchar16 a, unsigned char b)
{
  return ((vec_uchar16)(si_ceqbi((qword)(a), (signed char)(b))));
}

static __inline vec_uchar16 spu_cmpeq(vec_char16 a, signed char b)
{
  return ((vec_uchar16)(si_ceqbi((qword)(a), b)));
}

static __inline vec_ushort8 spu_cmpeq(vec_ushort8 a, unsigned short b)
{
  return ((vec_ushort8)(si_ceqhi((qword)(a), (signed short)(b))));
}

static __inline vec_ushort8 spu_cmpeq(vec_short8 a, signed short b)
{
  return ((vec_ushort8)(si_ceqhi((qword)(a), b)));
}

static __inline vec_uint4 spu_cmpeq(vec_uint4 a, unsigned int b)
{
  return ((vec_uint4)(si_ceqi((qword)(a), (signed int)(b))));
}

static __inline vec_uint4 spu_cmpeq(vec_int4 a, signed int b)
{
  return ((vec_uint4)(si_ceqi((qword)(a), b)));
}

static __inline vec_ullong2 spu_cmpeq(vec_double2 a, vec_double2 b)
{
  return ((vec_ullong2)(si_dfceq((qword)(a), (qword)(b))));
}


/* spu_cmpgt
 * ========
 */
static __inline vec_uchar16 spu_cmpgt(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_uchar16)(si_clgtb((qword)(a), (qword)(b))));
}

static __inline vec_uchar16 spu_cmpgt(vec_char16 a, vec_char16 b)
{
  return ((vec_uchar16)(si_cgtb((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_cmpgt(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_clgth((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_cmpgt(vec_short8 a, vec_short8 b)
{
  return ((vec_ushort8)(si_cgth((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_cmpgt(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_clgt((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_cmpgt(vec_int4 a, vec_int4 b)
{
  return ((vec_uint4)(si_cgt((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_cmpgt(vec_float4 a, vec_float4 b)
{
  return ((vec_uint4)(si_fcgt((qword)(a), (qword)(b))));
}

static __inline vec_uchar16 spu_cmpgt(vec_uchar16 a, unsigned char b)
{
  return ((vec_uchar16)(si_clgtbi((qword)(a), b)));
}

static __inline vec_uchar16 spu_cmpgt(vec_char16 a, signed char b)
{
  return ((vec_uchar16)(si_cgtbi((qword)(a), b)));
}

static __inline vec_ushort8 spu_cmpgt(vec_ushort8 a, unsigned short b)
{
  return ((vec_ushort8)(si_clgthi((qword)(a), b)));
}

static __inline vec_ushort8 spu_cmpgt(vec_short8 a, signed short b)
{
  return ((vec_ushort8)(si_cgthi((qword)(a), b)));
}

static __inline vec_uint4 spu_cmpgt(vec_uint4 a, unsigned int b)
{
  return ((vec_uint4)(si_clgti((qword)(a), b)));
}

static __inline vec_uint4 spu_cmpgt(vec_int4 a, signed int b)
{
  return ((vec_uint4)(si_cgti((qword)(a), b)));
}

static __inline vec_ullong2 spu_cmpgt(vec_double2 a, vec_double2 b)
{
  return ((vec_ullong2)(si_dfcgt((qword)(a), (qword)(b))));
}


/* spu_cntb
 * ========
 */
static __inline vec_uchar16 spu_cntb(vec_uchar16 a)
{
  return ((vec_uchar16)(si_cntb((qword)(a))));
}


static __inline vec_uchar16 spu_cntb(vec_char16 a)
{
  return ((vec_uchar16)(si_cntb((qword)(a))));
}

/* spu_cntlz
 * =========
 */
static __inline vec_uint4 spu_cntlz(vec_uint4 a)
{
  return ((vec_uint4)(si_clz((qword)(a))));
}

static __inline vec_uint4 spu_cntlz(vec_int4 a)
{
  return ((vec_uint4)(si_clz((qword)(a))));
}

static __inline vec_uint4 spu_cntlz(vec_float4 a)
{
  return ((vec_uint4)(si_clz((qword)(a))));
}

/* spu_testsv
 * ==========
 */
static __inline vec_ullong2 spu_testsv(vec_double2 a, char b)
{
  return ((vec_ullong2)(si_dftsv((qword)(a), b)));
}

/* spu_convtf
 * ==========
 */
#define spu_convtf(_a, _b)	(vec_ctf(_a, _b))

/* spu_convts
 * ==========
 */
#define spu_convts(_a, _b)	(vec_cts(_a, _b))

/* spu_convtu
 * ==========
 */
#define spu_convtu(_a, _b)	(vec_ctu(_a, _b))


/* spu_dsync
 * ========
 */
#define spu_dsync()

/* spu_eqv
 * =======
 */
static __inline vec_uchar16 spu_eqv(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_uchar16)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_char16 spu_eqv(vec_char16 a, vec_char16 b)
{
  return ((vec_char16)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_eqv(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_eqv(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_eqv(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_eqv(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_float4 spu_eqv(vec_float4 a, vec_float4 b)
{
  return ((vec_float4)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_ullong2 spu_eqv(vec_ullong2 a, vec_ullong2 b)
{
  return ((vec_ullong2)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_llong2 spu_eqv(vec_llong2 a, vec_llong2 b)
{
  return ((vec_llong2)(si_eqv((qword)(a), (qword)(b))));
}

static __inline vec_double2 spu_eqv(vec_double2 a, vec_double2 b)
{
  return ((vec_double2)(si_eqv((qword)(a), (qword)(b))));
}

/* spu_extend
 * ========
 */
static __inline vec_short8 spu_extend(vec_char16 a)
{
  return ((vec_short8)(si_xsbh((qword)(a))));
}


static __inline vec_int4 spu_extend(vec_short8 a)
{
  return ((vec_int4)(si_xshw((qword)(a))));
}

static __inline vec_llong2 spu_extend(vec_int4 a)
{
  return ((vec_llong2)(si_xswd((qword)(a))));
}


static __inline vec_double2 spu_extend(vec_float4 a)
{
  return ((vec_double2)(si_fesd((qword)(a))));
}


/* spu_extract
 * ========
 */
static __inline unsigned char spu_extract(vec_uchar16 a, int element)
{
  union {
    vec_uchar16 v;
    unsigned char c[16];
  } in;

  in.v = a;
  return (in.c[element & 15]);
}

static __inline signed char spu_extract(vec_char16 a, int element)
{
  union {
    vec_char16 v;
    signed char c[16];
  } in;

  in.v = a;
  return (in.c[element & 15]);
}

static __inline unsigned short spu_extract(vec_ushort8 a, int element)
{
  union {
    vec_ushort8 v;
    unsigned short s[8];
  } in;

  in.v = a;
  return (in.s[element & 7]);
}

static __inline signed short spu_extract(vec_short8 a, int element)
{
  union {
    vec_short8 v;
    signed short s[8];
  } in;

  in.v = a;
  return (in.s[element & 7]);
}

static __inline unsigned int spu_extract(vec_uint4 a, int element)
{
  union {
    vec_uint4 v;
    unsigned int i[4];
  } in;

  in.v = a;
  return (in.i[element & 3]);
}

static __inline signed int spu_extract(vec_int4 a, int element)
{
  union {
    vec_int4 v;
    signed int i[4];
  } in;

  in.v = a;
  return (in.i[element & 3]);
}

static __inline float spu_extract(vec_float4 a, int element)
{
  union {
    vec_float4 v;
    float f[4];
  } in;

  in.v = a;
  return (in.f[element & 3]);
}

static __inline unsigned long long  spu_extract(vec_ullong2 a, int element)
{
  union {
    vec_ullong2 v;
    unsigned long long l[2];
  } in;

  in.v = a;
  return (in.l[element & 1]);
}

static __inline signed long long  spu_extract(vec_llong2 a, int element)
{
  union {
    vec_llong2 v;
    signed long long l[2];
  } in;

  in.v = a;
  return (in.l[element & 1]);
}

static __inline double spu_extract(vec_double2 a, int element)
{
  union {
    vec_double2 v;
    double d[2];
  } in;

  in.v = a;
  return (in.d[element & 1]);
}

/* spu_gather
 * ========
 */
static __inline vec_uint4 spu_gather(vec_uchar16 a)
{
  return ((vec_uint4)(si_gbb((qword)(a))));
}


static __inline vec_uint4 spu_gather(vec_char16 a)
{
  return ((vec_uint4)(si_gbb((qword)(a))));
}

static __inline vec_uint4 spu_gather(vec_ushort8 a)
{
  return ((vec_uint4)(si_gbh((qword)(a))));
}

static __inline vec_uint4 spu_gather(vec_short8 a)
{
  return ((vec_uint4)(si_gbh((qword)(a))));
}


static __inline vec_uint4 spu_gather(vec_uint4 a)
{
  return ((vec_uint4)(si_gb((qword)(a))));
}

static __inline vec_uint4 spu_gather(vec_int4 a)
{
  return ((vec_uint4)(si_gb((qword)(a))));
}

static __inline vec_uint4 spu_gather(vec_float4 a)
{
  return ((vec_uint4)(si_gb((qword)(a))));
}

/* spu_genb
 * ========
 */
static __inline vec_uint4 spu_genb(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_bg((qword)(b), (qword)(a))));
}

static __inline vec_int4 spu_genb(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_bg((qword)(b), (qword)(a))));
}

/* spu_genbx
 * =========
 */
static __inline vec_uint4 spu_genbx(vec_uint4 a, vec_uint4 b, vec_uint4 c)
{
  return ((vec_uint4)(si_bgx((qword)(b), (qword)(a), (qword)(c))));
}

static __inline vec_int4 spu_genbx(vec_int4 a, vec_int4 b, vec_int4 c)
{
  return ((vec_int4)(si_bgx((qword)(b), (qword)(a), (qword)(c))));
}


/* spu_genc
 * ========
 */
static __inline vec_uint4 spu_genc(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_cg((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_genc(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_cg((qword)(a), (qword)(b))));
}

/* spu_gencx
 * =========
 */
static __inline vec_uint4 spu_gencx(vec_uint4 a, vec_uint4 b, vec_uint4 c)
{
  return ((vec_uint4)(si_cgx((qword)(a), (qword)(b), (qword)(c))));
}

static __inline vec_int4 spu_gencx(vec_int4 a, vec_int4 b, vec_int4 c)
{
  return ((vec_int4)(si_cgx((qword)(a), (qword)(b), (qword)(c))));
}


/* spu_hcmpeq
 * ========
 */
#define spu_hcmpeq(_a, _b)	if (_a == _b) { SPU_HALT_ACTION; };


/* spu_hcmpgt
 * ========
 */
#define spu_hcmpgt(_a, _b)	if (_a > _b) { SPU_HALT_ACTION; };


/* spu_idisable
 * ============
 */
#define spu_idisable()		SPU_UNSUPPORTED_ACTION


/* spu_ienable
 * ===========
 */
#define spu_ienable()		SPU_UNSUPPORTED_ACTION


/* spu_insert
 * ========
 */
static __inline vec_uchar16 spu_insert(unsigned char a, vec_uchar16 b, int element)
{
  union {
    vec_uchar16 v;
    unsigned char c[16];
  } in;

  in.v = b;
  in.c[element & 15] = a;
  return (in.v);
}

static __inline vec_char16 spu_insert(signed char a, vec_char16 b, int element)
{
  return ((vec_char16)spu_insert((unsigned char)(a), (vec_uchar16)(b), element));
}

static __inline vec_ushort8 spu_insert(unsigned short a, vec_ushort8 b, int element)
{
  union {
    vec_ushort8 v;
    unsigned short s[8];
  } in;

  in.v = b;
  in.s[element & 7] = a;
  return (in.v);
}

static __inline vec_short8 spu_insert(signed short a, vec_short8 b, int element)
{
  return ((vec_short8)spu_insert((unsigned short)(a), (vec_ushort8)(b), element));
}

static __inline vec_uint4 spu_insert(unsigned int a, vec_uint4 b, int element)
{
  union {
    vec_uint4 v;
    unsigned int i[4];
  } in;

  in.v = b;
  in.i[element & 3] = a;
  return (in.v);
}

static __inline vec_int4 spu_insert(signed int a, vec_int4 b, int element)
{
  return ((vec_int4)spu_insert((unsigned int)(a), (vec_uint4)(b), element));
}

static __inline vec_float4 spu_insert(float a, vec_float4 b, int element)
{
  union {
    vec_float4 v;
    float f[4];
  } in;

  in.v = b;
  in.f[element & 3] = a;
  return (in.v);
}

static __inline vec_ullong2 spu_insert(unsigned long long a, vec_ullong2 b, int element)
{
  union {
    vec_ullong2 v;
    unsigned long long l[2];
  } in;

  in.v = b;
  in.l[element & 1] = a;
  return (in.v);
}

static __inline vec_llong2 spu_insert(signed long long a, vec_llong2 b, int element)
{
  return ((vec_llong2)spu_insert((unsigned long long)(a), (vec_ullong2)(b), element));
}

static __inline vec_double2 spu_insert(double a, vec_double2 b, int element)
{
  union {
    vec_double2 v;
    double d[2];
  } in;

  in.v = b;
  in.d[element & 1] = a;
  return (in.v);
}


/* spu_madd
 * ========
 */
static __inline vec_int4 spu_madd(vec_short8 a, vec_short8 b, vec_int4 c)
{
  return ((vec_int4)(si_mpya((qword)(a), (qword)(b), (qword)(c))));
}

static __inline vec_float4 spu_madd(vec_float4 a, vec_float4 b, vec_float4 c)
{
  return ((vec_float4)(si_fma((qword)(a), (qword)(b), (qword)(c))));
}

static __inline vec_double2 spu_madd(vec_double2 a, vec_double2 b, vec_double2 c)
{
  return ((vec_double2)(si_dfma((qword)(a), (qword)(b), (qword)(c))));
}


/* spu_maskb
 * ========
 */
#define spu_maskb(_a)	(vec_uchar16)(si_fsmb(si_from_int((int)(_a))))

/* spu_maskh
 * ========
 */
#define spu_maskh(_a)	(vec_ushort8)(si_fsmh(si_from_int((int)(_a))))


/* spu_maskw
 * ========
 */
#define spu_maskw(_a)	(vec_uint4)(si_fsm(si_from_int((int)(_a))))


/* spu_mfcdma32
 * ========
 */
#define spu_mfcdma32(_ls, _ea, _size, _tagid, _cmd)


/* spu_mfcdma64
 * ========
 */
#define spu_mfcdma64(_ls, _eahi, _ealow,  _size, _tagid, _cmd)

/* spu_mfcstat
 * ========
 */
#define spu_mfcstat(_type)	0xFFFFFFFF



/* spu_mffpscr
 * ===========
 */
#define spu_mffpscr()		(vec_uint4)(si_fscrrd())


/* spu_mfspr
 * ========
 */

#define spu_mfspr(_reg)		si_to_uint(si_mfspr(_reg))



/* spu_mhhadd
 * ==========
 */
static __inline vec_int4 spu_mhhadd(vec_short8 a, vec_short8 b, vec_int4 c)
{
  return ((vec_int4)(si_mpyhha((qword)(a), (qword)(b), (qword)(c))));
}


static __inline vec_uint4 spu_mhhadd(vec_ushort8 a, vec_ushort8 b, vec_uint4 c)
{
  return ((vec_uint4)(si_mpyhhau((qword)(a), (qword)(b), (qword)(c))));
}


/* spu_msub
 * ========
 */
static __inline vec_float4 spu_msub(vec_float4 a, vec_float4 b, vec_float4 c)
{
  return ((vec_float4)(si_fms((qword)(a), (qword)(b), (qword)(c))));
}

static __inline vec_double2 spu_msub(vec_double2 a, vec_double2 b, vec_double2 c)
{
  return ((vec_double2)(si_dfms((qword)(a), (qword)(b), (qword)(c))));
}


/* spu_mtfpscr
 * ===========
 */
#define spu_mtfpscr(_a)


/* spu_mtspr
 * ========
 */
#define spu_mtspr(_reg, _a)


/* spu_mul
 * ========
 */
static __inline vec_float4 spu_mul(vec_float4 a, vec_float4 b)
{
  return ((vec_float4)(si_fm((qword)(a), (qword)(b))));
}

static __inline vec_double2 spu_mul(vec_double2 a, vec_double2 b)
{
  return ((vec_double2)(si_dfm((qword)(a), (qword)(b))));
}


/* spu_mulh
 * ========
 */
static __inline vec_int4 spu_mulh(vec_short8 a, vec_short8 b)
{
  return ((vec_int4)(si_mpyh((qword)(a), (qword)(b))));
}

/* spu_mule
 * =========
 */
#define spu_mule(_a, _b)	vec_mule(_a, _b)



/* spu_mulo
 * ========
 */
static __inline vec_int4 spu_mulo(vec_short8 a, vec_short8 b)
{
  return ((vec_int4)(si_mpy((qword)(a), (qword)(b))));
}


static __inline vec_uint4 spu_mulo(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_uint4)(si_mpyu((qword)(a), (qword)(b))));
}


static __inline vec_int4 spu_mulo(vec_short8 a, short b)
{
  return ((vec_int4)(si_mpyi((qword)(a), b)));
}

static __inline vec_uint4 spu_mulo(vec_ushort8 a, unsigned short b)
{
  return ((vec_uint4)(si_mpyui((qword)(a), b)));
}


/* spu_mulsr
 * =========
 */
static __inline vec_int4 spu_mulsr(vec_short8 a, vec_short8 b)
{
  return ((vec_int4)(si_mpys((qword)(a), (qword)(b))));
}


/* spu_nand
 * ========
 */
static __inline vec_uchar16 spu_nand(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_uchar16)(si_nand((qword)(a), (qword)(b))));
}

static __inline vec_char16 spu_nand(vec_char16 a, vec_char16 b)
{
  return ((vec_char16)(si_nand((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_nand(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_nand((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_nand(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_nand((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_nand(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_nand((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_nand(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_nand((qword)(a), (qword)(b))));
}

static __inline vec_float4 spu_nand(vec_float4 a, vec_float4 b)
{
  return ((vec_float4)(si_nand((qword)(a), (qword)(b))));
}

static __inline vec_ullong2 spu_nand(vec_ullong2 a, vec_ullong2 b)
{
  return ((vec_ullong2)(si_nand((qword)(a), (qword)(b)))); 
}

static __inline vec_llong2 spu_nand(vec_llong2 a, vec_llong2 b)
{
  return ((vec_llong2)(si_nand((qword)(a), (qword)(b)))); 
}

static __inline vec_double2 spu_nand(vec_double2 a, vec_double2 b)
{
  return ((vec_double2)(si_nand((qword)(a), (qword)(b))));
}


/* spu_nmadd
 * =========
 */
static __inline vec_double2 spu_nmadd(vec_double2 a, vec_double2 b, vec_double2 c)
{
  return ((vec_double2)(si_dfnma((qword)(a), (qword)(b), (qword)(c))));
}


/* spu_nmsub
 * =========
 */
static __inline vec_float4 spu_nmsub(vec_float4 a, vec_float4 b, vec_float4 c)
{
  return ((vec_float4)(si_fnms((qword)(a), (qword)(b), (qword)(c))));
}

static __inline vec_double2 spu_nmsub(vec_double2 a, vec_double2 b, vec_double2 c)
{
  return ((vec_double2)(si_dfnms((qword)(a), (qword)(b), (qword)(c))));
}


/* spu_nor
 * =======
 */
#define spu_nor(_a, _b)		vec_nor(_a, _b)


/* spu_or
 * ======
 */
static __inline vec_uchar16 spu_or(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_uchar16)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_char16 spu_or(vec_char16 a, vec_char16 b)
{
  return ((vec_char16)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_or(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_or(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_or(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_or(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_float4 spu_or(vec_float4 a, vec_float4 b)
{
  return ((vec_float4)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_ullong2 spu_or(vec_ullong2 a, vec_ullong2 b)
{
  return ((vec_ullong2)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_llong2 spu_or(vec_llong2 a, vec_llong2 b)
{
  return ((vec_llong2)(si_or((qword)(a), (qword)(b))));
}

static __inline vec_double2 spu_or(vec_double2 a, vec_double2 b)
{
  return ((vec_double2)(si_or((qword)(a), (qword)(b))));
}


static __inline vec_uchar16 spu_or(vec_uchar16 a, unsigned char b)
{
  return ((vec_uchar16)(si_orbi((qword)(a), b)));
}

static __inline vec_char16 spu_or(vec_char16 a, signed char b)
{
  return ((vec_char16)(si_orbi((qword)(a), (unsigned char)(b))));
}

static __inline vec_ushort8 spu_or(vec_ushort8 a, unsigned short b)
{
  return ((vec_ushort8)(si_orhi((qword)(a), b)));
}

static __inline vec_short8 spu_or(vec_short8 a, signed short b)
{
  return ((vec_short8)(si_orhi((qword)(a), (unsigned short)(b))));
}

static __inline vec_uint4 spu_or(vec_uint4 a, unsigned int b)
{
  return ((vec_uint4)(si_ori((qword)(a), b)));
}

static __inline vec_int4 spu_or(vec_int4 a, signed int b)
{
  return ((vec_int4)(si_ori((qword)(a), (unsigned int)(b))));
}


/* spu_orc
 * =======
 */
#define spu_orc(_a, _b)		vec_or(_a, vec_nor(_b, _b))


/* spu_orx
 * =======
 */
static __inline vec_uint4 spu_orx(vec_uint4 a)
{
  return ((vec_uint4)(si_orx((qword)(a))));
}

static __inline vec_int4 spu_orx(vec_int4 a)
{
  return ((vec_int4)(si_orx((qword)(a))));
}


/* spu_promote
 * ===========
 */
static __inline vec_uchar16 spu_promote(unsigned char a, int element)
{
  union {
    vec_uchar16 v;
    unsigned char c[16];
  } in;

  in.c[element & 15] = a;
  return (in.v);
}

static __inline vec_char16 spu_promote(signed char a, int element)
{
  union {
    vec_char16 v;
    signed char c[16];
  } in;

  in.c[element & 15] = a;
  return (in.v);
}

static __inline vec_ushort8 spu_promote(unsigned short a, int element)
{
  union {
    vec_ushort8 v;
    unsigned short s[8];
  } in;

  in.s[element & 7] = a;
  return (in.v);
}

static __inline vec_short8 spu_promote(signed short a, int element)
{
  union {
    vec_short8 v;
    signed short s[8];
  } in;

  in.s[element & 7] = a;
  return (in.v);
}

static __inline vec_uint4 spu_promote(unsigned int a, int element)
{
  union {
    vec_uint4 v;
    unsigned int i[4];
  } in;

  in.i[element & 3] = a;
  return (in.v);
}

static __inline vec_int4 spu_promote(signed int a, int element)
{
  union {
    vec_int4 v;
    signed int i[4];
  } in;

  in.i[element & 3] = a;
  return (in.v);
}

static __inline vec_float4 spu_promote(float a, int element)
{
  union {
    vec_float4 v;
    float f[4];
  } in;

  in.f[element & 3] = a;
  return (in.v);
}

static __inline vec_ullong2 spu_promote(unsigned long long a, int element)
{
  union {
    vec_ullong2 v;
    unsigned long long l[2];
  } in;

  in.l[element & 1] = a;
  return (in.v);
}

static __inline vec_llong2 spu_promote(signed long long a, int element)
{
  union {
    vec_llong2 v;
    signed long long l[2];
  } in;

  in.l[element & 1] = a;
  return (in.v);
}

static __inline vec_double2 spu_promote(double a, int element)
{
  union {
    vec_double2 v;
    double d[2];
  } in;

  in.d[element & 1] = a;
  return (in.v);
}

/* spu_re
 * ======
 */
#define spu_re(_a)		vec_re(_a)


/* spu_readch
 * ==========
 */
#define spu_readch(_channel)		0	/* not mappable */


/* spu_readchcnt
 * =============
 */
#define spu_readchcnt(_channel)		0	/* not mappable */


/* spu_readchqw
 * ============
 */
#define spu_readchqw(_channel) __extension__ ({ vec_uint4 result = { 0, 0, 0, 0 }; result; })

/* spu_rl
 * ======
 */
static __inline vec_ushort8 spu_rl(vec_ushort8 a, vec_short8 b)
{
  return ((vec_ushort8)(si_roth((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_rl(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_roth((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_rl(vec_uint4 a, vec_int4 b)
{
  return ((vec_uint4)(si_rot((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_rl(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_rot((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_rl(vec_ushort8 a, int b)
{
  return ((vec_ushort8)(si_rothi((qword)(a), b)));
}

static __inline vec_short8 spu_rl(vec_short8 a, int b)
{
  return ((vec_short8)(si_rothi((qword)(a), b)));
}

static __inline vec_uint4 spu_rl(vec_uint4 a, int b)
{
  return ((vec_uint4)(si_roti((qword)(a), b)));
}

static __inline vec_int4 spu_rl(vec_int4 a, int b)
{
  return ((vec_int4)(si_roti((qword)(a), b)));
}


/* spu_rlmask
 * ==========
 */
static __inline vec_ushort8 spu_rlmask(vec_ushort8 a, vec_short8 b)
{
  return ((vec_ushort8)(si_rothm((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_rlmask(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_rothm((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_rlmask(vec_uint4 a, vec_int4 b)
{
  return ((vec_uint4)(si_rotm((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_rlmask(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_rotm((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_rlmask(vec_ushort8 a, int b)
{
  return ((vec_ushort8)(si_rothmi((qword)(a), b)));
}

static __inline vec_short8 spu_rlmask(vec_short8 a, int b)
{
  return ((vec_short8)(si_rothmi((qword)(a), b)));
}


static __inline vec_uint4 spu_rlmask(vec_uint4 a, int b)
{
  return ((vec_uint4)(si_rotmi((qword)(a), b)));
}

static __inline vec_int4 spu_rlmask(vec_int4 a, int b)
{
  return ((vec_int4)(si_rotmi((qword)(a), b)));
}

/* spu_rlmaska
 * ===========
 */
static __inline vec_short8 spu_rlmaska(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_rotmah((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_rlmaska(vec_ushort8 a, vec_short8 b)
{
  return ((vec_ushort8)(si_rotmah((qword)(a), (qword)(b))));
}


static __inline vec_int4 spu_rlmaska(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_rotma((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_rlmaska(vec_uint4 a, vec_int4 b)
{
  return ((vec_uint4)(si_rotma((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_rlmaska(vec_ushort8 a, int b)
{
  return ((vec_ushort8)(si_rotmahi((qword)(a), b)));
}

static __inline vec_short8 spu_rlmaska(vec_short8 a, int b)
{
  return ((vec_short8)(si_rotmahi((qword)(a), b)));
}

static __inline vec_uint4 spu_rlmaska(vec_uint4 a, int b)
{
  return ((vec_uint4)(si_rotmai((qword)(a), b)));
}

static __inline vec_int4 spu_rlmaska(vec_int4 a, int b)
{
  return ((vec_int4)(si_rotmai((qword)(a), b)));
}


/* spu_rlmaskqw
 * ============
 */
static __inline vec_uchar16 spu_rlmaskqw(vec_uchar16 a, int count)
{
  return ((vec_uchar16)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_char16 spu_rlmaskqw(vec_char16 a, int count)
{
  return ((vec_char16)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_ushort8 spu_rlmaskqw(vec_ushort8 a, int count)
{
  return ((vec_ushort8)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_short8 spu_rlmaskqw(vec_short8 a, int count)
{
  return ((vec_short8)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_uint4 spu_rlmaskqw(vec_uint4 a, int count)
{
  return ((vec_uint4)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_int4 spu_rlmaskqw(vec_int4 a, int count)
{
  return ((vec_int4)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_float4 spu_rlmaskqw(vec_float4 a, int count)
{
  return ((vec_float4)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_ullong2 spu_rlmaskqw(vec_ullong2 a, int count)
{
  return ((vec_ullong2)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_llong2 spu_rlmaskqw(vec_llong2 a, int count)
{
  return ((vec_llong2)(si_rotqmbi((qword)(a), si_from_int(count))));
}

static __inline vec_double2 spu_rlmaskqw(vec_double2 a, int count)
{
  return ((vec_double2)(si_rotqmbi((qword)(a), si_from_int(count))));
}

/* spu_rlmaskqwbyte
 * ================
 */
static __inline vec_uchar16 spu_rlmaskqwbyte(vec_uchar16 a, int count)
{
  return ((vec_uchar16)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_char16 spu_rlmaskqwbyte(vec_char16 a, int count)
{
  return ((vec_char16)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_ushort8 spu_rlmaskqwbyte(vec_ushort8 a, int count)
{
  return ((vec_ushort8)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_short8 spu_rlmaskqwbyte(vec_short8 a, int count)
{
  return ((vec_short8)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_uint4 spu_rlmaskqwbyte(vec_uint4 a, int count)
{
  return ((vec_uint4)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_int4 spu_rlmaskqwbyte(vec_int4 a, int count)
{
  return ((vec_int4)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_float4 spu_rlmaskqwbyte(vec_float4 a, int count)
{
  return ((vec_float4)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_ullong2 spu_rlmaskqwbyte(vec_ullong2 a, int count)
{
  return ((vec_ullong2)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_llong2 spu_rlmaskqwbyte(vec_llong2 a, int count)
{
  return ((vec_llong2)(si_rotqmby((qword)(a), si_from_int(count))));
}

static __inline vec_double2 spu_rlmaskqwbyte(vec_double2 a, int count)
{
  return ((vec_double2)(si_rotqmby((qword)(a), si_from_int(count))));
}

/* spu_rlmaskqwbytebc
 * ==================
 */
static __inline vec_uchar16 spu_rlmaskqwbytebc(vec_uchar16 a, int count)
{
  return ((vec_uchar16)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_char16 spu_rlmaskqwbytebc(vec_char16 a, int count)
{
  return ((vec_char16)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_ushort8 spu_rlmaskqwbytebc(vec_ushort8 a, int count)
{
  return ((vec_ushort8)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_short8 spu_rlmaskqwbytebc(vec_short8 a, int count)
{
  return ((vec_short8)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_uint4 spu_rlmaskqwbytebc(vec_uint4 a, int count)
{
  return ((vec_uint4)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_int4 spu_rlmaskqwbytebc(vec_int4 a, int count)
{
  return ((vec_int4)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_float4 spu_rlmaskqwbytebc(vec_float4 a, int count)
{
  return ((vec_float4)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_ullong2 spu_rlmaskqwbytebc(vec_ullong2 a, int count)
{
  return ((vec_ullong2)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_llong2 spu_rlmaskqwbytebc(vec_llong2 a, int count)
{
  return ((vec_llong2)(si_rotqmbybi((qword)(a), si_from_int(count))));
}

static __inline vec_double2 spu_rlmaskqwbytebc(vec_double2 a, int count)
{
  return ((vec_double2)(si_rotqmbybi((qword)(a), si_from_int(count))));
}


/* spu_rlqwbyte
 * ============
 */
static __inline vec_uchar16 spu_rlqwbyte(vec_uchar16 a, int count)
{
  return ((vec_uchar16)(si_rotqby((qword)(a), si_from_int(count))));
}  

static __inline vec_char16 spu_rlqwbyte(vec_char16 a, int count)
{
  return ((vec_char16)(si_rotqby((qword)(a), si_from_int(count))));
}

static __inline vec_ushort8 spu_rlqwbyte(vec_ushort8 a, int count)
{
  return ((vec_ushort8)(si_rotqby((qword)(a), si_from_int(count))));
}  

static __inline vec_short8 spu_rlqwbyte(vec_short8 a, int count)
{
  return ((vec_short8)(si_rotqby((qword)(a), si_from_int(count))));
}

static __inline vec_uint4 spu_rlqwbyte(vec_uint4 a, int count)
{
  return ((vec_uint4)(si_rotqby((qword)(a), si_from_int(count))));
}

static __inline vec_int4 spu_rlqwbyte(vec_int4 a, int count)
{
  return ((vec_int4)(si_rotqby((qword)(a), si_from_int(count))));
}

static __inline vec_float4 spu_rlqwbyte(vec_float4 a, int count)
{
  return ((vec_float4)(si_rotqby((qword)(a), si_from_int(count))));
}

static __inline vec_ullong2 spu_rlqwbyte(vec_ullong2 a, int count)
{
  return ((vec_ullong2)(si_rotqby((qword)(a), si_from_int(count))));
}

static __inline vec_llong2 spu_rlqwbyte(vec_llong2 a, int count)
{
  return ((vec_llong2)(si_rotqby((qword)(a), si_from_int(count))));
}

static __inline vec_double2 spu_rlqwbyte(vec_double2 a, int count)
{
  return ((vec_double2)(si_rotqby((qword)(a), si_from_int(count))));
}


/* spu_rlqwbytebc
 * ==============
 */
static __inline vec_uchar16 spu_rlqwbytebc(vec_uchar16 a, int count)
{
  return ((vec_uchar16)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_char16 spu_rlqwbytebc(vec_char16 a, int count)
{
  return ((vec_char16)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_ushort8 spu_rlqwbytebc(vec_ushort8 a, int count)
{
  return ((vec_ushort8)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_short8 spu_rlqwbytebc(vec_short8 a, int count)
{
  return ((vec_short8)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_uint4 spu_rlqwbytebc(vec_uint4 a, int count)
{
  return ((vec_uint4)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_int4 spu_rlqwbytebc(vec_int4 a, int count)
{
  return ((vec_int4)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_float4 spu_rlqwbytebc(vec_float4 a, int count)
{
  return ((vec_float4)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_ullong2 spu_rlqwbytebc(vec_ullong2 a, int count)
{
  return ((vec_ullong2)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_llong2 spu_rlqwbytebc(vec_llong2 a, int count)
{
  return ((vec_llong2)(si_rotqbybi((qword)(a), si_from_int(count))));
}

static __inline vec_double2 spu_rlqwbytebc(vec_double2 a, int count)
{
  return ((vec_double2)(si_rotqbybi((qword)(a), si_from_int(count))));
}

/* spu_rlqw
 * ========
 */
static __inline vec_uchar16 spu_rlqw(vec_uchar16 a, int count)
{
  return ((vec_uchar16)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_char16 spu_rlqw(vec_char16 a, int count)
{
  return ((vec_char16)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_ushort8 spu_rlqw(vec_ushort8 a, int count)
{
  return ((vec_ushort8)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_short8 spu_rlqw(vec_short8 a, int count)
{
  return ((vec_short8)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_uint4 spu_rlqw(vec_uint4 a, int count)
{
  return ((vec_uint4)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_int4 spu_rlqw(vec_int4 a, int count)
{
  return ((vec_int4)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_float4 spu_rlqw(vec_float4 a, int count)
{
  return ((vec_float4)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_ullong2 spu_rlqw(vec_ullong2 a, int count)
{
  return ((vec_ullong2)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_llong2 spu_rlqw(vec_llong2 a, int count)
{
  return ((vec_llong2)(si_rotqbi((qword)(a), si_from_int(count))));
}

static __inline vec_double2 spu_rlqw(vec_double2 a, int count)
{
  return ((vec_double2)(si_rotqbi((qword)(a), si_from_int(count))));
}

/* spu_roundtf
 * ===========
 */
static __inline vec_float4 spu_roundtf(vec_double2 a)
{
  return ((vec_float4)(si_frds((qword)(a))));
}


/* spu_rsqrte
 * ==========
 */
#define spu_rsqrte(_a)		vec_rsqrte(_a)


/* spu_sel
 * =======
 */
static __inline vec_uchar16 spu_sel(vec_uchar16 a, vec_uchar16 b, vec_uchar16 pattern)
{
  return ((vec_uchar16)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_char16 spu_sel(vec_char16 a, vec_char16 b, vec_uchar16 pattern)
{
  return ((vec_char16)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_ushort8 spu_sel(vec_ushort8 a, vec_ushort8 b, vec_ushort8 pattern)
{
  return ((vec_ushort8)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_short8 spu_sel(vec_short8 a, vec_short8 b, vec_ushort8 pattern)
{
  return ((vec_short8)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_uint4 spu_sel(vec_uint4 a, vec_uint4 b, vec_uint4 pattern)
{
  return ((vec_uint4)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_int4 spu_sel(vec_int4 a, vec_int4 b, vec_uint4 pattern)
{
  return ((vec_int4)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_float4 spu_sel(vec_float4 a, vec_float4 b, vec_uint4 pattern)
{
  return ((vec_float4)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_ullong2 spu_sel(vec_ullong2 a, vec_ullong2 b, vec_ullong2 pattern)
{
  return ((vec_ullong2)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_llong2 spu_sel(vec_llong2 a, vec_llong2 b, vec_ullong2 pattern)
{
  return ((vec_llong2)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_double2 spu_sel(vec_double2 a, vec_double2 b, vec_ullong2 pattern)
{
  return ((vec_double2)(si_selb((qword)(a), (qword)(b), (qword)(pattern))));
}



/* spu_shuffle
 * ===========
 */
static __inline vec_uchar16 spu_shuffle(vec_uchar16 a, vec_uchar16 b, vec_uchar16 pattern)
{
  return ((vec_uchar16)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_char16 spu_shuffle(vec_char16 a, vec_char16 b, vec_uchar16 pattern)
{
  return ((vec_char16)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_ushort8 spu_shuffle(vec_ushort8 a, vec_ushort8 b, vec_uchar16 pattern)
{
  return ((vec_ushort8)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_short8 spu_shuffle(vec_short8 a, vec_short8 b, vec_uchar16 pattern)
{
  return ((vec_short8)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_uint4 spu_shuffle(vec_uint4 a, vec_uint4 b, vec_uchar16 pattern)
{
  return ((vec_uint4)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_int4 spu_shuffle(vec_int4 a, vec_int4 b, vec_uchar16 pattern)
{
  return ((vec_int4)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_float4 spu_shuffle(vec_float4 a, vec_float4 b, vec_uchar16 pattern)
{
  return ((vec_float4)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_ullong2 spu_shuffle(vec_ullong2 a, vec_ullong2 b, vec_uchar16 pattern)
{
  return ((vec_ullong2)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_llong2 spu_shuffle(vec_llong2 a, vec_llong2 b, vec_uchar16 pattern)
{
  return ((vec_llong2)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}

static __inline vec_double2 spu_shuffle(vec_double2 a, vec_double2 b, vec_uchar16 pattern)
{
  return ((vec_double2)(si_shufb((qword)(a), (qword)(b), (qword)(pattern))));
}


/* spu_sl
 * ======
 */
static __inline vec_ushort8 spu_sl(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_shlh((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_sl(vec_short8 a, vec_ushort8 b)
{
  return ((vec_short8)(si_shlh((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_sl(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_shl((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_sl(vec_int4 a, vec_uint4 b)
{
  return ((vec_int4)(si_shl((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_sl(vec_ushort8 a, unsigned int b)
{
  return ((vec_ushort8)(si_shlhi((qword)(a), b)));
}

static __inline vec_short8 spu_sl(vec_short8 a, unsigned int b)
{
  return ((vec_short8)(si_shlhi((qword)(a), b)));
}

static __inline vec_uint4 spu_sl(vec_uint4 a, unsigned int b)
{
  return ((vec_uint4)(si_shli((qword)(a), b)));
}

static __inline vec_int4 spu_sl(vec_int4 a, unsigned int b)
{
  return ((vec_int4)(si_shli((qword)(a), b)));
}


/* spu_slqw
 * ========
 */
static __inline vec_uchar16 spu_slqw(vec_uchar16 a, unsigned int count)
{
  return ((vec_uchar16)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_char16 spu_slqw(vec_char16 a, unsigned int count)
{
  return ((vec_char16)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_ushort8 spu_slqw(vec_ushort8 a, unsigned int count)
{
  return ((vec_ushort8)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_short8 spu_slqw(vec_short8 a, unsigned int count)
{
  return ((vec_short8)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_uint4 spu_slqw(vec_uint4 a, unsigned int count)
{
  return ((vec_uint4)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_int4 spu_slqw(vec_int4 a, unsigned int count)
{
  return ((vec_int4)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_float4 spu_slqw(vec_float4 a, unsigned int count)
{
  return ((vec_float4)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_ullong2 spu_slqw(vec_ullong2 a, unsigned int count)
{
  return ((vec_ullong2)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_llong2 spu_slqw(vec_llong2 a, unsigned int count)
{
  return ((vec_llong2)(si_shlqbi((qword)(a), si_from_uint(count))));
}

static __inline vec_double2 spu_slqw(vec_double2 a, unsigned int count)
{
  return ((vec_double2)(si_shlqbi((qword)(a), si_from_uint(count))));
}

/* spu_slqwbyte
 * ============
 */
static __inline vec_uchar16 spu_slqwbyte(vec_uchar16 a, unsigned int count)
{
  return ((vec_uchar16)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_char16 spu_slqwbyte(vec_char16 a, unsigned int count)
{
  return ((vec_char16)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_ushort8 spu_slqwbyte(vec_ushort8 a, unsigned int count)
{
  return ((vec_ushort8)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_short8 spu_slqwbyte(vec_short8 a, unsigned int count)
{
  return ((vec_short8)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_uint4 spu_slqwbyte(vec_uint4 a, unsigned int count)
{
  return ((vec_uint4)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_int4 spu_slqwbyte(vec_int4 a, unsigned int count)
{
  return ((vec_int4)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_float4 spu_slqwbyte(vec_float4 a, unsigned int count)
{
  return ((vec_float4)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_ullong2 spu_slqwbyte(vec_ullong2 a, unsigned int count)
{
  return ((vec_ullong2)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_llong2 spu_slqwbyte(vec_llong2 a, unsigned int count)
{
  return ((vec_llong2)(si_shlqby((qword)(a), si_from_uint(count))));
}

static __inline vec_double2 spu_slqwbyte(vec_double2 a, unsigned int count)
{
  return ((vec_double2)(si_shlqby((qword)(a), si_from_uint(count))));
}

/* spu_slqwbytebc
 * ==============
 */
static __inline vec_uchar16 spu_slqwbytebc(vec_uchar16 a, unsigned int count)
{
  return ((vec_uchar16)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_char16 spu_slqwbytebc(vec_char16 a, unsigned int count)
{
  return ((vec_char16)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_ushort8 spu_slqwbytebc(vec_ushort8 a, unsigned int count)
{
  return ((vec_ushort8)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_short8 spu_slqwbytebc(vec_short8 a, unsigned int count)
{
  return ((vec_short8)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_uint4 spu_slqwbytebc(vec_uint4 a, unsigned int count)
{
  return ((vec_uint4)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_int4 spu_slqwbytebc(vec_int4 a, unsigned int count)
{
  return ((vec_int4)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_float4 spu_slqwbytebc(vec_float4 a, unsigned int count)
{
  return ((vec_float4)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_ullong2 spu_slqwbytebc(vec_ullong2 a, unsigned int count)
{
  return ((vec_ullong2)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_llong2 spu_slqwbytebc(vec_llong2 a, unsigned int count)
{
  return ((vec_llong2)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

static __inline vec_double2 spu_slqwbytebc(vec_double2 a, unsigned int count)
{
  return ((vec_double2)(si_shlqbybi((qword)(a), si_from_uint(count))));
}

/* spu_splats
 * ==========
 */
static __inline vec_uchar16 spu_splats(unsigned char a)
{
  union {
    vec_uchar16 v;
    unsigned char c[16];
  } in;

  in.c[0] = a;
  return (vec_splat(in.v, 0));
}

static __inline vec_char16 spu_splats(signed char a)
{
  return ((vec_char16)spu_splats((unsigned char)(a)));
}

static __inline vec_ushort8 spu_splats(unsigned short a)
{
  union {
    vec_ushort8 v;
    unsigned short s[8];
  } in;

  in.s[0] = a;
  return (vec_splat(in.v, 0));
}

static __inline vec_short8 spu_splats(signed short a)
{
  return ((vec_short8)spu_splats((unsigned short)(a)));
}

static __inline vec_uint4 spu_splats(unsigned int a)
{
  union {
    vec_uint4 v;
    unsigned int i[4];
  } in;

  in.i[0] = a;
  return (vec_splat(in.v, 0));
}

static __inline vec_int4 spu_splats(signed int a)
{
  return ((vec_int4)spu_splats((unsigned int)(a)));
}

static __inline vec_float4 spu_splats(float a)
{
  union {
    vec_float4 v;
    float f[4];
  } in;

  in.f[0] = a;
  return (vec_splat(in.v, 0));
}

static __inline vec_ullong2 spu_splats(unsigned long long a)
{
  union {
    vec_ullong2 v;
    unsigned long long l[2];
  } in;

  in.l[0] = a;
  in.l[1] = a;
  return (in.v);
}

static __inline vec_llong2 spu_splats(signed long long a)
{
  return ((vec_llong2)spu_splats((unsigned long long)(a)));
}

static __inline vec_double2 spu_splats(double a)
{
  union {
    vec_double2 v;
    double d[2];
  } in;

  in.d[0] = a;
  in.d[1] = a;
  return (in.v);
}


/* spu_stop
 * ========
 */
#define spu_stop(_type)	si_stop(_type)


/* spu_sub
 * =======
 */
static __inline vec_ushort8 spu_sub(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_sfh((qword)(b), (qword)(a))));
}

static __inline vec_short8 spu_sub(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_sfh((qword)(b), (qword)(a))));
}

static __inline vec_uint4 spu_sub(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_sf((qword)(b), (qword)(a))));
}

static __inline vec_int4 spu_sub(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_sf((qword)(b), (qword)(a))));
}

static __inline vec_float4 spu_sub(vec_float4 a, vec_float4 b)
{
  return ((vec_float4)(si_fs((qword)(a), (qword)(b))));
}

static __inline vec_double2 spu_sub(vec_double2 a, vec_double2 b)
{
  return ((vec_double2)(si_dfs((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_sub(unsigned int a, vec_uint4 b)
{
  return ((vec_uint4)(si_sfi((qword)b, (int)a)));
}

static __inline vec_int4 spu_sub(signed int a, vec_int4 b)
{
  return ((vec_int4)(si_sfi((qword)b, (int)a)));
}

static __inline vec_ushort8 spu_sub(unsigned short a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_sfhi((qword)b, (short)a)));
}

static __inline vec_short8 spu_sub(signed short a, vec_short8 b)
{
  return ((vec_short8)(si_sfhi((qword)b, (short)a)));
}

/* spu_subx
 * ========
 */
static __inline vec_uint4 spu_subx(vec_uint4 a, vec_uint4 b, vec_uint4 c)
{
  return ((vec_uint4)(si_sfx((qword)(b), (qword)(a), (qword)(c))));
}

static __inline vec_int4 spu_subx(vec_int4 a, vec_int4 b, vec_int4 c)
{
  return ((vec_int4)(si_sfx((qword)(b), (qword)(a), (qword)(c))));
}

/* spu_sumb
 * ========
 */
static __inline vec_ushort8 spu_sumb(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_ushort8)(si_sumb((qword)(a), (qword)(b))));
}  


/* spu_sync
 * spu_sync_c
 * ========
 */
#define spu_sync()	/* do nothing */

#define spu_sync_c()	/* do nothing */


/* spu_writech
 * ===========
 */
#define spu_writech(_channel, _a)	/* not mappable */

/* spu_writechqw
 * =============
 */
#define spu_writechqw(_channel, _a)	/* not mappable */


/* spu_xor
 * =======
 */
static __inline vec_uchar16 spu_xor(vec_uchar16 a, vec_uchar16 b)
{
  return ((vec_uchar16)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_char16 spu_xor(vec_char16 a, vec_char16 b)
{
  return ((vec_char16)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_ushort8 spu_xor(vec_ushort8 a, vec_ushort8 b)
{
  return ((vec_ushort8)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_short8 spu_xor(vec_short8 a, vec_short8 b)
{
  return ((vec_short8)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_uint4 spu_xor(vec_uint4 a, vec_uint4 b)
{
  return ((vec_uint4)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_int4 spu_xor(vec_int4 a, vec_int4 b)
{
  return ((vec_int4)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_float4 spu_xor(vec_float4 a, vec_float4 b)
{
  return ((vec_float4)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_ullong2 spu_xor(vec_ullong2 a, vec_ullong2 b)
{
  return ((vec_ullong2)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_llong2 spu_xor(vec_llong2 a, vec_llong2 b)
{
  return ((vec_llong2)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_double2 spu_xor(vec_double2 a, vec_double2 b)
{
  return ((vec_double2)(si_xor((qword)(a), (qword)(b))));
}

static __inline vec_uchar16 spu_xor(vec_uchar16 a, unsigned char b)
{
  return ((vec_uchar16)(si_xorbi((qword)(a), b)));
}

static __inline vec_char16 spu_xor(vec_char16 a, signed char b)
{
  return ((vec_char16)(si_xorbi((qword)(a), (unsigned char)(b))));
}

static __inline vec_ushort8 spu_xor(vec_ushort8 a, unsigned short b)
{
  return ((vec_ushort8)(si_xorhi((qword)(a), b)));
}

static __inline vec_short8 spu_xor(vec_short8 a, signed short b)
{
  return ((vec_short8)(si_xorhi((qword)(a), (unsigned short)(b))));
}

static __inline vec_uint4 spu_xor(vec_uint4 a, unsigned int b)
{
  return ((vec_uint4)(si_xori((qword)(a), b)));
}

static __inline vec_int4 spu_xor(vec_int4 a, signed int b)
{
  return ((vec_int4)(si_xori((qword)(a), (unsigned int)(b))));
}

#endif /* !__SPU__ */
#endif /* __cplusplus */
#endif /* !_SPU2VMX_H_ */
