altivec.h revision 169689
1306196Sjkim/* PowerPC AltiVec include file.
296593Smarkm   Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
396593Smarkm   Contributed by Aldy Hernandez (aldyh@redhat.com).
4142429Snectar   Rewritten by Paolo Bonzini (bonzini@gnu.org).
596593Smarkm
696593Smarkm   This file is part of GCC.
796593Smarkm
896593Smarkm   GCC is free software; you can redistribute it and/or modify it
996593Smarkm   under the terms of the GNU General Public License as published
1096593Smarkm   by the Free Software Foundation; either version 2, or (at your
1196593Smarkm   option) any later version.
1296593Smarkm
1396593Smarkm   GCC is distributed in the hope that it will be useful, but WITHOUT
1496593Smarkm   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
1596593Smarkm   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
1696593Smarkm   License for more details.
1796593Smarkm
1896593Smarkm   You should have received a copy of the GNU General Public License
1996593Smarkm   along with GCC; see the file COPYING.  If not, write to the
20215698Ssimon   Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21215698Ssimon   MA 02110-1301, USA.  */
22215698Ssimon
23215698Ssimon/* As a special exception, if you include this header file into source
24215698Ssimon   files compiled by GCC, this header file does not by itself cause
2596593Smarkm   the resulting executable to be covered by the GNU General Public
2696593Smarkm   License.  This exception does not however invalidate any other
2796593Smarkm   reasons why the executable file might be covered by the GNU General
2896593Smarkm   Public License.  */
2996593Smarkm
3096593Smarkm/* Implemented to conform to the specification included in the AltiVec
3196593Smarkm   Technology Programming Interface Manual (ALTIVECPIM/D 6/1999 Rev 0).  */
3296593Smarkm
3396593Smarkm#ifndef _ALTIVEC_H
3496593Smarkm#define _ALTIVEC_H 1
3596593Smarkm
3696593Smarkm#if !defined(__VEC__) || !defined(__ALTIVEC__)
3796593Smarkm#error Use the "-maltivec" flag to enable PowerPC AltiVec support
3896593Smarkm#endif
3996593Smarkm
4096593Smarkm/* If __APPLE_ALTIVEC__ is defined, the compiler supports 'vector',
41276864Sjkim   'pixel' and 'bool' as context-sensitive AltiVec keywords (in
42276864Sjkim   non-AltiVec contexts, they revert to their original meanings,
4396593Smarkm   if any), so we do not need to define them as macros.  */
4496593Smarkm
45215698Ssimon#if !defined(__APPLE_ALTIVEC__)
46215698Ssimon/* You are allowed to undef these for C++ compatibility.  */
47215698Ssimon#define vector __vector
48215698Ssimon#define pixel __pixel
49142429Snectar#define bool __bool
50215698Ssimon#endif
51142429Snectar
52142429Snectar/* Condition register codes for AltiVec predicates. */
53276864Sjkim
54276864Sjkim#define __CR6_EQ		0
55276864Sjkim#define __CR6_EQ_REV		1
5696593Smarkm#define __CR6_LT		2
57276864Sjkim#define __CR6_LT_REV		3
58276864Sjkim
59276864Sjkim/* Synonyms.  */
60276864Sjkim#define vec_vaddcuw vec_addc
61276864Sjkim#define vec_vand vec_and
62276864Sjkim#define vec_vandc vec_andc
63215698Ssimon#define vec_vrfip vec_ceil
64276864Sjkim#define vec_vcmpbfp vec_cmpb
65276864Sjkim#define vec_vcmpgefp vec_cmpge
66276864Sjkim#define vec_vctsxs vec_cts
67276864Sjkim#define vec_vctuxs vec_ctu
68276864Sjkim#define vec_vexptefp vec_expte
69215698Ssimon#define vec_vrfim vec_floor
70276864Sjkim#define vec_lvx vec_ld
7196593Smarkm#define vec_lvxl vec_ldl
7296593Smarkm#define vec_vlogefp vec_loge
7396593Smarkm#define vec_vmaddfp vec_madd
7496593Smarkm#define vec_vmhaddshs vec_madds
7596593Smarkm#define vec_vmladduhm vec_mladd
7696593Smarkm#define vec_vmhraddshs vec_mradds
7796593Smarkm#define vec_vnmsubfp vec_nmsub
7896593Smarkm#define vec_vnor vec_nor
7996593Smarkm#define vec_vor vec_or
8096593Smarkm#define vec_vpkpx vec_packpx
8196593Smarkm#define vec_vperm vec_perm
8296593Smarkm#define vec_vrefp vec_re
8396593Smarkm#define vec_vrfin vec_round
8496593Smarkm#define vec_vrsqrtefp vec_rsqrte
8596593Smarkm#define vec_vsel vec_sel
8696593Smarkm#define vec_vsldoi vec_sld
8796593Smarkm#define vec_vsl vec_sll
8896593Smarkm#define vec_vslo vec_slo
8996593Smarkm#define vec_vspltisb vec_splat_s8
9096593Smarkm#define vec_vspltish vec_splat_s16
9196593Smarkm#define vec_vspltisw vec_splat_s32
9296593Smarkm#define vec_vsr vec_srl
9396593Smarkm#define vec_vsro vec_sro
9496593Smarkm#define vec_stvx vec_st
9596593Smarkm#define vec_stvxl vec_stl
9696593Smarkm#define vec_vsubcuw vec_subc
9796593Smarkm#define vec_vsum2sws vec_sum2s
9896593Smarkm#define vec_vsumsws vec_sums
9996593Smarkm#define vec_vrfiz vec_trunc
10096593Smarkm#define vec_vxor vec_xor
10196593Smarkm
10296593Smarkm/* Functions that are resolved by the backend to one of the
10396593Smarkm   typed builtins.  */
10496593Smarkm#define vec_vaddfp __builtin_vec_vaddfp
10596593Smarkm#define vec_addc __builtin_vec_addc
10696593Smarkm#define vec_vaddsws __builtin_vec_vaddsws
10796593Smarkm#define vec_vaddshs __builtin_vec_vaddshs
10896593Smarkm#define vec_vaddsbs __builtin_vec_vaddsbs
10996593Smarkm#define vec_vavgsw __builtin_vec_vavgsw
11096593Smarkm#define vec_vavguw __builtin_vec_vavguw
11196593Smarkm#define vec_vavgsh __builtin_vec_vavgsh
11296593Smarkm#define vec_vavguh __builtin_vec_vavguh
11396593Smarkm#define vec_vavgsb __builtin_vec_vavgsb
11496593Smarkm#define vec_vavgub __builtin_vec_vavgub
11596593Smarkm#define vec_ceil __builtin_vec_ceil
11696593Smarkm#define vec_cmpb __builtin_vec_cmpb
11796593Smarkm#define vec_vcmpeqfp __builtin_vec_vcmpeqfp
11896593Smarkm#define vec_cmpge __builtin_vec_cmpge
11996593Smarkm#define vec_vcmpgtfp __builtin_vec_vcmpgtfp
12096593Smarkm#define vec_vcmpgtsw __builtin_vec_vcmpgtsw
12196593Smarkm#define vec_vcmpgtuw __builtin_vec_vcmpgtuw
12296593Smarkm#define vec_vcmpgtsh __builtin_vec_vcmpgtsh
12396593Smarkm#define vec_vcmpgtuh __builtin_vec_vcmpgtuh
12496593Smarkm#define vec_vcmpgtsb __builtin_vec_vcmpgtsb
12596593Smarkm#define vec_vcmpgtub __builtin_vec_vcmpgtub
12696593Smarkm#define vec_vcfsx __builtin_vec_vcfsx
12796593Smarkm#define vec_vcfux __builtin_vec_vcfux
12896593Smarkm#define vec_cts __builtin_vec_cts
12996593Smarkm#define vec_ctu __builtin_vec_ctu
13096593Smarkm#define vec_expte __builtin_vec_expte
13196593Smarkm#define vec_floor __builtin_vec_floor
13296593Smarkm#define vec_loge __builtin_vec_loge
133142429Snectar#define vec_madd __builtin_vec_madd
13496593Smarkm#define vec_madds __builtin_vec_madds
135100946Snectar#define vec_mtvscr __builtin_vec_mtvscr
136306196Sjkim#define vec_vmaxfp __builtin_vec_vmaxfp
137215698Ssimon#define vec_vmaxsw __builtin_vec_vmaxsw
138215698Ssimon#define vec_vmaxsh __builtin_vec_vmaxsh
139215698Ssimon#define vec_vmaxsb __builtin_vec_vmaxsb
140215698Ssimon#define vec_vminfp __builtin_vec_vminfp
14196593Smarkm#define vec_vminsw __builtin_vec_vminsw
142142429Snectar#define vec_vminsh __builtin_vec_vminsh
14396593Smarkm#define vec_vminsb __builtin_vec_vminsb
14496593Smarkm#define vec_mradds __builtin_vec_mradds
14596593Smarkm#define vec_vmsumshm __builtin_vec_vmsumshm
14696593Smarkm#define vec_vmsumuhm __builtin_vec_vmsumuhm
147215698Ssimon#define vec_vmsummbm __builtin_vec_vmsummbm
14896593Smarkm#define vec_vmsumubm __builtin_vec_vmsumubm
149215698Ssimon#define vec_vmsumshs __builtin_vec_vmsumshs
15096593Smarkm#define vec_vmsumuhs __builtin_vec_vmsumuhs
15196593Smarkm#define vec_vmulesb __builtin_vec_vmulesb
15296593Smarkm#define vec_vmulesh __builtin_vec_vmulesh
15396593Smarkm#define vec_vmuleuh __builtin_vec_vmuleuh
154110010Smarkm#define vec_vmuleub __builtin_vec_vmuleub
155110010Smarkm#define vec_vmulosh __builtin_vec_vmulosh
15696593Smarkm#define vec_vmulouh __builtin_vec_vmulouh
15796593Smarkm#define vec_vmulosb __builtin_vec_vmulosb
15896593Smarkm#define vec_vmuloub __builtin_vec_vmuloub
15996593Smarkm#define vec_nmsub __builtin_vec_nmsub
16096593Smarkm#define vec_packpx __builtin_vec_packpx
16196593Smarkm#define vec_vpkswss __builtin_vec_vpkswss
162142429Snectar#define vec_vpkuwus __builtin_vec_vpkuwus
16396593Smarkm#define vec_vpkshss __builtin_vec_vpkshss
16496593Smarkm#define vec_vpkuhus __builtin_vec_vpkuhus
16596593Smarkm#define vec_vpkswus __builtin_vec_vpkswus
16696593Smarkm#define vec_vpkshus __builtin_vec_vpkshus
16796593Smarkm#define vec_re __builtin_vec_re
168142429Snectar#define vec_round __builtin_vec_round
169142429Snectar#define vec_rsqrte __builtin_vec_rsqrte
170142429Snectar#define vec_vsubfp __builtin_vec_vsubfp
17196593Smarkm#define vec_subc __builtin_vec_subc
17296593Smarkm#define vec_vsubsws __builtin_vec_vsubsws
17396593Smarkm#define vec_vsubshs __builtin_vec_vsubshs
174#define vec_vsubsbs __builtin_vec_vsubsbs
175#define vec_sum4s __builtin_vec_sum4s
176#define vec_vsum4shs __builtin_vec_vsum4shs
177#define vec_vsum4sbs __builtin_vec_vsum4sbs
178#define vec_vsum4ubs __builtin_vec_vsum4ubs
179#define vec_sum2s __builtin_vec_sum2s
180#define vec_sums __builtin_vec_sums
181#define vec_trunc __builtin_vec_trunc
182#define vec_vupkhpx __builtin_vec_vupkhpx
183#define vec_vupkhsh __builtin_vec_vupkhsh
184#define vec_vupkhsb __builtin_vec_vupkhsb
185#define vec_vupklpx __builtin_vec_vupklpx
186#define vec_vupklsh __builtin_vec_vupklsh
187#define vec_vupklsb __builtin_vec_vupklsb
188#define vec_abs __builtin_vec_abs
189#define vec_abss __builtin_vec_abss
190#define vec_add __builtin_vec_add
191#define vec_adds __builtin_vec_adds
192#define vec_and __builtin_vec_and
193#define vec_andc __builtin_vec_andc
194#define vec_avg __builtin_vec_avg
195#define vec_cmpeq __builtin_vec_cmpeq
196#define vec_cmpgt __builtin_vec_cmpgt
197#define vec_ctf __builtin_vec_ctf
198#define vec_dst __builtin_vec_dst
199#define vec_dstst __builtin_vec_dstst
200#define vec_dststt __builtin_vec_dststt
201#define vec_dstt __builtin_vec_dstt
202#define vec_ld __builtin_vec_ld
203#define vec_lde __builtin_vec_lde
204#define vec_ldl __builtin_vec_ldl
205#define vec_lvebx __builtin_vec_lvebx
206#define vec_lvehx __builtin_vec_lvehx
207#define vec_lvewx __builtin_vec_lvewx
208#define vec_lvsl __builtin_vec_lvsl
209#define vec_lvsr __builtin_vec_lvsr
210#define vec_max __builtin_vec_max
211#define vec_mergeh __builtin_vec_mergeh
212#define vec_mergel __builtin_vec_mergel
213#define vec_min __builtin_vec_min
214#define vec_mladd __builtin_vec_mladd
215#define vec_msum __builtin_vec_msum
216#define vec_msums __builtin_vec_msums
217#define vec_mule __builtin_vec_mule
218#define vec_mulo __builtin_vec_mulo
219#define vec_nor __builtin_vec_nor
220#define vec_or __builtin_vec_or
221#define vec_pack __builtin_vec_pack
222#define vec_packs __builtin_vec_packs
223#define vec_packsu __builtin_vec_packsu
224#define vec_perm __builtin_vec_perm
225#define vec_rl __builtin_vec_rl
226#define vec_sel __builtin_vec_sel
227#define vec_sl __builtin_vec_sl
228#define vec_sld __builtin_vec_sld
229#define vec_sll __builtin_vec_sll
230#define vec_slo __builtin_vec_slo
231#define vec_splat __builtin_vec_splat
232#define vec_sr __builtin_vec_sr
233#define vec_sra __builtin_vec_sra
234#define vec_srl __builtin_vec_srl
235#define vec_sro __builtin_vec_sro
236#define vec_st __builtin_vec_st
237#define vec_ste __builtin_vec_ste
238#define vec_stl __builtin_vec_stl
239#define vec_stvebx __builtin_vec_stvebx
240#define vec_stvehx __builtin_vec_stvehx
241#define vec_stvewx __builtin_vec_stvewx
242#define vec_sub __builtin_vec_sub
243#define vec_subs __builtin_vec_subs
244#define vec_sum __builtin_vec_sum
245#define vec_unpackh __builtin_vec_unpackh
246#define vec_unpackl __builtin_vec_unpackl
247#define vec_vaddubm __builtin_vec_vaddubm
248#define vec_vaddubs __builtin_vec_vaddubs
249#define vec_vadduhm __builtin_vec_vadduhm
250#define vec_vadduhs __builtin_vec_vadduhs
251#define vec_vadduwm __builtin_vec_vadduwm
252#define vec_vadduws __builtin_vec_vadduws
253#define vec_vcmpequb __builtin_vec_vcmpequb
254#define vec_vcmpequh __builtin_vec_vcmpequh
255#define vec_vcmpequw __builtin_vec_vcmpequw
256#define vec_vmaxub __builtin_vec_vmaxub
257#define vec_vmaxuh __builtin_vec_vmaxuh
258#define vec_vmaxuw __builtin_vec_vmaxuw
259#define vec_vminub __builtin_vec_vminub
260#define vec_vminuh __builtin_vec_vminuh
261#define vec_vminuw __builtin_vec_vminuw
262#define vec_vmrghb __builtin_vec_vmrghb
263#define vec_vmrghh __builtin_vec_vmrghh
264#define vec_vmrghw __builtin_vec_vmrghw
265#define vec_vmrglb __builtin_vec_vmrglb
266#define vec_vmrglh __builtin_vec_vmrglh
267#define vec_vmrglw __builtin_vec_vmrglw
268#define vec_vpkuhum __builtin_vec_vpkuhum
269#define vec_vpkuwum __builtin_vec_vpkuwum
270#define vec_vrlb __builtin_vec_vrlb
271#define vec_vrlh __builtin_vec_vrlh
272#define vec_vrlw __builtin_vec_vrlw
273#define vec_vslb __builtin_vec_vslb
274#define vec_vslh __builtin_vec_vslh
275#define vec_vslw __builtin_vec_vslw
276#define vec_vspltb __builtin_vec_vspltb
277#define vec_vsplth __builtin_vec_vsplth
278#define vec_vspltw __builtin_vec_vspltw
279#define vec_vsrab __builtin_vec_vsrab
280#define vec_vsrah __builtin_vec_vsrah
281#define vec_vsraw __builtin_vec_vsraw
282#define vec_vsrb __builtin_vec_vsrb
283#define vec_vsrh __builtin_vec_vsrh
284#define vec_vsrw __builtin_vec_vsrw
285#define vec_vsububs __builtin_vec_vsububs
286#define vec_vsububm __builtin_vec_vsububm
287#define vec_vsubuhm __builtin_vec_vsubuhm
288#define vec_vsubuhs __builtin_vec_vsubuhs
289#define vec_vsubuwm __builtin_vec_vsubuwm
290#define vec_vsubuws __builtin_vec_vsubuws
291#define vec_xor __builtin_vec_xor
292
293/* Predicates.
294   For C++, we use templates in order to allow non-parenthesized arguments.
295   For C, instead, we use macros since non-parenthesized arguments were
296   not allowed even in older GCC implementation of AltiVec.
297
298   In the future, we may add more magic to the back-end, so that no
299   one- or two-argument macros are used.  */
300
301#ifdef __cplusplus__
302#define __altivec_unary_pred(NAME, CALL) \
303template <class T> int NAME (T a1) { return CALL; }
304
305#define __altivec_scalar_pred(NAME, CALL) \
306template <class T, class U> int NAME (T a1, U a2) { return CALL; }
307
308/* Given the vec_step of a type, return the corresponding bool type.  */
309template <int STEP> class __altivec_bool_ret { };
310template <> class __altivec_bool_ret <4> {
311  typedef __vector __bool int __ret;
312};
313template <> class __altivec_bool_ret <8> {
314  typedef __vector __bool short __ret;
315};
316template <> class __altivec_bool_ret <16> {
317  typedef __vector __bool char __ret;
318};
319
320/* Be very liberal in the pairs we accept.  Mistakes such as passing
321   a `vector char' and `vector short' will be caught by the middle-end,
322   while any attempt to detect them here would produce hard to understand
323   error messages involving the implementation details of AltiVec.  */
324#define __altivec_binary_pred(NAME, CALL) \
325template <class T, class U> \
326typename __altivec_bool_ret <vec_step (T)>::__ret \
327NAME (T a1, U a2) \
328{ \
329  return CALL; \
330}
331
332__altivec_binary_pred(vec_cmplt,
333  __builtin_vec_cmpgt (a2, a1))
334__altivec_binary_pred(vec_cmple,
335  __builtin_altivec_cmpge (a2, a1))
336
337__altivec_scalar_pred(vec_all_in,
338  __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2))
339__altivec_scalar_pred(vec_any_out,
340  __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2))
341
342__altivec_unary_pred(vec_all_nan,
343  __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a1))
344__altivec_unary_pred(vec_any_nan,
345  __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a1))
346
347__altivec_unary_pred(vec_all_numeric,
348  __builtin_altivec_vcmpeqfp_p (__CR6_LT, a1, a1))
349__altivec_unary_pred(vec_any_numeric,
350  __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, a1, a1))
351
352__altivec_scalar_pred(vec_all_eq,
353  __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2))
354__altivec_scalar_pred(vec_all_ne,
355  __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2))
356__altivec_scalar_pred(vec_any_eq,
357  __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2))
358__altivec_scalar_pred(vec_any_ne,
359  __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2))
360
361__altivec_scalar_pred(vec_all_gt,
362  __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2))
363__altivec_scalar_pred(vec_all_lt,
364  __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1))
365__altivec_scalar_pred(vec_any_gt,
366  __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2))
367__altivec_scalar_pred(vec_any_lt,
368  __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1))
369
370__altivec_scalar_pred(vec_all_ngt,
371  __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a1, a2))
372__altivec_scalar_pred(vec_all_nlt,
373  __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a2, a1))
374__altivec_scalar_pred(vec_any_ngt,
375  __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a1, a2))
376__altivec_scalar_pred(vec_any_nlt,
377  __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a2, a1))
378
379/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
380   while for integer types it is converted to __builtin_vec_vcmpgt_p,
381   with inverted args and condition code.  */
382__altivec_scalar_pred(vec_all_le,
383  __builtin_vec_vcmpge_p (__CR6_LT, a2, a1))
384__altivec_scalar_pred(vec_all_ge,
385  __builtin_vec_vcmpge_p (__CR6_LT, a1, a2))
386__altivec_scalar_pred(vec_any_le,
387  __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1))
388__altivec_scalar_pred(vec_any_ge,
389  __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2))
390
391__altivec_scalar_pred(vec_all_nge,
392  __builtin_altivec_vcmpgefp_p (__CR6_EQ, a1, a2))
393__altivec_scalar_pred(vec_all_nle,
394  __builtin_altivec_vcmpgefp_p (__CR6_EQ, a2, a1))
395__altivec_scalar_pred(vec_any_nge,
396  __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a1, a2))
397__altivec_scalar_pred(vec_any_nle,
398  __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a2, a1))
399
400#undef __altivec_scalar_pred
401#undef __altivec_unary_pred
402#undef __altivec_binary_pred
403#else
404#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1))
405#define vec_cmple(a1, a2) __builtin_altivec_vcmpgefp ((a2), (a1))
406
407#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2))
408#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2))
409
410#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (a1), (a1))
411#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, (a1), (a1))
412
413#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT, (a1), (a1))
414#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, (a1), (a1))
415
416#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2))
417#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2))
418#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2))
419#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2))
420
421#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2))
422#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1))
423#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2))
424#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1))
425
426#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a1), (a2))
427#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a2), (a1))
428#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a1), (a2))
429#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a2), (a1))
430
431/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
432   while for integer types it is converted to __builtin_vec_vcmpgt_p,
433   with inverted args and condition code.  */
434#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1))
435#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2))
436#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1))
437#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2))
438
439#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a1), (a2))
440#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a2), (a1))
441#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a1), (a2))
442#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a2), (a1))
443#endif
444
445/* These do not accept vectors, so they do not have a __builtin_vec_*
446   counterpart.  */
447#define vec_dss(x) __builtin_altivec_dss((x))
448#define vec_dssall() __builtin_altivec_dssall ()
449#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ())
450#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x))
451#define vec_splat_s16(x) __builtin_altivec_vspltish ((x))
452#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x))
453#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x)))
454#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x)))
455#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x)))
456
457/* This also accepts a type for its parameter, so it is not enough
458   to #define vec_step to __builtin_vec_step.  */
459#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0)
460
461#endif /* _ALTIVEC_H */
462