190075Sobrien/* PowerPC AltiVec include file.
2169689Skan   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
390075Sobrien   Contributed by Aldy Hernandez (aldyh@redhat.com).
4169689Skan   Rewritten by Paolo Bonzini (bonzini@gnu.org).
590075Sobrien
6132718Skan   This file is part of GCC.
790075Sobrien
8132718Skan   GCC is free software; you can redistribute it and/or modify it
9132718Skan   under the terms of the GNU General Public License as published
10132718Skan   by the Free Software Foundation; either version 2, or (at your
11132718Skan   option) any later version.
1290075Sobrien
13132718Skan   GCC is distributed in the hope that it will be useful, but WITHOUT
14132718Skan   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15132718Skan   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
16132718Skan   License for more details.
1790075Sobrien
18132718Skan   You should have received a copy of the GNU General Public License
19132718Skan   along with GCC; see the file COPYING.  If not, write to the
20169689Skan   Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21169689Skan   MA 02110-1301, USA.  */
2290075Sobrien
2390075Sobrien/* As a special exception, if you include this header file into source
2490075Sobrien   files compiled by GCC, this header file does not by itself cause
2590075Sobrien   the resulting executable to be covered by the GNU General Public
2690075Sobrien   License.  This exception does not however invalidate any other
2790075Sobrien   reasons why the executable file might be covered by the GNU General
2890075Sobrien   Public License.  */
2990075Sobrien
3090075Sobrien/* Implemented to conform to the specification included in the AltiVec
3190075Sobrien   Technology Programming Interface Manual (ALTIVECPIM/D 6/1999 Rev 0).  */
3290075Sobrien
3390075Sobrien#ifndef _ALTIVEC_H
3490075Sobrien#define _ALTIVEC_H 1
3590075Sobrien
36146895Skan#if !defined(__VEC__) || !defined(__ALTIVEC__)
37146895Skan#error Use the "-maltivec" flag to enable PowerPC AltiVec support
3896263Sobrien#endif
3990075Sobrien
40146895Skan/* If __APPLE_ALTIVEC__ is defined, the compiler supports 'vector',
41146895Skan   'pixel' and 'bool' as context-sensitive AltiVec keywords (in
42146895Skan   non-AltiVec contexts, they revert to their original meanings,
43146895Skan   if any), so we do not need to define them as macros.  */
4490075Sobrien
45146895Skan#if !defined(__APPLE_ALTIVEC__)
46146895Skan/* You are allowed to undef these for C++ compatibility.  */
4790075Sobrien#define vector __vector
48146895Skan#define pixel __pixel
49146895Skan#define bool __bool
50146895Skan#endif
5190075Sobrien
52146895Skan/* Condition register codes for AltiVec predicates. */
5396263Sobrien
5496263Sobrien#define __CR6_EQ		0
5596263Sobrien#define __CR6_EQ_REV		1
5696263Sobrien#define __CR6_LT		2
5796263Sobrien#define __CR6_LT_REV		3
5896263Sobrien
59169689Skan/* Synonyms.  */
6096263Sobrien#define vec_vaddcuw vec_addc
6196263Sobrien#define vec_vand vec_and
6296263Sobrien#define vec_vandc vec_andc
6396263Sobrien#define vec_vrfip vec_ceil
6496263Sobrien#define vec_vcmpbfp vec_cmpb
6596263Sobrien#define vec_vcmpgefp vec_cmpge
6696263Sobrien#define vec_vctsxs vec_cts
6796263Sobrien#define vec_vctuxs vec_ctu
6896263Sobrien#define vec_vexptefp vec_expte
6996263Sobrien#define vec_vrfim vec_floor
7096263Sobrien#define vec_lvx vec_ld
7196263Sobrien#define vec_lvxl vec_ldl
7296263Sobrien#define vec_vlogefp vec_loge
7396263Sobrien#define vec_vmaddfp vec_madd
7496263Sobrien#define vec_vmhaddshs vec_madds
7596263Sobrien#define vec_vmladduhm vec_mladd
7696263Sobrien#define vec_vmhraddshs vec_mradds
7796263Sobrien#define vec_vnmsubfp vec_nmsub
7896263Sobrien#define vec_vnor vec_nor
7996263Sobrien#define vec_vor vec_or
8096263Sobrien#define vec_vpkpx vec_packpx
8196263Sobrien#define vec_vperm vec_perm
8296263Sobrien#define vec_vrefp vec_re
8396263Sobrien#define vec_vrfin vec_round
8496263Sobrien#define vec_vrsqrtefp vec_rsqrte
8596263Sobrien#define vec_vsel vec_sel
8696263Sobrien#define vec_vsldoi vec_sld
8796263Sobrien#define vec_vsl vec_sll
8896263Sobrien#define vec_vslo vec_slo
8996263Sobrien#define vec_vspltisb vec_splat_s8
9096263Sobrien#define vec_vspltish vec_splat_s16
9196263Sobrien#define vec_vspltisw vec_splat_s32
9296263Sobrien#define vec_vsr vec_srl
9396263Sobrien#define vec_vsro vec_sro
9496263Sobrien#define vec_stvx vec_st
9596263Sobrien#define vec_stvxl vec_stl
9696263Sobrien#define vec_vsubcuw vec_subc
9796263Sobrien#define vec_vsum2sws vec_sum2s
9896263Sobrien#define vec_vsumsws vec_sums
9996263Sobrien#define vec_vrfiz vec_trunc
10096263Sobrien#define vec_vxor vec_xor
10196263Sobrien
102169689Skan/* Functions that are resolved by the backend to one of the
103169689Skan   typed builtins.  */
104169689Skan#define vec_vaddfp __builtin_vec_vaddfp
105169689Skan#define vec_addc __builtin_vec_addc
106169689Skan#define vec_vaddsws __builtin_vec_vaddsws
107169689Skan#define vec_vaddshs __builtin_vec_vaddshs
108169689Skan#define vec_vaddsbs __builtin_vec_vaddsbs
109169689Skan#define vec_vavgsw __builtin_vec_vavgsw
110169689Skan#define vec_vavguw __builtin_vec_vavguw
111169689Skan#define vec_vavgsh __builtin_vec_vavgsh
112169689Skan#define vec_vavguh __builtin_vec_vavguh
113169689Skan#define vec_vavgsb __builtin_vec_vavgsb
114169689Skan#define vec_vavgub __builtin_vec_vavgub
115169689Skan#define vec_ceil __builtin_vec_ceil
116169689Skan#define vec_cmpb __builtin_vec_cmpb
117169689Skan#define vec_vcmpeqfp __builtin_vec_vcmpeqfp
118169689Skan#define vec_cmpge __builtin_vec_cmpge
119169689Skan#define vec_vcmpgtfp __builtin_vec_vcmpgtfp
120169689Skan#define vec_vcmpgtsw __builtin_vec_vcmpgtsw
121169689Skan#define vec_vcmpgtuw __builtin_vec_vcmpgtuw
122169689Skan#define vec_vcmpgtsh __builtin_vec_vcmpgtsh
123169689Skan#define vec_vcmpgtuh __builtin_vec_vcmpgtuh
124169689Skan#define vec_vcmpgtsb __builtin_vec_vcmpgtsb
125169689Skan#define vec_vcmpgtub __builtin_vec_vcmpgtub
126169689Skan#define vec_vcfsx __builtin_vec_vcfsx
127169689Skan#define vec_vcfux __builtin_vec_vcfux
128169689Skan#define vec_cts __builtin_vec_cts
129169689Skan#define vec_ctu __builtin_vec_ctu
130169689Skan#define vec_expte __builtin_vec_expte
131169689Skan#define vec_floor __builtin_vec_floor
132169689Skan#define vec_loge __builtin_vec_loge
133169689Skan#define vec_madd __builtin_vec_madd
134169689Skan#define vec_madds __builtin_vec_madds
135169689Skan#define vec_mtvscr __builtin_vec_mtvscr
136169689Skan#define vec_vmaxfp __builtin_vec_vmaxfp
137169689Skan#define vec_vmaxsw __builtin_vec_vmaxsw
138169689Skan#define vec_vmaxsh __builtin_vec_vmaxsh
139169689Skan#define vec_vmaxsb __builtin_vec_vmaxsb
140169689Skan#define vec_vminfp __builtin_vec_vminfp
141169689Skan#define vec_vminsw __builtin_vec_vminsw
142169689Skan#define vec_vminsh __builtin_vec_vminsh
143169689Skan#define vec_vminsb __builtin_vec_vminsb
144169689Skan#define vec_mradds __builtin_vec_mradds
145169689Skan#define vec_vmsumshm __builtin_vec_vmsumshm
146169689Skan#define vec_vmsumuhm __builtin_vec_vmsumuhm
147169689Skan#define vec_vmsummbm __builtin_vec_vmsummbm
148169689Skan#define vec_vmsumubm __builtin_vec_vmsumubm
149169689Skan#define vec_vmsumshs __builtin_vec_vmsumshs
150169689Skan#define vec_vmsumuhs __builtin_vec_vmsumuhs
151169689Skan#define vec_vmulesb __builtin_vec_vmulesb
152169689Skan#define vec_vmulesh __builtin_vec_vmulesh
153169689Skan#define vec_vmuleuh __builtin_vec_vmuleuh
154169689Skan#define vec_vmuleub __builtin_vec_vmuleub
155169689Skan#define vec_vmulosh __builtin_vec_vmulosh
156169689Skan#define vec_vmulouh __builtin_vec_vmulouh
157169689Skan#define vec_vmulosb __builtin_vec_vmulosb
158169689Skan#define vec_vmuloub __builtin_vec_vmuloub
159169689Skan#define vec_nmsub __builtin_vec_nmsub
160169689Skan#define vec_packpx __builtin_vec_packpx
161169689Skan#define vec_vpkswss __builtin_vec_vpkswss
162169689Skan#define vec_vpkuwus __builtin_vec_vpkuwus
163169689Skan#define vec_vpkshss __builtin_vec_vpkshss
164169689Skan#define vec_vpkuhus __builtin_vec_vpkuhus
165169689Skan#define vec_vpkswus __builtin_vec_vpkswus
166169689Skan#define vec_vpkshus __builtin_vec_vpkshus
167169689Skan#define vec_re __builtin_vec_re
168169689Skan#define vec_round __builtin_vec_round
169169689Skan#define vec_rsqrte __builtin_vec_rsqrte
170169689Skan#define vec_vsubfp __builtin_vec_vsubfp
171169689Skan#define vec_subc __builtin_vec_subc
172169689Skan#define vec_vsubsws __builtin_vec_vsubsws
173169689Skan#define vec_vsubshs __builtin_vec_vsubshs
174169689Skan#define vec_vsubsbs __builtin_vec_vsubsbs
175169689Skan#define vec_sum4s __builtin_vec_sum4s
176169689Skan#define vec_vsum4shs __builtin_vec_vsum4shs
177169689Skan#define vec_vsum4sbs __builtin_vec_vsum4sbs
178169689Skan#define vec_vsum4ubs __builtin_vec_vsum4ubs
179169689Skan#define vec_sum2s __builtin_vec_sum2s
180169689Skan#define vec_sums __builtin_vec_sums
181169689Skan#define vec_trunc __builtin_vec_trunc
182169689Skan#define vec_vupkhpx __builtin_vec_vupkhpx
183169689Skan#define vec_vupkhsh __builtin_vec_vupkhsh
184169689Skan#define vec_vupkhsb __builtin_vec_vupkhsb
185169689Skan#define vec_vupklpx __builtin_vec_vupklpx
186169689Skan#define vec_vupklsh __builtin_vec_vupklsh
187169689Skan#define vec_vupklsb __builtin_vec_vupklsb
188169689Skan#define vec_abs __builtin_vec_abs
189169689Skan#define vec_abss __builtin_vec_abss
190169689Skan#define vec_add __builtin_vec_add
191169689Skan#define vec_adds __builtin_vec_adds
192169689Skan#define vec_and __builtin_vec_and
193169689Skan#define vec_andc __builtin_vec_andc
194169689Skan#define vec_avg __builtin_vec_avg
195169689Skan#define vec_cmpeq __builtin_vec_cmpeq
196169689Skan#define vec_cmpgt __builtin_vec_cmpgt
197169689Skan#define vec_ctf __builtin_vec_ctf
198169689Skan#define vec_dst __builtin_vec_dst
199169689Skan#define vec_dstst __builtin_vec_dstst
200169689Skan#define vec_dststt __builtin_vec_dststt
201169689Skan#define vec_dstt __builtin_vec_dstt
202169689Skan#define vec_ld __builtin_vec_ld
203169689Skan#define vec_lde __builtin_vec_lde
204169689Skan#define vec_ldl __builtin_vec_ldl
205169689Skan#define vec_lvebx __builtin_vec_lvebx
206169689Skan#define vec_lvehx __builtin_vec_lvehx
207169689Skan#define vec_lvewx __builtin_vec_lvewx
208169689Skan#define vec_lvsl __builtin_vec_lvsl
209169689Skan#define vec_lvsr __builtin_vec_lvsr
210169689Skan#define vec_max __builtin_vec_max
211169689Skan#define vec_mergeh __builtin_vec_mergeh
212169689Skan#define vec_mergel __builtin_vec_mergel
213169689Skan#define vec_min __builtin_vec_min
214169689Skan#define vec_mladd __builtin_vec_mladd
215169689Skan#define vec_msum __builtin_vec_msum
216169689Skan#define vec_msums __builtin_vec_msums
217169689Skan#define vec_mule __builtin_vec_mule
218169689Skan#define vec_mulo __builtin_vec_mulo
219169689Skan#define vec_nor __builtin_vec_nor
220169689Skan#define vec_or __builtin_vec_or
221169689Skan#define vec_pack __builtin_vec_pack
222169689Skan#define vec_packs __builtin_vec_packs
223169689Skan#define vec_packsu __builtin_vec_packsu
224169689Skan#define vec_perm __builtin_vec_perm
225169689Skan#define vec_rl __builtin_vec_rl
226169689Skan#define vec_sel __builtin_vec_sel
227169689Skan#define vec_sl __builtin_vec_sl
228169689Skan#define vec_sld __builtin_vec_sld
229169689Skan#define vec_sll __builtin_vec_sll
230169689Skan#define vec_slo __builtin_vec_slo
231169689Skan#define vec_splat __builtin_vec_splat
232169689Skan#define vec_sr __builtin_vec_sr
233169689Skan#define vec_sra __builtin_vec_sra
234169689Skan#define vec_srl __builtin_vec_srl
235169689Skan#define vec_sro __builtin_vec_sro
236169689Skan#define vec_st __builtin_vec_st
237169689Skan#define vec_ste __builtin_vec_ste
238169689Skan#define vec_stl __builtin_vec_stl
239169689Skan#define vec_stvebx __builtin_vec_stvebx
240169689Skan#define vec_stvehx __builtin_vec_stvehx
241169689Skan#define vec_stvewx __builtin_vec_stvewx
242169689Skan#define vec_sub __builtin_vec_sub
243169689Skan#define vec_subs __builtin_vec_subs
244169689Skan#define vec_sum __builtin_vec_sum
245169689Skan#define vec_unpackh __builtin_vec_unpackh
246169689Skan#define vec_unpackl __builtin_vec_unpackl
247169689Skan#define vec_vaddubm __builtin_vec_vaddubm
248169689Skan#define vec_vaddubs __builtin_vec_vaddubs
249169689Skan#define vec_vadduhm __builtin_vec_vadduhm
250169689Skan#define vec_vadduhs __builtin_vec_vadduhs
251169689Skan#define vec_vadduwm __builtin_vec_vadduwm
252169689Skan#define vec_vadduws __builtin_vec_vadduws
253169689Skan#define vec_vcmpequb __builtin_vec_vcmpequb
254169689Skan#define vec_vcmpequh __builtin_vec_vcmpequh
255169689Skan#define vec_vcmpequw __builtin_vec_vcmpequw
256169689Skan#define vec_vmaxub __builtin_vec_vmaxub
257169689Skan#define vec_vmaxuh __builtin_vec_vmaxuh
258169689Skan#define vec_vmaxuw __builtin_vec_vmaxuw
259169689Skan#define vec_vminub __builtin_vec_vminub
260169689Skan#define vec_vminuh __builtin_vec_vminuh
261169689Skan#define vec_vminuw __builtin_vec_vminuw
262169689Skan#define vec_vmrghb __builtin_vec_vmrghb
263169689Skan#define vec_vmrghh __builtin_vec_vmrghh
264169689Skan#define vec_vmrghw __builtin_vec_vmrghw
265169689Skan#define vec_vmrglb __builtin_vec_vmrglb
266169689Skan#define vec_vmrglh __builtin_vec_vmrglh
267169689Skan#define vec_vmrglw __builtin_vec_vmrglw
268169689Skan#define vec_vpkuhum __builtin_vec_vpkuhum
269169689Skan#define vec_vpkuwum __builtin_vec_vpkuwum
270169689Skan#define vec_vrlb __builtin_vec_vrlb
271169689Skan#define vec_vrlh __builtin_vec_vrlh
272169689Skan#define vec_vrlw __builtin_vec_vrlw
273169689Skan#define vec_vslb __builtin_vec_vslb
274169689Skan#define vec_vslh __builtin_vec_vslh
275169689Skan#define vec_vslw __builtin_vec_vslw
276169689Skan#define vec_vspltb __builtin_vec_vspltb
277169689Skan#define vec_vsplth __builtin_vec_vsplth
278169689Skan#define vec_vspltw __builtin_vec_vspltw
279169689Skan#define vec_vsrab __builtin_vec_vsrab
280169689Skan#define vec_vsrah __builtin_vec_vsrah
281169689Skan#define vec_vsraw __builtin_vec_vsraw
282169689Skan#define vec_vsrb __builtin_vec_vsrb
283169689Skan#define vec_vsrh __builtin_vec_vsrh
284169689Skan#define vec_vsrw __builtin_vec_vsrw
285169689Skan#define vec_vsububs __builtin_vec_vsububs
286169689Skan#define vec_vsububm __builtin_vec_vsububm
287169689Skan#define vec_vsubuhm __builtin_vec_vsubuhm
288169689Skan#define vec_vsubuhs __builtin_vec_vsubuhs
289169689Skan#define vec_vsubuwm __builtin_vec_vsubuwm
290169689Skan#define vec_vsubuws __builtin_vec_vsubuws
291169689Skan#define vec_xor __builtin_vec_xor
29290075Sobrien
293169689Skan/* Predicates.
294169689Skan   For C++, we use templates in order to allow non-parenthesized arguments.
295169689Skan   For C, instead, we use macros since non-parenthesized arguments were
296169689Skan   not allowed even in older GCC implementation of AltiVec.
297132718Skan
298169689Skan   In the future, we may add more magic to the back-end, so that no
299169689Skan   one- or two-argument macros are used.  */
300102780Skan
301169689Skan#ifdef __cplusplus__
302169689Skan#define __altivec_unary_pred(NAME, CALL) \
303169689Skantemplate <class T> int NAME (T a1) { return CALL; }
304102780Skan
305169689Skan#define __altivec_scalar_pred(NAME, CALL) \
306169689Skantemplate <class T, class U> int NAME (T a1, U a2) { return CALL; }
307102780Skan
308169689Skan/* Given the vec_step of a type, return the corresponding bool type.  */
309169689Skantemplate <int STEP> class __altivec_bool_ret { };
310169689Skantemplate <> class __altivec_bool_ret <4> {
311169689Skan  typedef __vector __bool int __ret;
312146895Skan};
313169689Skantemplate <> class __altivec_bool_ret <8> {
314169689Skan  typedef __vector __bool short __ret;
315146895Skan};
316169689Skantemplate <> class __altivec_bool_ret <16> {
317169689Skan  typedef __vector __bool char __ret;
318146895Skan};
319146895Skan
320169689Skan/* Be very liberal in the pairs we accept.  Mistakes such as passing
321169689Skan   a `vector char' and `vector short' will be caught by the middle-end,
322169689Skan   while any attempt to detect them here would produce hard to understand
323169689Skan   error messages involving the implementation details of AltiVec.  */
324169689Skan#define __altivec_binary_pred(NAME, CALL) \
325169689Skantemplate <class T, class U> \
326169689Skantypename __altivec_bool_ret <vec_step (T)>::__ret \
327169689SkanNAME (T a1, U a2) \
328169689Skan{ \
329169689Skan  return CALL; \
33096263Sobrien}
33196263Sobrien
332169689Skan__altivec_binary_pred(vec_cmplt,
333169689Skan  __builtin_vec_cmpgt (a2, a1))
334169689Skan__altivec_binary_pred(vec_cmple,
335260075Spfg  __builtin_vec_cmpge (a2, a1))
33696263Sobrien
337169689Skan__altivec_scalar_pred(vec_all_in,
338169689Skan  __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2))
339169689Skan__altivec_scalar_pred(vec_any_out,
340169689Skan  __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2))
34196263Sobrien
342169689Skan__altivec_unary_pred(vec_all_nan,
343169689Skan  __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a1))
344169689Skan__altivec_unary_pred(vec_any_nan,
345169689Skan  __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a1))
34696263Sobrien
347169689Skan__altivec_unary_pred(vec_all_numeric,
348169689Skan  __builtin_altivec_vcmpeqfp_p (__CR6_LT, a1, a1))
349169689Skan__altivec_unary_pred(vec_any_numeric,
350169689Skan  __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, a1, a1))
35196263Sobrien
352169689Skan__altivec_scalar_pred(vec_all_eq,
353169689Skan  __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2))
354169689Skan__altivec_scalar_pred(vec_all_ne,
355169689Skan  __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2))
356169689Skan__altivec_scalar_pred(vec_any_eq,
357169689Skan  __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2))
358169689Skan__altivec_scalar_pred(vec_any_ne,
359169689Skan  __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2))
36096263Sobrien
361169689Skan__altivec_scalar_pred(vec_all_gt,
362169689Skan  __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2))
363169689Skan__altivec_scalar_pred(vec_all_lt,
364169689Skan  __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1))
365169689Skan__altivec_scalar_pred(vec_any_gt,
366169689Skan  __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2))
367169689Skan__altivec_scalar_pred(vec_any_lt,
368169689Skan  __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1))
36996263Sobrien
370169689Skan__altivec_scalar_pred(vec_all_ngt,
371169689Skan  __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a1, a2))
372169689Skan__altivec_scalar_pred(vec_all_nlt,
373169689Skan  __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a2, a1))
374169689Skan__altivec_scalar_pred(vec_any_ngt,
375169689Skan  __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a1, a2))
376169689Skan__altivec_scalar_pred(vec_any_nlt,
377169689Skan  __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a2, a1))
37896263Sobrien
379169689Skan/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
380169689Skan   while for integer types it is converted to __builtin_vec_vcmpgt_p,
381169689Skan   with inverted args and condition code.  */
382169689Skan__altivec_scalar_pred(vec_all_le,
383169689Skan  __builtin_vec_vcmpge_p (__CR6_LT, a2, a1))
384169689Skan__altivec_scalar_pred(vec_all_ge,
385169689Skan  __builtin_vec_vcmpge_p (__CR6_LT, a1, a2))
386169689Skan__altivec_scalar_pred(vec_any_le,
387169689Skan  __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1))
388169689Skan__altivec_scalar_pred(vec_any_ge,
389169689Skan  __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2))
39096263Sobrien
391169689Skan__altivec_scalar_pred(vec_all_nge,
392169689Skan  __builtin_altivec_vcmpgefp_p (__CR6_EQ, a1, a2))
393169689Skan__altivec_scalar_pred(vec_all_nle,
394169689Skan  __builtin_altivec_vcmpgefp_p (__CR6_EQ, a2, a1))
395169689Skan__altivec_scalar_pred(vec_any_nge,
396169689Skan  __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a1, a2))
397169689Skan__altivec_scalar_pred(vec_any_nle,
398169689Skan  __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a2, a1))
39996263Sobrien
400169689Skan#undef __altivec_scalar_pred
401169689Skan#undef __altivec_unary_pred
402169689Skan#undef __altivec_binary_pred
403169689Skan#else
404169689Skan#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1))
405260075Spfg#define vec_cmple(a1, a2) __builtin_vec_cmpge ((a2), (a1))
40696263Sobrien
407169689Skan#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2))
408169689Skan#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2))
40996263Sobrien
410169689Skan#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (a1), (a1))
411169689Skan#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, (a1), (a1))
41296263Sobrien
413169689Skan#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT, (a1), (a1))
414169689Skan#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, (a1), (a1))
41596263Sobrien
416169689Skan#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2))
417169689Skan#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2))
418169689Skan#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2))
419169689Skan#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2))
42096263Sobrien
421169689Skan#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2))
422169689Skan#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1))
423169689Skan#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2))
424169689Skan#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1))
42596263Sobrien
426169689Skan#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a1), (a2))
427169689Skan#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a2), (a1))
428169689Skan#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a1), (a2))
429169689Skan#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a2), (a1))
43096263Sobrien
431169689Skan/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
432169689Skan   while for integer types it is converted to __builtin_vec_vcmpgt_p,
433169689Skan   with inverted args and condition code.  */
434169689Skan#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1))
435169689Skan#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2))
436169689Skan#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1))
437169689Skan#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2))
43896263Sobrien
439169689Skan#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a1), (a2))
440169689Skan#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a2), (a1))
441169689Skan#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a1), (a2))
442169689Skan#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a2), (a1))
443169689Skan#endif
44496263Sobrien
445169689Skan/* These do not accept vectors, so they do not have a __builtin_vec_*
446169689Skan   counterpart.  */
447169689Skan#define vec_dss(x) __builtin_altivec_dss((x))
44890075Sobrien#define vec_dssall() __builtin_altivec_dssall ()
449169689Skan#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ())
450169689Skan#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x))
451169689Skan#define vec_splat_s16(x) __builtin_altivec_vspltish ((x))
452169689Skan#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x))
453169689Skan#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x)))
454169689Skan#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x)))
455169689Skan#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x)))
45690075Sobrien
457169689Skan/* This also accepts a type for its parameter, so it is not enough
458169689Skan   to #define vec_step to __builtin_vec_step.  */
459169689Skan#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0)
46090075Sobrien
46190075Sobrien#endif /* _ALTIVEC_H */
462