altivec.h revision 90075
190075Sobrien/* PowerPC AltiVec include file.
290075Sobrien   Copyright (C) 2002 Free Software Foundation, Inc.
390075Sobrien   Contributed by Aldy Hernandez (aldyh@redhat.com).
490075Sobrien
590075SobrienThis file is part of GNU CC.
690075Sobrien
790075SobrienGNU CC is free software; you can redistribute it and/or modify
890075Sobrienit under the terms of the GNU General Public License as published by
990075Sobrienthe Free Software Foundation; either version 2, or (at your option)
1090075Sobrienany later version.
1190075Sobrien
1290075SobrienGNU CC is distributed in the hope that it will be useful,
1390075Sobrienbut WITHOUT ANY WARRANTY; without even the implied warranty of
1490075SobrienMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1590075SobrienGNU General Public License for more details.
1690075Sobrien
1790075SobrienYou should have received a copy of the GNU General Public License
1890075Sobrienalong with GNU CC; see the file COPYING.  If not, write to
1990075Sobrienthe Free Software Foundation, 59 Temple Place - Suite 330,
2090075SobrienBoston, MA 02111-1307, USA.  */
2190075Sobrien
2290075Sobrien/* As a special exception, if you include this header file into source
2390075Sobrien   files compiled by GCC, this header file does not by itself cause
2490075Sobrien   the resulting executable to be covered by the GNU General Public
2590075Sobrien   License.  This exception does not however invalidate any other
2690075Sobrien   reasons why the executable file might be covered by the GNU General
2790075Sobrien   Public License.  */
2890075Sobrien
2990075Sobrien/* Implemented to conform to the specification included in the AltiVec
3090075Sobrien   Technology Programming Interface Manual (ALTIVECPIM/D 6/1999 Rev 0).  */
3190075Sobrien
3290075Sobrien#ifndef _ALTIVEC_H
3390075Sobrien#define _ALTIVEC_H 1
3490075Sobrien
3590075Sobrien/* Required by Motorola specs.  */
3690075Sobrien#define __VEC__ 10206
3790075Sobrien
3890075Sobrien#define __ALTIVEC__ 1
3990075Sobrien
4090075Sobrien#define __vector __attribute__((vector_size(16)))
4190075Sobrien
4290075Sobrien/* Dummy prototype.  */
4390075Sobrienextern void __altivec_link_error_invalid_argument ();
4490075Sobrien
4590075Sobrien/* You are allowed to undef this for C++ compatability.  */
4690075Sobrien#define vector __vector
4790075Sobrien
4890075Sobrien/* Helper macros.  */
4990075Sobrien
5090075Sobrien#define __bin_args_eq(xtype, x, ytype, y)				\
5190075Sobrien	(__builtin_types_compatible_p (xtype, typeof (x))		\
5290075Sobrien	 && __builtin_types_compatible_p (ytype, typeof (y)))
5390075Sobrien
5490075Sobrien#define __un_args_eq(xtype, x)						\
5590075Sobrien	__builtin_types_compatible_p (xtype, typeof (x))
5690075Sobrien
5790075Sobrien#define __tern_args_eq(xtype, x, ytype, y, ztype, z)                    \
5890075Sobrien        (__builtin_types_compatible_p (xtype, typeof (x))               \
5990075Sobrien         && __builtin_types_compatible_p (ytype, typeof (y))		\
6090075Sobrien	 && __builtin_types_compatible_p (ztype, typeof (z)))
6190075Sobrien
6290075Sobrien#define __ch(x, y, z)	__builtin_choose_expr (x, y, z)
6390075Sobrien
6490075Sobrien#ifdef __cplusplus
6590075Sobrien
6690075Sobrien/* C++ stuff here.  */
6790075Sobrien
6890075Sobrien#else /* not C++ */
6990075Sobrien
7090075Sobrien/* Hairy macros that implement the AltiVec high-level programming
7190075Sobrien   interface for C.  */
7290075Sobrien
7390075Sobrien#define vec_add(a1, a2) \
7490075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
7590075Sobrien      (vector signed char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2), \
7690075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
7790075Sobrien      (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2), \
7890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
7990075Sobrien      (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2), \
8090075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
8190075Sobrien      (vector unsigned char) __builtin_altivec_vaddubm ((vector signed char) a1, (vector signed char) a2), \
8290075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
8390075Sobrien      (vector signed short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2), \
8490075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
8590075Sobrien      (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2), \
8690075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
8790075Sobrien      (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2), \
8890075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
8990075Sobrien      (vector unsigned short) __builtin_altivec_vadduhm ((vector signed short) a1, (vector signed short) a2), \
9090075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
9190075Sobrien      (vector signed int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2), \
9290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
9390075Sobrien      (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2), \
9490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
9590075Sobrien      (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2), \
9690075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
9790075Sobrien      (vector unsigned int) __builtin_altivec_vadduwm ((vector signed int) a1, (vector signed int) a2), \
9890075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
9990075Sobrien      (vector float) __builtin_altivec_vaddfp ((vector float) a1, (vector float) a2), \
10090075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
10190075Sobrien
10290075Sobrien#define vec_addc(a1, a2) __builtin_altivec_vaddcuw (a1, a2)
10390075Sobrien
10490075Sobrien#define vec_adds(a1, a2) \
10590075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
10690075Sobrien      (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2), \
10790075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
10890075Sobrien      (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2), \
10990075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
11090075Sobrien      (vector unsigned char) __builtin_altivec_vaddubs ((vector signed char) a1, (vector signed char) a2), \
11190075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
11290075Sobrien      (vector signed char) __builtin_altivec_vaddsbs ((vector signed char) a1, (vector signed char) a2), \
11390075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
11490075Sobrien      (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2), \
11590075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
11690075Sobrien      (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2), \
11790075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
11890075Sobrien      (vector unsigned short) __builtin_altivec_vadduhs ((vector signed short) a1, (vector signed short) a2), \
11990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
12090075Sobrien      (vector signed short) __builtin_altivec_vaddshs ((vector signed short) a1, (vector signed short) a2), \
12190075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
12290075Sobrien      (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2), \
12390075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
12490075Sobrien      (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2), \
12590075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
12690075Sobrien      (vector unsigned int) __builtin_altivec_vadduws ((vector signed int) a1, (vector signed int) a2), \
12790075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
12890075Sobrien      (vector signed int) __builtin_altivec_vaddsws ((vector signed int) a1, (vector signed int) a2), \
12990075Sobrien    __altivec_link_error_invalid_argument ()))))))))))))
13090075Sobrien
13190075Sobrien#define vec_and(a1, a2) \
13290075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
13390075Sobrien      (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
13490075Sobrien__ch (__bin_args_eq (vector float, a1, vector signed int, a2), \
13590075Sobrien      (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
13690075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector float, a2), \
13790075Sobrien      (vector float) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
13890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
13990075Sobrien      (vector signed int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
14090075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
14190075Sobrien      (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
14290075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
14390075Sobrien      (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
14490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
14590075Sobrien      (vector unsigned int) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
14690075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
14790075Sobrien      (vector signed short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
14890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
14990075Sobrien      (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
15090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
15190075Sobrien      (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
15290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
15390075Sobrien      (vector unsigned short) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
15490075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
15590075Sobrien      (vector signed char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
15690075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
15790075Sobrien      (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
15890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
15990075Sobrien      (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
16090075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
16190075Sobrien      (vector unsigned char) __builtin_altivec_vand ((vector signed int) a1, (vector signed int) a2), \
16290075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))))
16390075Sobrien
16490075Sobrien#define vec_andc(a1, a2) \
16590075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
16690075Sobrien      (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
16790075Sobrien__ch (__bin_args_eq (vector float, a1, vector signed int, a2), \
16890075Sobrien      (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
16990075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector float, a2), \
17090075Sobrien      (vector float) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
17190075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
17290075Sobrien      (vector signed int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
17390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
17490075Sobrien      (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
17590075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
17690075Sobrien      (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
17790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
17890075Sobrien      (vector unsigned int) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
17990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
18090075Sobrien      (vector signed short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
18190075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
18290075Sobrien      (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
18390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
18490075Sobrien      (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
18590075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
18690075Sobrien      (vector unsigned short) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
18790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
18890075Sobrien      (vector signed char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
18990075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
19090075Sobrien      (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
19190075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
19290075Sobrien      (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
19390075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
19490075Sobrien      (vector unsigned char) __builtin_altivec_vandc ((vector signed int) a1, (vector signed int) a2), \
19590075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))))
19690075Sobrien
19790075Sobrien#define vec_avg(a1, a2) \
19890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
19990075Sobrien      (vector unsigned char) __builtin_altivec_vavgub ((vector signed char) a1, (vector signed char) a2), \
20090075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
20190075Sobrien      (vector signed char) __builtin_altivec_vavgsb ((vector signed char) a1, (vector signed char) a2), \
20290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
20390075Sobrien      (vector unsigned short) __builtin_altivec_vavguh ((vector signed short) a1, (vector signed short) a2), \
20490075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
20590075Sobrien      (vector signed short) __builtin_altivec_vavgsh ((vector signed short) a1, (vector signed short) a2), \
20690075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
20790075Sobrien      (vector unsigned int) __builtin_altivec_vavguw ((vector signed int) a1, (vector signed int) a2), \
20890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
20990075Sobrien      (vector signed int) __builtin_altivec_vavgsw ((vector signed int) a1, (vector signed int) a2), \
21090075Sobrien    __altivec_link_error_invalid_argument ()))))))
21190075Sobrien
21290075Sobrien#define vec_ceil(a1) __builtin_altivec_vrfip (a1)
21390075Sobrien
21490075Sobrien#define vec_cmpb(a1, a2) __builtin_altivec_vcmpbfp (a1, a2)
21590075Sobrien
21690075Sobrien#define vec_cmpeq(a1, a2) \
21790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
21890075Sobrien      (vector signed char) __builtin_altivec_vcmpequb ((vector signed char) a1, (vector signed char) a2), \
21990075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
22090075Sobrien      (vector signed char) __builtin_altivec_vcmpequb ((vector signed char) a1, (vector signed char) a2), \
22190075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
22290075Sobrien      (vector signed short) __builtin_altivec_vcmpequh ((vector signed short) a1, (vector signed short) a2), \
22390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
22490075Sobrien      (vector signed short) __builtin_altivec_vcmpequh ((vector signed short) a1, (vector signed short) a2), \
22590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
22690075Sobrien      (vector signed int) __builtin_altivec_vcmpequw ((vector signed int) a1, (vector signed int) a2), \
22790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
22890075Sobrien      (vector signed int) __builtin_altivec_vcmpequw ((vector signed int) a1, (vector signed int) a2), \
22990075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
23090075Sobrien      (vector signed int) __builtin_altivec_vcmpeqfp ((vector float) a1, (vector float) a2), \
23190075Sobrien    __altivec_link_error_invalid_argument ())))))))
23290075Sobrien
23390075Sobrien#define vec_cmpge(a1, a2) __builtin_altivec_vcmpgefp (a1, a2)
23490075Sobrien
23590075Sobrien#define vec_cmpgt(a1, a2) \
23690075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
23790075Sobrien      (vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) a1, (vector signed char) a2), \
23890075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
23990075Sobrien      (vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) a1, (vector signed char) a2), \
24090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
24190075Sobrien      (vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) a1, (vector signed short) a2), \
24290075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
24390075Sobrien      (vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) a1, (vector signed short) a2), \
24490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
24590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) a1, (vector signed int) a2), \
24690075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
24790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) a1, (vector signed int) a2), \
24890075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
24990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtfp ((vector float) a1, (vector float) a2), \
25090075Sobrien    __altivec_link_error_invalid_argument ())))))))
25190075Sobrien
25290075Sobrien#define vec_cmple(a1, a2) __builtin_altivec_vcmpgefp (a1, a2)
25390075Sobrien
25490075Sobrien#define vec_cmplt(a1, a2) \
25590075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
25690075Sobrien      (vector signed char) __builtin_altivec_vcmpgtub ((vector signed char) a1, (vector signed char) a2), \
25790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
25890075Sobrien      (vector signed char) __builtin_altivec_vcmpgtsb ((vector signed char) a1, (vector signed char) a2), \
25990075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
26090075Sobrien      (vector signed short) __builtin_altivec_vcmpgtuh ((vector signed short) a1, (vector signed short) a2), \
26190075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
26290075Sobrien      (vector signed short) __builtin_altivec_vcmpgtsh ((vector signed short) a1, (vector signed short) a2), \
26390075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
26490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw ((vector signed int) a1, (vector signed int) a2), \
26590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
26690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw ((vector signed int) a1, (vector signed int) a2), \
26790075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
26890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtfp ((vector float) a1, (vector float) a2), \
26990075Sobrien    __altivec_link_error_invalid_argument ())))))))
27090075Sobrien
27190075Sobrien#define vec_ctf(a1, a2) \
27290075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, const char, a2), \
27390075Sobrien      (vector float) __builtin_altivec_vcfux ((vector signed int) a1, (const char) a2), \
27490075Sobrien__ch (__bin_args_eq (vector signed int, a1, const char, a2), \
27590075Sobrien      (vector float) __builtin_altivec_vcfsx ((vector signed int) a1, (const char) a2), \
27690075Sobrien    __altivec_link_error_invalid_argument ()))
27790075Sobrien
27890075Sobrien#define vec_cts(a1, a2) __builtin_altivec_vctsxs (a1, a2)
27990075Sobrien
28090075Sobrien#define vec_ctu(a1, a2) __builtin_altivec_vctuxs (a1, a2)
28190075Sobrien
28290075Sobrien#define vec_dss(a1) __builtin_altivec_dss (a1)
28390075Sobrien
28490075Sobrien#define vec_dssall() __builtin_altivec_dssall ()
28590075Sobrien
28690075Sobrien#define vec_dst(a1, a2, a3) __builtin_altivec_dst (a1, a2, a3)
28790075Sobrien
28890075Sobrien#define vec_dstst(a1, a2, a3) __builtin_altivec_dstst (a1, a2, a3)
28990075Sobrien
29090075Sobrien#define vec_dststt(a1, a2, a3) __builtin_altivec_dststt (a1, a2, a3)
29190075Sobrien
29290075Sobrien#define vec_dstt(a1, a2, a3) __builtin_altivec_dstt (a1, a2, a3)
29390075Sobrien
29490075Sobrien#define vec_expte(a1) __builtin_altivec_vexptefp (a1)
29590075Sobrien
29690075Sobrien#define vec_floor(a1) __builtin_altivec_vrfim (a1)
29790075Sobrien
29890075Sobrien#define vec_ld(a, b) \
29990075Sobrien__ch (__un_args_eq (vector unsigned char *, b), \
30090075Sobrien      (vector unsigned char) __builtin_altivec_lvx (a, b), \
30190075Sobrien__ch (__un_args_eq (unsigned char *, b), \
30290075Sobrien      (vector unsigned char) __builtin_altivec_lvx (a, b), \
30390075Sobrien__ch (__un_args_eq (vector signed char *, b), \
30490075Sobrien      (vector signed char) __builtin_altivec_lvx (a, b), \
30590075Sobrien__ch (__un_args_eq (signed char *, b), \
30690075Sobrien      (vector signed char) __builtin_altivec_lvx (a, b), \
30790075Sobrien__ch (__un_args_eq (vector unsigned short *, b), \
30890075Sobrien      (vector unsigned short) __builtin_altivec_lvx (a, b), \
30990075Sobrien__ch (__un_args_eq (unsigned short *, b), \
31090075Sobrien      (vector unsigned short) __builtin_altivec_lvx (a, b), \
31190075Sobrien__ch (__un_args_eq (vector signed short *, b), \
31290075Sobrien      (vector signed short) __builtin_altivec_lvx (a, b), \
31390075Sobrien__ch (__un_args_eq (signed short *, b), \
31490075Sobrien      (vector signed short) __builtin_altivec_lvx (a, b), \
31590075Sobrien__ch (__un_args_eq (vector unsigned int *, b), \
31690075Sobrien      (vector unsigned int) __builtin_altivec_lvx (a, b), \
31790075Sobrien__ch (__un_args_eq (unsigned int *, b), \
31890075Sobrien      (vector unsigned int) __builtin_altivec_lvx (a, b), \
31990075Sobrien__ch (__un_args_eq (vector signed int *, b), \
32090075Sobrien      (vector signed int) __builtin_altivec_lvx (a, b), \
32190075Sobrien__ch (__un_args_eq (signed int *, b), \
32290075Sobrien      (vector signed int) __builtin_altivec_lvx (a, b), \
32390075Sobrien__ch (__un_args_eq (vector float *, b), \
32490075Sobrien      (vector float) __builtin_altivec_lvx (a, b), \
32590075Sobrien__ch (__un_args_eq (float *, b), \
32690075Sobrien      (vector float) __builtin_altivec_lvx (a, b), \
32790075Sobrien__altivec_link_error_invalid_argument ()))))))))))))))
32890075Sobrien
32990075Sobrien#define vec_lde(a, b) \
33090075Sobrien__ch (__un_args_eq (unsigned char *, b), \
33190075Sobrien      (vector unsigned char) __builtin_altivec_lvebx (a, b), \
33290075Sobrien__ch (__un_args_eq (signed char *, b), \
33390075Sobrien      (vector signed char) __builtin_altivec_lvebx (a, b), \
33490075Sobrien__ch (__un_args_eq (unsigned short *, b), \
33590075Sobrien      (vector unsigned short) __builtin_altivec_lvehx (a, b), \
33690075Sobrien__ch (__un_args_eq (signed short *, b), \
33790075Sobrien      (vector signed short) __builtin_altivec_lvehx (a, b), \
33890075Sobrien__ch (__un_args_eq (unsigned int *, b), \
33990075Sobrien      (vector unsigned int) __builtin_altivec_lvewx (a, b), \
34090075Sobrien__ch (__un_args_eq (signed int *, b), \
34190075Sobrien      (vector signed int) __builtin_altivec_lvewx (a, b), \
34290075Sobrien__altivec_link_error_invalid_argument ()))))))
34390075Sobrien
34490075Sobrien#define vec_ldl(a, b) \
34590075Sobrien__ch (__un_args_eq (vector unsigned char *, b), \
34690075Sobrien      (vector unsigned char) __builtin_altivec_lvxl (a, b), \
34790075Sobrien__ch (__un_args_eq (unsigned char *, b), \
34890075Sobrien      (vector unsigned char) __builtin_altivec_lvxl (a, b), \
34990075Sobrien__ch (__un_args_eq (vector signed char *, b), \
35090075Sobrien      (vector signed char) __builtin_altivec_lvxl (a, b), \
35190075Sobrien__ch (__un_args_eq (signed char *, b), \
35290075Sobrien      (vector signed char) __builtin_altivec_lvxl (a, b), \
35390075Sobrien__ch (__un_args_eq (vector unsigned short *, b), \
35490075Sobrien      (vector unsigned short) __builtin_altivec_lvxl (a, b), \
35590075Sobrien__ch (__un_args_eq (unsigned short *, b), \
35690075Sobrien      (vector unsigned short) __builtin_altivec_lvxl (a, b), \
35790075Sobrien__ch (__un_args_eq (vector signed short *, b), \
35890075Sobrien      (vector signed short) __builtin_altivec_lvxl (a, b), \
35990075Sobrien__ch (__un_args_eq (signed short *, b), \
36090075Sobrien      (vector signed short) __builtin_altivec_lvxl (a, b), \
36190075Sobrien__ch (__un_args_eq (vector unsigned int *, b), \
36290075Sobrien      (vector unsigned int) __builtin_altivec_lvxl (a, b), \
36390075Sobrien__ch (__un_args_eq (unsigned int *, b), \
36490075Sobrien      (vector unsigned int) __builtin_altivec_lvxl (a, b), \
36590075Sobrien__ch (__un_args_eq (vector signed int *, b), \
36690075Sobrien      (vector signed int) __builtin_altivec_lvxl (a, b), \
36790075Sobrien__ch (__un_args_eq (signed int *, b), \
36890075Sobrien      (vector signed int) __builtin_altivec_lvxl (a, b), \
36990075Sobrien__ch (__un_args_eq (vector float *, b), \
37090075Sobrien      (vector float) __builtin_altivec_lvxl (a, b), \
37190075Sobrien__ch (__un_args_eq (float *, b), \
37290075Sobrien      (vector float) __builtin_altivec_lvxl (a, b), \
37390075Sobrien__altivec_link_error_invalid_argument ()))))))))))))))
37490075Sobrien
37590075Sobrien#define vec_loge(a1) __builtin_altivec_vlogefp (a1)
37690075Sobrien
37790075Sobrien#define vec_lvsl(a1, a2) __builtin_altivec_lvsl (a1, a2)
37890075Sobrien
37990075Sobrien#define vec_lvsr(a1, a2) __builtin_altivec_lvsr (a1, a2)
38090075Sobrien
38190075Sobrien#define vec_madd(a1, a2, a3) __builtin_altivec_vmaddfp (a1, a2, a3)
38290075Sobrien
38390075Sobrien#define vec_madds(a1, a2, a3) __builtin_altivec_vmhaddshs (a1, a2, a3)
38490075Sobrien
38590075Sobrien#define vec_max(a1, a2) \
38690075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
38790075Sobrien      (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2), \
38890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
38990075Sobrien      (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2), \
39090075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
39190075Sobrien      (vector unsigned char) __builtin_altivec_vmaxub ((vector signed char) a1, (vector signed char) a2), \
39290075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
39390075Sobrien      (vector signed char) __builtin_altivec_vmaxsb ((vector signed char) a1, (vector signed char) a2), \
39490075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
39590075Sobrien      (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2), \
39690075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
39790075Sobrien      (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2), \
39890075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
39990075Sobrien      (vector unsigned short) __builtin_altivec_vmaxuh ((vector signed short) a1, (vector signed short) a2), \
40090075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
40190075Sobrien      (vector signed short) __builtin_altivec_vmaxsh ((vector signed short) a1, (vector signed short) a2), \
40290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
40390075Sobrien      (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2), \
40490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
40590075Sobrien      (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2), \
40690075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
40790075Sobrien      (vector unsigned int) __builtin_altivec_vmaxuw ((vector signed int) a1, (vector signed int) a2), \
40890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
40990075Sobrien      (vector signed int) __builtin_altivec_vmaxsw ((vector signed int) a1, (vector signed int) a2), \
41090075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
41190075Sobrien      (vector float) __builtin_altivec_vmaxfp ((vector float) a1, (vector float) a2), \
41290075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
41390075Sobrien
41490075Sobrien#define vec_mergeh(a1, a2) \
41590075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
41690075Sobrien      (vector signed char) __builtin_altivec_vmrghb ((vector signed char) a1, (vector signed char) a2), \
41790075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
41890075Sobrien      (vector unsigned char) __builtin_altivec_vmrghb ((vector signed char) a1, (vector signed char) a2), \
41990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
42090075Sobrien      (vector signed short) __builtin_altivec_vmrghh ((vector signed short) a1, (vector signed short) a2), \
42190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
42290075Sobrien      (vector unsigned short) __builtin_altivec_vmrghh ((vector signed short) a1, (vector signed short) a2), \
42390075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
42490075Sobrien      (vector float) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2), \
42590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
42690075Sobrien      (vector signed int) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2), \
42790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
42890075Sobrien      (vector unsigned int) __builtin_altivec_vmrghw ((vector signed int) a1, (vector signed int) a2), \
42990075Sobrien    __altivec_link_error_invalid_argument ())))))))
43090075Sobrien
43190075Sobrien#define vec_mergel(a1, a2) \
43290075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
43390075Sobrien      (vector signed char) __builtin_altivec_vmrglb ((vector signed char) a1, (vector signed char) a2), \
43490075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
43590075Sobrien      (vector unsigned char) __builtin_altivec_vmrglb ((vector signed char) a1, (vector signed char) a2), \
43690075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
43790075Sobrien      (vector signed short) __builtin_altivec_vmrglh ((vector signed short) a1, (vector signed short) a2), \
43890075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
43990075Sobrien      (vector unsigned short) __builtin_altivec_vmrglh ((vector signed short) a1, (vector signed short) a2), \
44090075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
44190075Sobrien      (vector float) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2), \
44290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
44390075Sobrien      (vector signed int) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2), \
44490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
44590075Sobrien      (vector unsigned int) __builtin_altivec_vmrglw ((vector signed int) a1, (vector signed int) a2), \
44690075Sobrien    __altivec_link_error_invalid_argument ())))))))
44790075Sobrien
44890075Sobrien#define vec_mfvscr() __builtin_altivec_mfvscr ()
44990075Sobrien
45090075Sobrien#define vec_min(a1, a2) \
45190075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
45290075Sobrien      (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2), \
45390075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
45490075Sobrien      (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2), \
45590075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
45690075Sobrien      (vector unsigned char) __builtin_altivec_vminub ((vector signed char) a1, (vector signed char) a2), \
45790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
45890075Sobrien      (vector signed char) __builtin_altivec_vminsb ((vector signed char) a1, (vector signed char) a2), \
45990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
46090075Sobrien      (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2), \
46190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
46290075Sobrien      (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2), \
46390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
46490075Sobrien      (vector unsigned short) __builtin_altivec_vminuh ((vector signed short) a1, (vector signed short) a2), \
46590075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
46690075Sobrien      (vector signed short) __builtin_altivec_vminsh ((vector signed short) a1, (vector signed short) a2), \
46790075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
46890075Sobrien      (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2), \
46990075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
47090075Sobrien      (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2), \
47190075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
47290075Sobrien      (vector unsigned int) __builtin_altivec_vminuw ((vector signed int) a1, (vector signed int) a2), \
47390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
47490075Sobrien      (vector signed int) __builtin_altivec_vminsw ((vector signed int) a1, (vector signed int) a2), \
47590075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
47690075Sobrien      (vector float) __builtin_altivec_vminfp ((vector float) a1, (vector float) a2), \
47790075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
47890075Sobrien
47990075Sobrien#define vec_mladd(a1, a2, a3) \
48090075Sobrien__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector signed short, a3), \
48190075Sobrien      (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3), \
48290075Sobrien__ch (__tern_args_eq (vector signed short, a1, vector unsigned short, a2, vector unsigned short, a3), \
48390075Sobrien      (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3), \
48490075Sobrien__ch (__tern_args_eq (vector unsigned short, a1, vector signed short, a2, vector signed short, a3), \
48590075Sobrien      (vector signed short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3), \
48690075Sobrien__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned short, a3), \
48790075Sobrien      (vector unsigned short) __builtin_altivec_vmladduhm ((vector signed short) a1, (vector signed short) a2, (vector signed short) a3), \
48890075Sobrien    __altivec_link_error_invalid_argument ()))))
48990075Sobrien
49090075Sobrien#define vec_mradds(a1, a2, a3) __builtin_altivec_vmhraddshs (a1, a2, a3)
49190075Sobrien
49290075Sobrien#define vec_msum(a1, a2, a3) \
49390075Sobrien__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, vector unsigned int, a3), \
49490075Sobrien      (vector unsigned int) __builtin_altivec_vmsumubm ((vector signed char) a1, (vector signed char) a2, (vector signed int) a3), \
49590075Sobrien__ch (__tern_args_eq (vector signed char, a1, vector unsigned char, a2, vector signed int, a3), \
49690075Sobrien      (vector signed int) __builtin_altivec_vmsummbm ((vector signed char) a1, (vector signed char) a2, (vector signed int) a3), \
49790075Sobrien__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned int, a3), \
49890075Sobrien      (vector unsigned int) __builtin_altivec_vmsumuhm ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3), \
49990075Sobrien__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector signed int, a3), \
50090075Sobrien      (vector signed int) __builtin_altivec_vmsumshm ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3), \
50190075Sobrien    __altivec_link_error_invalid_argument ()))))
50290075Sobrien
50390075Sobrien#define vec_msums(a1, a2, a3) \
50490075Sobrien__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned int, a3), \
50590075Sobrien      (vector unsigned int) __builtin_altivec_vmsumuhs ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3), \
50690075Sobrien__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector signed int, a3), \
50790075Sobrien      (vector signed int) __builtin_altivec_vmsumshs ((vector signed short) a1, (vector signed short) a2, (vector signed int) a3), \
50890075Sobrien    __altivec_link_error_invalid_argument ()))
50990075Sobrien
51090075Sobrien#define vec_mtvscr(a1) \
51190075Sobrien__ch (__un_args_eq (vector signed int, a1), \
51290075Sobrien      __builtin_altivec_mtvscr ((vector signed int) a1), \
51390075Sobrien__ch (__un_args_eq (vector unsigned int, a1), \
51490075Sobrien      __builtin_altivec_mtvscr ((vector signed int) a1), \
51590075Sobrien__ch (__un_args_eq (vector signed short, a1), \
51690075Sobrien      __builtin_altivec_mtvscr ((vector signed int) a1), \
51790075Sobrien__ch (__un_args_eq (vector unsigned short, a1), \
51890075Sobrien      __builtin_altivec_mtvscr ((vector signed int) a1), \
51990075Sobrien__ch (__un_args_eq (vector signed char, a1), \
52090075Sobrien      __builtin_altivec_mtvscr ((vector signed int) a1), \
52190075Sobrien__ch (__un_args_eq (vector unsigned char, a1), \
52290075Sobrien      __builtin_altivec_mtvscr ((vector signed int) a1), \
52390075Sobrien    __altivec_link_error_invalid_argument ()))))))
52490075Sobrien
52590075Sobrien#define vec_mule(a1, a2) \
52690075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
52790075Sobrien      (vector unsigned short) __builtin_altivec_vmuleub ((vector signed char) a1, (vector signed char) a2), \
52890075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
52990075Sobrien      (vector signed short) __builtin_altivec_vmulesb ((vector signed char) a1, (vector signed char) a2), \
53090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
53190075Sobrien      (vector unsigned int) __builtin_altivec_vmuleuh ((vector signed short) a1, (vector signed short) a2), \
53290075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
53390075Sobrien      (vector signed int) __builtin_altivec_vmulesh ((vector signed short) a1, (vector signed short) a2), \
53490075Sobrien    __altivec_link_error_invalid_argument ()))))
53590075Sobrien
53690075Sobrien#define vec_mulo(a1, a2) \
53790075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
53890075Sobrien      (vector unsigned short) __builtin_altivec_vmuloub ((vector signed char) a1, (vector signed char) a2), \
53990075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
54090075Sobrien      (vector signed short) __builtin_altivec_vmulosb ((vector signed char) a1, (vector signed char) a2), \
54190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
54290075Sobrien      (vector unsigned int) __builtin_altivec_vmulouh ((vector signed short) a1, (vector signed short) a2), \
54390075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
54490075Sobrien      (vector signed int) __builtin_altivec_vmulosh ((vector signed short) a1, (vector signed short) a2), \
54590075Sobrien    __altivec_link_error_invalid_argument ()))))
54690075Sobrien
54790075Sobrien#define vec_nmsub(a1, a2, a3) __builtin_altivec_vnmsubfp (a1, a2, a3)
54890075Sobrien
54990075Sobrien#define vec_nor(a1, a2) \
55090075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
55190075Sobrien      (vector float) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
55290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
55390075Sobrien      (vector signed int) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
55490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
55590075Sobrien      (vector unsigned int) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
55690075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
55790075Sobrien      (vector signed short) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
55890075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
55990075Sobrien      (vector unsigned short) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
56090075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
56190075Sobrien      (vector signed char) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
56290075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
56390075Sobrien      (vector unsigned char) __builtin_altivec_vnor ((vector signed int) a1, (vector signed int) a2), \
56490075Sobrien    __altivec_link_error_invalid_argument ())))))))
56590075Sobrien
56690075Sobrien#define vec_or(a1, a2) \
56790075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
56890075Sobrien      (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
56990075Sobrien__ch (__bin_args_eq (vector float, a1, vector signed int, a2), \
57090075Sobrien      (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
57190075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector float, a2), \
57290075Sobrien      (vector float) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
57390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
57490075Sobrien      (vector signed int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
57590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
57690075Sobrien      (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
57790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
57890075Sobrien      (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
57990075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
58090075Sobrien      (vector unsigned int) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
58190075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
58290075Sobrien      (vector signed short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
58390075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
58490075Sobrien      (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
58590075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
58690075Sobrien      (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
58790075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
58890075Sobrien      (vector unsigned short) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
58990075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
59090075Sobrien      (vector signed char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
59190075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
59290075Sobrien      (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
59390075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
59490075Sobrien      (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
59590075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
59690075Sobrien      (vector unsigned char) __builtin_altivec_vor ((vector signed int) a1, (vector signed int) a2), \
59790075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))))
59890075Sobrien
59990075Sobrien#define vec_pack(a1, a2) \
60090075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
60190075Sobrien      (vector signed char) __builtin_altivec_vpkuhum ((vector signed short) a1, (vector signed short) a2), \
60290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
60390075Sobrien      (vector unsigned char) __builtin_altivec_vpkuhum ((vector signed short) a1, (vector signed short) a2), \
60490075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
60590075Sobrien      (vector signed short) __builtin_altivec_vpkuwum ((vector signed int) a1, (vector signed int) a2), \
60690075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
60790075Sobrien      (vector unsigned short) __builtin_altivec_vpkuwum ((vector signed int) a1, (vector signed int) a2), \
60890075Sobrien    __altivec_link_error_invalid_argument ()))))
60990075Sobrien
61090075Sobrien#define vec_packpx(a1, a2) __builtin_altivec_vpkpx (a1, a2)
61190075Sobrien
61290075Sobrien#define vec_packs(a1, a2) \
61390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
61490075Sobrien      (vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) a1, (vector signed short) a2), \
61590075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
61690075Sobrien      (vector signed char) __builtin_altivec_vpkshss ((vector signed short) a1, (vector signed short) a2), \
61790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
61890075Sobrien      (vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) a1, (vector signed int) a2), \
61990075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
62090075Sobrien      (vector signed short) __builtin_altivec_vpkswss ((vector signed int) a1, (vector signed int) a2), \
62190075Sobrien    __altivec_link_error_invalid_argument ()))))
62290075Sobrien
62390075Sobrien#define vec_packsu(a1, a2) \
62490075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
62590075Sobrien      (vector unsigned char) __builtin_altivec_vpkuhus ((vector signed short) a1, (vector signed short) a2), \
62690075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
62790075Sobrien      (vector unsigned char) __builtin_altivec_vpkshus ((vector signed short) a1, (vector signed short) a2), \
62890075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
62990075Sobrien      (vector unsigned short) __builtin_altivec_vpkuwus ((vector signed int) a1, (vector signed int) a2), \
63090075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
63190075Sobrien      (vector unsigned short) __builtin_altivec_vpkswus ((vector signed int) a1, (vector signed int) a2), \
63290075Sobrien    __altivec_link_error_invalid_argument ()))))
63390075Sobrien
63490075Sobrien#define vec_perm(a1, a2, a3, a4) \
63590075Sobrien__ch (__tern_args_eq (vector float, a1, vector float, a2, vector unsigned char, a3), \
63690075Sobrien      (vector float) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
63790075Sobrien__ch (__tern_args_eq (vector signed int, a1, vector signed int, a2, vector unsigned char, a3), \
63890075Sobrien      (vector signed int) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
63990075Sobrien__ch (__tern_args_eq (vector unsigned int, a1, vector unsigned int, a2, vector unsigned char, a3), \
64090075Sobrien      (vector unsigned int) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
64190075Sobrien__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector unsigned char, a3), \
64290075Sobrien      (vector signed short) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
64390075Sobrien__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned char, a3), \
64490075Sobrien      (vector unsigned short) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
64590075Sobrien__ch (__tern_args_eq (vector signed char, a1, vector signed char, a2, vector unsigned char, a3), \
64690075Sobrien      (vector signed char) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
64790075Sobrien__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, vector unsigned char, a3), \
64890075Sobrien      (vector unsigned char) __builtin_altivec_vperm_4si ((vector signed int) a1, (vector signed int) a2, (vector signed char) a3), \
64990075Sobrien    __altivec_link_error_invalid_argument ())))))))
65090075Sobrien
65190075Sobrien#define vec_re(a1) __builtin_altivec_vrefp (a1)
65290075Sobrien
65390075Sobrien#define vec_rl(a1, a2) \
65490075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
65590075Sobrien      (vector signed char) __builtin_altivec_vrlb ((vector signed char) a1, (vector signed char) a2), \
65690075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
65790075Sobrien      (vector unsigned char) __builtin_altivec_vrlb ((vector signed char) a1, (vector signed char) a2), \
65890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
65990075Sobrien      (vector signed short) __builtin_altivec_vrlh ((vector signed short) a1, (vector signed short) a2), \
66090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
66190075Sobrien      (vector unsigned short) __builtin_altivec_vrlh ((vector signed short) a1, (vector signed short) a2), \
66290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
66390075Sobrien      (vector signed int) __builtin_altivec_vrlw ((vector signed int) a1, (vector signed int) a2), \
66490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
66590075Sobrien      (vector unsigned int) __builtin_altivec_vrlw ((vector signed int) a1, (vector signed int) a2), \
66690075Sobrien    __altivec_link_error_invalid_argument ()))))))
66790075Sobrien
66890075Sobrien#define vec_round(a1) __builtin_altivec_vrfin (a1)
66990075Sobrien
67090075Sobrien#define vec_rsqrte(a1) __builtin_altivec_vrsqrtefp (a1)
67190075Sobrien
67290075Sobrien#define vec_sel(a1, a2, a3) \
67390075Sobrien__ch (__tern_args_eq (vector float, a1, vector float, a2, vector signed int, a3), \
67490075Sobrien      (vector float) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
67590075Sobrien__ch (__tern_args_eq (vector float, a1, vector float, a2, vector unsigned int, a3), \
67690075Sobrien      (vector float) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
67790075Sobrien__ch (__tern_args_eq (vector signed int, a1, vector signed int, a2, vector signed int, a3), \
67890075Sobrien      (vector signed int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
67990075Sobrien__ch (__tern_args_eq (vector signed int, a1, vector signed int, a2, vector unsigned int, a3), \
68090075Sobrien      (vector signed int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
68190075Sobrien__ch (__tern_args_eq (vector unsigned int, a1, vector unsigned int, a2, vector signed int, a3), \
68290075Sobrien      (vector unsigned int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
68390075Sobrien__ch (__tern_args_eq (vector unsigned int, a1, vector unsigned int, a2, vector unsigned int, a3), \
68490075Sobrien      (vector unsigned int) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
68590075Sobrien__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector signed short, a3), \
68690075Sobrien      (vector signed short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
68790075Sobrien__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, vector unsigned short, a3), \
68890075Sobrien      (vector signed short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
68990075Sobrien__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector signed short, a3), \
69090075Sobrien      (vector unsigned short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
69190075Sobrien__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, vector unsigned short, a3), \
69290075Sobrien      (vector unsigned short) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
69390075Sobrien__ch (__tern_args_eq (vector signed char, a1, vector signed char, a2, vector signed char, a3), \
69490075Sobrien      (vector signed char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
69590075Sobrien__ch (__tern_args_eq (vector signed char, a1, vector signed char, a2, vector unsigned char, a3), \
69690075Sobrien      (vector signed char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
69790075Sobrien__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, vector signed char, a3), \
69890075Sobrien      (vector unsigned char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
69990075Sobrien__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, vector unsigned char, a3), \
70090075Sobrien      (vector unsigned char) __builtin_altivec_vsel_4si ((vector signed int) a1, (vector signed int) a2, (vector signed int) a3), \
70190075Sobrien    __altivec_link_error_invalid_argument ()))))))))))))))
70290075Sobrien
70390075Sobrien#define vec_sl(a1, a2) \
70490075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
70590075Sobrien      (vector signed char) __builtin_altivec_vslb ((vector signed char) a1, (vector signed char) a2), \
70690075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
70790075Sobrien      (vector unsigned char) __builtin_altivec_vslb ((vector signed char) a1, (vector signed char) a2), \
70890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
70990075Sobrien      (vector signed short) __builtin_altivec_vslh ((vector signed short) a1, (vector signed short) a2), \
71090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
71190075Sobrien      (vector unsigned short) __builtin_altivec_vslh ((vector signed short) a1, (vector signed short) a2), \
71290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
71390075Sobrien      (vector signed int) __builtin_altivec_vslw ((vector signed int) a1, (vector signed int) a2), \
71490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
71590075Sobrien      (vector unsigned int) __builtin_altivec_vslw ((vector signed int) a1, (vector signed int) a2), \
71690075Sobrien    __altivec_link_error_invalid_argument ()))))))
71790075Sobrien
71890075Sobrien#define vec_sld(a1, a2, a3) \
71990075Sobrien__ch (__tern_args_eq (vector float, a1, vector float, a2, const char, a3), \
72090075Sobrien      (vector float) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
72190075Sobrien__ch (__tern_args_eq (vector signed int, a1, vector signed int, a2, const char, a3), \
72290075Sobrien      (vector signed int) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
72390075Sobrien__ch (__tern_args_eq (vector unsigned int, a1, vector unsigned int, a2, const char, a3), \
72490075Sobrien      (vector unsigned int) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
72590075Sobrien__ch (__tern_args_eq (vector signed short, a1, vector signed short, a2, const char, a3), \
72690075Sobrien      (vector signed short) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
72790075Sobrien__ch (__tern_args_eq (vector unsigned short, a1, vector unsigned short, a2, const char, a3), \
72890075Sobrien      (vector unsigned short) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
72990075Sobrien__ch (__tern_args_eq (vector signed char, a1, vector signed char, a2, const char, a3), \
73090075Sobrien      (vector signed char) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
73190075Sobrien__ch (__tern_args_eq (vector unsigned char, a1, vector unsigned char, a2, const char, a3), \
73290075Sobrien      (vector unsigned char) __builtin_altivec_vsldoi_4si ((vector signed int) a1, (vector signed int) a2, (const char) a3), \
73390075Sobrien    __altivec_link_error_invalid_argument ())))))))
73490075Sobrien
73590075Sobrien#define vec_sll(a1, a2) \
73690075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
73790075Sobrien      (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
73890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned short, a2), \
73990075Sobrien      (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
74090075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned char, a2), \
74190075Sobrien      (vector signed int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
74290075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
74390075Sobrien      (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
74490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned short, a2), \
74590075Sobrien      (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
74690075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned char, a2), \
74790075Sobrien      (vector unsigned int) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
74890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned int, a2), \
74990075Sobrien      (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
75090075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
75190075Sobrien      (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
75290075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned char, a2), \
75390075Sobrien      (vector signed short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
75490075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned int, a2), \
75590075Sobrien      (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
75690075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
75790075Sobrien      (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
75890075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned char, a2), \
75990075Sobrien      (vector unsigned short) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
76090075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned int, a2), \
76190075Sobrien      (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
76290075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned short, a2), \
76390075Sobrien      (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
76490075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
76590075Sobrien      (vector signed char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
76690075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned int, a2), \
76790075Sobrien      (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
76890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned short, a2), \
76990075Sobrien      (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
77090075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
77190075Sobrien      (vector unsigned char) __builtin_altivec_vsl ((vector signed int) a1, (vector signed int) a2), \
77290075Sobrien    __altivec_link_error_invalid_argument ()))))))))))))))))))
77390075Sobrien
77490075Sobrien#define vec_slo(a1, a2) \
77590075Sobrien__ch (__bin_args_eq (vector float, a1, vector signed char, a2), \
77690075Sobrien      (vector float) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
77790075Sobrien__ch (__bin_args_eq (vector float, a1, vector unsigned char, a2), \
77890075Sobrien      (vector float) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
77990075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed char, a2), \
78090075Sobrien      (vector signed int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
78190075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned char, a2), \
78290075Sobrien      (vector signed int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
78390075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed char, a2), \
78490075Sobrien      (vector unsigned int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
78590075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned char, a2), \
78690075Sobrien      (vector unsigned int) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
78790075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed char, a2), \
78890075Sobrien      (vector signed short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
78990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned char, a2), \
79090075Sobrien      (vector signed short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
79190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed char, a2), \
79290075Sobrien      (vector unsigned short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
79390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned char, a2), \
79490075Sobrien      (vector unsigned short) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
79590075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
79690075Sobrien      (vector signed char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
79790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
79890075Sobrien      (vector signed char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
79990075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
80090075Sobrien      (vector unsigned char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
80190075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
80290075Sobrien      (vector unsigned char) __builtin_altivec_vslo ((vector signed int) a1, (vector signed int) a2), \
80390075Sobrien    __altivec_link_error_invalid_argument ()))))))))))))))
80490075Sobrien
80590075Sobrien#define vec_splat(a1, a2) \
80690075Sobrien__ch (__bin_args_eq (vector signed char, a1, const char, a2), \
80790075Sobrien      (vector signed char) __builtin_altivec_vspltb ((vector signed char) a1, (const char) a2), \
80890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, const char, a2), \
80990075Sobrien      (vector unsigned char) __builtin_altivec_vspltb ((vector signed char) a1, (const char) a2), \
81090075Sobrien__ch (__bin_args_eq (vector signed short, a1, const char, a2), \
81190075Sobrien      (vector signed short) __builtin_altivec_vsplth ((vector signed short) a1, (const char) a2), \
81290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, const char, a2), \
81390075Sobrien      (vector unsigned short) __builtin_altivec_vsplth ((vector signed short) a1, (const char) a2), \
81490075Sobrien__ch (__bin_args_eq (vector float, a1, const char, a2), \
81590075Sobrien      (vector float) __builtin_altivec_vspltw ((vector signed int) a1, (const char) a2), \
81690075Sobrien__ch (__bin_args_eq (vector signed int, a1, const char, a2), \
81790075Sobrien      (vector signed int) __builtin_altivec_vspltw ((vector signed int) a1, (const char) a2), \
81890075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, const char, a2), \
81990075Sobrien      (vector unsigned int) __builtin_altivec_vspltw ((vector signed int) a1, (const char) a2), \
82090075Sobrien    __altivec_link_error_invalid_argument ())))))))
82190075Sobrien
82290075Sobrien#define vec_splat_s8(a1) __builtin_altivec_vspltisb (a1)
82390075Sobrien
82490075Sobrien#define vec_splat_s16(a1) __builtin_altivec_vspltish (a1)
82590075Sobrien
82690075Sobrien#define vec_splat_s32(a1) __builtin_altivec_vspltisw (a1)
82790075Sobrien
82890075Sobrien#define vec_splat_u8(a1) __builtin_altivec_vspltisb (a1)
82990075Sobrien
83090075Sobrien#define vec_splat_u16(a1) __builtin_altivec_vspltish (a1)
83190075Sobrien
83290075Sobrien#define vec_splat_u32(a1) __builtin_altivec_vspltisw (a1)
83390075Sobrien
83490075Sobrien#define vec_sr(a1, a2) \
83590075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
83690075Sobrien      (vector signed char) __builtin_altivec_vsrb ((vector signed char) a1, (vector signed char) a2), \
83790075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
83890075Sobrien      (vector unsigned char) __builtin_altivec_vsrb ((vector signed char) a1, (vector signed char) a2), \
83990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
84090075Sobrien      (vector signed short) __builtin_altivec_vsrh ((vector signed short) a1, (vector signed short) a2), \
84190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
84290075Sobrien      (vector unsigned short) __builtin_altivec_vsrh ((vector signed short) a1, (vector signed short) a2), \
84390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
84490075Sobrien      (vector signed int) __builtin_altivec_vsrw ((vector signed int) a1, (vector signed int) a2), \
84590075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
84690075Sobrien      (vector unsigned int) __builtin_altivec_vsrw ((vector signed int) a1, (vector signed int) a2), \
84790075Sobrien    __altivec_link_error_invalid_argument ()))))))
84890075Sobrien
84990075Sobrien#define vec_sra(a1, a2) \
85090075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
85190075Sobrien      (vector signed char) __builtin_altivec_vsrab ((vector signed char) a1, (vector signed char) a2), \
85290075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
85390075Sobrien      (vector unsigned char) __builtin_altivec_vsrab ((vector signed char) a1, (vector signed char) a2), \
85490075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
85590075Sobrien      (vector signed short) __builtin_altivec_vsrah ((vector signed short) a1, (vector signed short) a2), \
85690075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
85790075Sobrien      (vector unsigned short) __builtin_altivec_vsrah ((vector signed short) a1, (vector signed short) a2), \
85890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
85990075Sobrien      (vector signed int) __builtin_altivec_vsraw ((vector signed int) a1, (vector signed int) a2), \
86090075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
86190075Sobrien      (vector unsigned int) __builtin_altivec_vsraw ((vector signed int) a1, (vector signed int) a2), \
86290075Sobrien    __altivec_link_error_invalid_argument ()))))))
86390075Sobrien
86490075Sobrien#define vec_srl(a1, a2) \
86590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
86690075Sobrien      (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
86790075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned short, a2), \
86890075Sobrien      (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
86990075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned char, a2), \
87090075Sobrien      (vector signed int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
87190075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
87290075Sobrien      (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
87390075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned short, a2), \
87490075Sobrien      (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
87590075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned char, a2), \
87690075Sobrien      (vector unsigned int) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
87790075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned int, a2), \
87890075Sobrien      (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
87990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
88090075Sobrien      (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
88190075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned char, a2), \
88290075Sobrien      (vector signed short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
88390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned int, a2), \
88490075Sobrien      (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
88590075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
88690075Sobrien      (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
88790075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned char, a2), \
88890075Sobrien      (vector unsigned short) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
88990075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned int, a2), \
89090075Sobrien      (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
89190075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned short, a2), \
89290075Sobrien      (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
89390075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
89490075Sobrien      (vector signed char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
89590075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned int, a2), \
89690075Sobrien      (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
89790075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned short, a2), \
89890075Sobrien      (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
89990075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
90090075Sobrien      (vector unsigned char) __builtin_altivec_vsr ((vector signed int) a1, (vector signed int) a2), \
90190075Sobrien    __altivec_link_error_invalid_argument ()))))))))))))))))))
90290075Sobrien
90390075Sobrien#define vec_sro(a1, a2) \
90490075Sobrien__ch (__bin_args_eq (vector float, a1, vector signed char, a2), \
90590075Sobrien      (vector float) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
90690075Sobrien__ch (__bin_args_eq (vector float, a1, vector unsigned char, a2), \
90790075Sobrien      (vector float) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
90890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed char, a2), \
90990075Sobrien      (vector signed int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
91090075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned char, a2), \
91190075Sobrien      (vector signed int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
91290075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed char, a2), \
91390075Sobrien      (vector unsigned int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
91490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned char, a2), \
91590075Sobrien      (vector unsigned int) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
91690075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed char, a2), \
91790075Sobrien      (vector signed short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
91890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned char, a2), \
91990075Sobrien      (vector signed short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
92090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed char, a2), \
92190075Sobrien      (vector unsigned short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
92290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned char, a2), \
92390075Sobrien      (vector unsigned short) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
92490075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
92590075Sobrien      (vector signed char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
92690075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
92790075Sobrien      (vector signed char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
92890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
92990075Sobrien      (vector unsigned char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
93090075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
93190075Sobrien      (vector unsigned char) __builtin_altivec_vsro ((vector signed int) a1, (vector signed int) a2), \
93290075Sobrien    __altivec_link_error_invalid_argument ()))))))))))))))
93390075Sobrien
93490075Sobrien#define vec_st(a1, a2, a3) \
93590075Sobrien  __builtin_altivec_stvx ((vector signed int) a1, a2, a3)
93690075Sobrien
93790075Sobrien#define vec_stl(a1, a2, a3) \
93890075Sobrien  __builtin_altivec_stvxl ((vector signed int) a1, a2, a3)
93990075Sobrien
94090075Sobrien#define vec_ste(a, b, c) \
94190075Sobrien__ch (__un_args_eq (vector unsigned char, a), \
94290075Sobrien      __builtin_altivec_stvebx ((vector signed char) a, b, c), \
94390075Sobrien__ch (__un_args_eq (vector signed char, a), \
94490075Sobrien      __builtin_altivec_stvebx ((vector signed char) a, b, c), \
94590075Sobrien__ch (__un_args_eq (vector unsigned short, a), \
94690075Sobrien     __builtin_altivec_stvehx ((vector signed short) a, b, c), \
94790075Sobrien__ch (__un_args_eq (vector signed short, a), \
94890075Sobrien     __builtin_altivec_stvehx ((vector signed short) a, b, c), \
94990075Sobrien__ch (__un_args_eq (vector unsigned int, a), \
95090075Sobrien     __builtin_altivec_stvewx ((vector signed int) a, b, c), \
95190075Sobrien__ch (__un_args_eq (vector signed int, a), \
95290075Sobrien     __builtin_altivec_stvewx ((vector signed int) a, b, c), \
95390075Sobrien__ch (__un_args_eq (vector float, a), \
95490075Sobrien     __builtin_altivec_stvewx ((vector signed int) a, b, c), \
95590075Sobrien     __altivec_link_error_invalid_argument ())))))))
95690075Sobrien
95790075Sobrien#define vec_sub(a1, a2) \
95890075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
95990075Sobrien      (vector signed char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2), \
96090075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
96190075Sobrien      (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2), \
96290075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
96390075Sobrien      (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2), \
96490075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
96590075Sobrien      (vector unsigned char) __builtin_altivec_vsububm ((vector signed char) a1, (vector signed char) a2), \
96690075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
96790075Sobrien      (vector signed short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2), \
96890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
96990075Sobrien      (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2), \
97090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
97190075Sobrien      (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2), \
97290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
97390075Sobrien      (vector unsigned short) __builtin_altivec_vsubuhm ((vector signed short) a1, (vector signed short) a2), \
97490075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
97590075Sobrien      (vector signed int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2), \
97690075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
97790075Sobrien      (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2), \
97890075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
97990075Sobrien      (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2), \
98090075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
98190075Sobrien      (vector unsigned int) __builtin_altivec_vsubuwm ((vector signed int) a1, (vector signed int) a2), \
98290075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
98390075Sobrien      (vector float) __builtin_altivec_vsubfp ((vector float) a1, (vector float) a2), \
98490075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
98590075Sobrien
98690075Sobrien#define vec_subc(a1, a2) __builtin_altivec_vsubcuw (a1, a2)
98790075Sobrien
98890075Sobrien#define vec_subs(a1, a2) \
98990075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
99090075Sobrien      (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2), \
99190075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
99290075Sobrien      (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2), \
99390075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
99490075Sobrien      (vector unsigned char) __builtin_altivec_vsububs ((vector signed char) a1, (vector signed char) a2), \
99590075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
99690075Sobrien      (vector signed char) __builtin_altivec_vsubsbs ((vector signed char) a1, (vector signed char) a2), \
99790075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
99890075Sobrien      (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2), \
99990075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
100090075Sobrien      (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2), \
100190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
100290075Sobrien      (vector unsigned short) __builtin_altivec_vsubuhs ((vector signed short) a1, (vector signed short) a2), \
100390075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
100490075Sobrien      (vector signed short) __builtin_altivec_vsubshs ((vector signed short) a1, (vector signed short) a2), \
100590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
100690075Sobrien      (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2), \
100790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
100890075Sobrien      (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2), \
100990075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
101090075Sobrien      (vector unsigned int) __builtin_altivec_vsubuws ((vector signed int) a1, (vector signed int) a2), \
101190075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
101290075Sobrien      (vector signed int) __builtin_altivec_vsubsws ((vector signed int) a1, (vector signed int) a2), \
101390075Sobrien    __altivec_link_error_invalid_argument ()))))))))))))
101490075Sobrien
101590075Sobrien#define vec_sum4s(a1, a2) \
101690075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned int, a2), \
101790075Sobrien      (vector unsigned int) __builtin_altivec_vsum4ubs ((vector signed char) a1, (vector signed int) a2), \
101890075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed int, a2), \
101990075Sobrien      (vector signed int) __builtin_altivec_vsum4sbs ((vector signed char) a1, (vector signed int) a2), \
102090075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed int, a2), \
102190075Sobrien      (vector signed int) __builtin_altivec_vsum4shs ((vector signed short) a1, (vector signed int) a2), \
102290075Sobrien    __altivec_link_error_invalid_argument ())))
102390075Sobrien
102490075Sobrien#define vec_sum2s(a1, a2) __builtin_altivec_vsum2sws (a1, a2)
102590075Sobrien
102690075Sobrien#define vec_sums(a1, a2) __builtin_altivec_vsumsws (a1, a2)
102790075Sobrien
102890075Sobrien#define vec_trunc(a1) __builtin_altivec_vrfiz (a1)
102990075Sobrien
103090075Sobrien#define vec_unpackh(a1) \
103190075Sobrien__ch (__un_args_eq (vector signed char, a1), \
103290075Sobrien      (vector signed short) __builtin_altivec_vupkhsb ((vector signed char) a1), \
103390075Sobrien__ch (__un_args_eq (vector signed short, a1), \
103490075Sobrien      (vector unsigned int) __builtin_altivec_vupkhpx ((vector signed short) a1), \
103590075Sobrien__ch (__un_args_eq (vector signed short, a1), \
103690075Sobrien      (vector signed int) __builtin_altivec_vupkhsh ((vector signed short) a1), \
103790075Sobrien    __altivec_link_error_invalid_argument ())))
103890075Sobrien
103990075Sobrien#define vec_unpackl(a1) \
104090075Sobrien__ch (__un_args_eq (vector signed char, a1), \
104190075Sobrien      (vector signed short) __builtin_altivec_vupklsb ((vector signed char) a1), \
104290075Sobrien__ch (__un_args_eq (vector signed short, a1), \
104390075Sobrien      (vector unsigned int) __builtin_altivec_vupklpx ((vector signed short) a1), \
104490075Sobrien__ch (__un_args_eq (vector signed short, a1), \
104590075Sobrien      (vector signed int) __builtin_altivec_vupklsh ((vector signed short) a1), \
104690075Sobrien    __altivec_link_error_invalid_argument ())))
104790075Sobrien
104890075Sobrien#define vec_xor(a1, a2) \
104990075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
105090075Sobrien      (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
105190075Sobrien__ch (__bin_args_eq (vector float, a1, vector signed int, a2), \
105290075Sobrien      (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
105390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector float, a2), \
105490075Sobrien      (vector float) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
105590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
105690075Sobrien      (vector signed int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
105790075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
105890075Sobrien      (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
105990075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
106090075Sobrien      (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
106190075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
106290075Sobrien      (vector unsigned int) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
106390075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
106490075Sobrien      (vector signed short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
106590075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
106690075Sobrien      (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
106790075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
106890075Sobrien      (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
106990075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
107090075Sobrien      (vector unsigned short) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
107190075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
107290075Sobrien      (vector signed char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
107390075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
107490075Sobrien      (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
107590075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
107690075Sobrien      (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
107790075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
107890075Sobrien      (vector unsigned char) __builtin_altivec_vxor ((vector signed int) a1, (vector signed int) a2), \
107990075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))))
108090075Sobrien
108190075Sobrien#define vec_all_eq(a1, a2) \
108290075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
108390075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
108490075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
108590075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
108690075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
108790075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
108890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
108990075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
109090075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
109190075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
109290075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
109390075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
109490075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
109590075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
109690075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
109790075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
109890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
109990075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
110090075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
110190075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
110290075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
110390075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
110490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
110590075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
110690075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
110790075Sobrien      (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) a1, (vector float) a2), \
110890075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
110990075Sobrien
111090075Sobrien#define vec_all_ge(a1, a2) \
111190075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
111290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
111390075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
111490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
111590075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
111690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
111790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
111890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
111990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
112090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
112190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
112290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
112390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
112490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
112590075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
112690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
112790075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
112890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
112990075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
113090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
113190075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
113290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
113390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
113490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
113590075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
113690075Sobrien      (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) a1, (vector float) a2), \
113790075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
113890075Sobrien
113990075Sobrien#define vec_all_gt(a1, a2) \
114090075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
114190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
114290075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
114390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
114490075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
114590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
114690075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
114790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
114890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
114990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
115090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
115190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
115290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
115390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
115490075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
115590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
115690075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
115790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
115890075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
115990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
116090075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
116190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
116290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
116390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
116490075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
116590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) a1, (vector float) a2), \
116690075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
116790075Sobrien
116890075Sobrien#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (a1, a2)
116990075Sobrien
117090075Sobrien#define vec_all_le(a1, a2) \
117190075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
117290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
117390075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
117490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
117590075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
117690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
117790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
117890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
117990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
118090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
118190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
118290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
118390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
118490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
118590075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
118690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
118790075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
118890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
118990075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
119090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
119190075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
119290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
119390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
119490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
119590075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
119690075Sobrien      (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) a1, (vector float) a2), \
119790075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
119890075Sobrien
119990075Sobrien#define vec_all_lt(a1, a2) \
120090075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
120190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
120290075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
120390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
120490075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
120590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
120690075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
120790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
120890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
120990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
121090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
121190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
121290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
121390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
121490075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
121590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
121690075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
121790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
121890075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
121990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
122090075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
122190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
122290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
122390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
122490075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
122590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) a1, (vector float) a2), \
122690075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
122790075Sobrien
122890075Sobrien#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (a1)
122990075Sobrien
123090075Sobrien#define vec_all_ne(a1, a2) \
123190075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
123290075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
123390075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
123490075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
123590075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
123690075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
123790075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
123890075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
123990075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
124090075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
124190075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
124290075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
124390075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
124490075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
124590075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
124690075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
124790075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
124890075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
124990075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
125090075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
125190075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
125290075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
125390075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
125490075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
125590075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
125690075Sobrien      (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) a1, (vector float) a2), \
125790075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
125890075Sobrien
125990075Sobrien#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)
126090075Sobrien
126190075Sobrien#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)
126290075Sobrien
126390075Sobrien#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)
126490075Sobrien
126590075Sobrien#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)
126690075Sobrien
126790075Sobrien#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (a1)
126890075Sobrien
126990075Sobrien#define vec_any_eq(a1, a2) \
127090075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
127190075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
127290075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
127390075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
127490075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
127590075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
127690075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
127790075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
127890075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
127990075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
128090075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
128190075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
128290075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
128390075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
128490075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
128590075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
128690075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
128790075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
128890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
128990075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
129090075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
129190075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
129290075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
129390075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
129490075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
129590075Sobrien      (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) a1, (vector float) a2), \
129690075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
129790075Sobrien
129890075Sobrien#define vec_any_ge(a1, a2) \
129990075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
130090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
130190075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
130290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
130390075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
130490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
130590075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
130690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
130790075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
130890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
130990075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
131090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
131190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
131290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
131390075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
131490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
131590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
131690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
131790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
131890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
131990075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
132090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
132190075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
132290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
132390075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
132490075Sobrien      (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) a1, (vector float) a2), \
132590075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
132690075Sobrien
132790075Sobrien#define vec_any_gt(a1, a2) \
132890075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
132990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
133090075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
133190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
133290075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
133390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
133490075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
133590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
133690075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
133790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
133890075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
133990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
134090075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
134190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
134290075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
134390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
134490075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
134590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
134690075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
134790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
134890075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
134990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
135090075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
135190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
135290075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
135390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) a1, (vector float) a2), \
135490075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
135590075Sobrien
135690075Sobrien#define vec_any_le(a1, a2) \
135790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
135890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
135990075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
136090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
136190075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
136290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
136390075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
136490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
136590075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
136690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
136790075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
136890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
136990075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
137090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
137190075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
137290075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
137390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
137490075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
137590075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
137690075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
137790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
137890075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
137990075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
138090075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
138190075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
138290075Sobrien      (vector signed int) __builtin_altivec_vcmpgefp_p ((vector float) a1, (vector float) a2), \
138390075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
138490075Sobrien
138590075Sobrien#define vec_any_lt(a1, a2) \
138690075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
138790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
138890075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
138990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
139090075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
139190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtub_p ((vector signed char) a1, (vector signed char) a2), \
139290075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
139390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsb_p ((vector signed char) a1, (vector signed char) a2), \
139490075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
139590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
139690075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
139790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
139890075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
139990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuh_p ((vector signed short) a1, (vector signed short) a2), \
140090075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
140190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsh_p ((vector signed short) a1, (vector signed short) a2), \
140290075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
140390075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
140490075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
140590075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
140690075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
140790075Sobrien      (vector signed int) __builtin_altivec_vcmpgtuw_p ((vector signed int) a1, (vector signed int) a2), \
140890075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
140990075Sobrien      (vector signed int) __builtin_altivec_vcmpgtsw_p ((vector signed int) a1, (vector signed int) a2), \
141090075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
141190075Sobrien      (vector signed int) __builtin_altivec_vcmpgtfp_p ((vector float) a1, (vector float) a2), \
141290075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
141390075Sobrien
141490075Sobrien#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (a1)
141590075Sobrien
141690075Sobrien#define vec_any_ne(a1, a2) \
141790075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector unsigned char, a2), \
141890075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
141990075Sobrien__ch (__bin_args_eq (vector signed char, a1, vector signed char, a2), \
142090075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
142190075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector signed char, a2), \
142290075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
142390075Sobrien__ch (__bin_args_eq (vector unsigned char, a1, vector unsigned char, a2), \
142490075Sobrien      (vector signed int) __builtin_altivec_vcmpequb_p ((vector signed char) a1, (vector signed char) a2), \
142590075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector unsigned short, a2), \
142690075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
142790075Sobrien__ch (__bin_args_eq (vector signed short, a1, vector signed short, a2), \
142890075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
142990075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector signed short, a2), \
143090075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
143190075Sobrien__ch (__bin_args_eq (vector unsigned short, a1, vector unsigned short, a2), \
143290075Sobrien      (vector signed int) __builtin_altivec_vcmpequh_p ((vector signed short) a1, (vector signed short) a2), \
143390075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector unsigned int, a2), \
143490075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
143590075Sobrien__ch (__bin_args_eq (vector signed int, a1, vector signed int, a2), \
143690075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
143790075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector signed int, a2), \
143890075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
143990075Sobrien__ch (__bin_args_eq (vector unsigned int, a1, vector unsigned int, a2), \
144090075Sobrien      (vector signed int) __builtin_altivec_vcmpequw_p ((vector signed int) a1, (vector signed int) a2), \
144190075Sobrien__ch (__bin_args_eq (vector float, a1, vector float, a2), \
144290075Sobrien      (vector signed int) __builtin_altivec_vcmpeqfp_p ((vector float) a1, (vector float) a2), \
144390075Sobrien    __altivec_link_error_invalid_argument ())))))))))))))
144490075Sobrien
144590075Sobrien#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)
144690075Sobrien
144790075Sobrien#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)
144890075Sobrien
144990075Sobrien#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (a1, a2)
145090075Sobrien
145190075Sobrien#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (a1, a2)
145290075Sobrien
145390075Sobrien#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (a1)
145490075Sobrien
145590075Sobrien#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (a1, a2)
145690075Sobrien
145790075Sobrien#endif /* __cplusplus */
145890075Sobrien
145990075Sobrien#endif /* _ALTIVEC_H */
1460