]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/rs6000/altivec.h
re PR testsuite/39696 (gcc.dg/tree-ssa/ssa-ccp-25.c scan-tree-dump doesn't work on...
[thirdparty/gcc.git] / gcc / config / rs6000 / altivec.h
CommitLineData
5fb4cf24 1/* PowerPC AltiVec include file.
66647d44 2 Copyright (C) 2002, 2003, 2004, 2005, 2008 Free Software Foundation, Inc.
5fb4cf24 3 Contributed by Aldy Hernandez (aldyh@redhat.com).
58646b77 4 Rewritten by Paolo Bonzini (bonzini@gnu.org).
5fb4cf24 5
5de601cf 6 This file is part of GCC.
5fb4cf24 7
5de601cf
NC
8 GCC is free software; you can redistribute it and/or modify it
9 under the terms of the GNU General Public License as published
10 by the Free Software Foundation; either version 2, or (at your
11 option) any later version.
5fb4cf24 12
5de601cf
NC
13 GCC is distributed in the hope that it will be useful, but WITHOUT
14 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
16 License for more details.
5fb4cf24 17
5de601cf
NC
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING. If not, write to the
39d14dda
KC
20 Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston,
21 MA 02110-1301, USA. */
5fb4cf24
AH
22
23/* As a special exception, if you include this header file into source
24 files compiled by GCC, this header file does not by itself cause
25 the resulting executable to be covered by the GNU General Public
26 License. This exception does not however invalidate any other
27 reasons why the executable file might be covered by the GNU General
28 Public License. */
29
30/* Implemented to conform to the specification included in the AltiVec
31 Technology Programming Interface Manual (ALTIVECPIM/D 6/1999 Rev 0). */
32
33#ifndef _ALTIVEC_H
34#define _ALTIVEC_H 1
35
8bb418a3
ZL
36#if !defined(__VEC__) || !defined(__ALTIVEC__)
37#error Use the "-maltivec" flag to enable PowerPC AltiVec support
71a0ab0c 38#endif
5fb4cf24 39
f95d9272
ZL
40/* If __APPLE_ALTIVEC__ is defined, the compiler supports 'vector',
41 'pixel' and 'bool' as context-sensitive AltiVec keywords (in
42 non-AltiVec contexts, they revert to their original meanings,
43 if any), so we do not need to define them as macros. */
44
45#if !defined(__APPLE_ALTIVEC__)
8bb418a3 46/* You are allowed to undef these for C++ compatibility. */
5fb4cf24 47#define vector __vector
8bb418a3
ZL
48#define pixel __pixel
49#define bool __bool
f95d9272 50#endif
5fb4cf24 51
8bb418a3 52/* Condition register codes for AltiVec predicates. */
5fb4cf24 53
ae4b4a02
AH
54#define __CR6_EQ 0
55#define __CR6_EQ_REV 1
56#define __CR6_LT 2
57#define __CR6_LT_REV 3
58
58646b77 59/* Synonyms. */
4287a893
AH
60#define vec_vaddcuw vec_addc
61#define vec_vand vec_and
62#define vec_vandc vec_andc
63#define vec_vrfip vec_ceil
64#define vec_vcmpbfp vec_cmpb
65#define vec_vcmpgefp vec_cmpge
66#define vec_vctsxs vec_cts
67#define vec_vctuxs vec_ctu
68#define vec_vexptefp vec_expte
69#define vec_vrfim vec_floor
70#define vec_lvx vec_ld
71#define vec_lvxl vec_ldl
72#define vec_vlogefp vec_loge
73#define vec_vmaddfp vec_madd
74#define vec_vmhaddshs vec_madds
75#define vec_vmladduhm vec_mladd
76#define vec_vmhraddshs vec_mradds
77#define vec_vnmsubfp vec_nmsub
78#define vec_vnor vec_nor
79#define vec_vor vec_or
80#define vec_vpkpx vec_packpx
81#define vec_vperm vec_perm
82#define vec_vrefp vec_re
83#define vec_vrfin vec_round
84#define vec_vrsqrtefp vec_rsqrte
85#define vec_vsel vec_sel
86#define vec_vsldoi vec_sld
87#define vec_vsl vec_sll
88#define vec_vslo vec_slo
89#define vec_vspltisb vec_splat_s8
90#define vec_vspltish vec_splat_s16
91#define vec_vspltisw vec_splat_s32
92#define vec_vsr vec_srl
93#define vec_vsro vec_sro
94#define vec_stvx vec_st
95#define vec_stvxl vec_stl
96#define vec_vsubcuw vec_subc
97#define vec_vsum2sws vec_sum2s
98#define vec_vsumsws vec_sums
99#define vec_vrfiz vec_trunc
100#define vec_vxor vec_xor
101
58646b77
PB
102/* Functions that are resolved by the backend to one of the
103 typed builtins. */
104#define vec_vaddfp __builtin_vec_vaddfp
105#define vec_addc __builtin_vec_addc
106#define vec_vaddsws __builtin_vec_vaddsws
107#define vec_vaddshs __builtin_vec_vaddshs
108#define vec_vaddsbs __builtin_vec_vaddsbs
109#define vec_vavgsw __builtin_vec_vavgsw
110#define vec_vavguw __builtin_vec_vavguw
111#define vec_vavgsh __builtin_vec_vavgsh
112#define vec_vavguh __builtin_vec_vavguh
113#define vec_vavgsb __builtin_vec_vavgsb
114#define vec_vavgub __builtin_vec_vavgub
115#define vec_ceil __builtin_vec_ceil
116#define vec_cmpb __builtin_vec_cmpb
117#define vec_vcmpeqfp __builtin_vec_vcmpeqfp
118#define vec_cmpge __builtin_vec_cmpge
119#define vec_vcmpgtfp __builtin_vec_vcmpgtfp
120#define vec_vcmpgtsw __builtin_vec_vcmpgtsw
121#define vec_vcmpgtuw __builtin_vec_vcmpgtuw
122#define vec_vcmpgtsh __builtin_vec_vcmpgtsh
123#define vec_vcmpgtuh __builtin_vec_vcmpgtuh
124#define vec_vcmpgtsb __builtin_vec_vcmpgtsb
125#define vec_vcmpgtub __builtin_vec_vcmpgtub
126#define vec_vcfsx __builtin_vec_vcfsx
127#define vec_vcfux __builtin_vec_vcfux
128#define vec_cts __builtin_vec_cts
129#define vec_ctu __builtin_vec_ctu
130#define vec_expte __builtin_vec_expte
131#define vec_floor __builtin_vec_floor
132#define vec_loge __builtin_vec_loge
133#define vec_madd __builtin_vec_madd
134#define vec_madds __builtin_vec_madds
135#define vec_mtvscr __builtin_vec_mtvscr
136#define vec_vmaxfp __builtin_vec_vmaxfp
137#define vec_vmaxsw __builtin_vec_vmaxsw
138#define vec_vmaxsh __builtin_vec_vmaxsh
139#define vec_vmaxsb __builtin_vec_vmaxsb
140#define vec_vminfp __builtin_vec_vminfp
141#define vec_vminsw __builtin_vec_vminsw
142#define vec_vminsh __builtin_vec_vminsh
143#define vec_vminsb __builtin_vec_vminsb
144#define vec_mradds __builtin_vec_mradds
145#define vec_vmsumshm __builtin_vec_vmsumshm
146#define vec_vmsumuhm __builtin_vec_vmsumuhm
147#define vec_vmsummbm __builtin_vec_vmsummbm
148#define vec_vmsumubm __builtin_vec_vmsumubm
149#define vec_vmsumshs __builtin_vec_vmsumshs
150#define vec_vmsumuhs __builtin_vec_vmsumuhs
151#define vec_vmulesb __builtin_vec_vmulesb
152#define vec_vmulesh __builtin_vec_vmulesh
153#define vec_vmuleuh __builtin_vec_vmuleuh
154#define vec_vmuleub __builtin_vec_vmuleub
155#define vec_vmulosh __builtin_vec_vmulosh
156#define vec_vmulouh __builtin_vec_vmulouh
157#define vec_vmulosb __builtin_vec_vmulosb
158#define vec_vmuloub __builtin_vec_vmuloub
159#define vec_nmsub __builtin_vec_nmsub
160#define vec_packpx __builtin_vec_packpx
161#define vec_vpkswss __builtin_vec_vpkswss
162#define vec_vpkuwus __builtin_vec_vpkuwus
163#define vec_vpkshss __builtin_vec_vpkshss
164#define vec_vpkuhus __builtin_vec_vpkuhus
165#define vec_vpkswus __builtin_vec_vpkswus
166#define vec_vpkshus __builtin_vec_vpkshus
167#define vec_re __builtin_vec_re
168#define vec_round __builtin_vec_round
169#define vec_rsqrte __builtin_vec_rsqrte
170#define vec_vsubfp __builtin_vec_vsubfp
171#define vec_subc __builtin_vec_subc
172#define vec_vsubsws __builtin_vec_vsubsws
173#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
0b61703c
AP
208/* Cell only intrinsics. */
209#ifdef __PPU__
210#define vec_lvlx __builtin_vec_lvlx
211#define vec_lvlxl __builtin_vec_lvlxl
212#define vec_lvrx __builtin_vec_lvrx
213#define vec_lvrxl __builtin_vec_lvrxl
214#endif
58646b77
PB
215#define vec_lvsl __builtin_vec_lvsl
216#define vec_lvsr __builtin_vec_lvsr
217#define vec_max __builtin_vec_max
218#define vec_mergeh __builtin_vec_mergeh
219#define vec_mergel __builtin_vec_mergel
220#define vec_min __builtin_vec_min
221#define vec_mladd __builtin_vec_mladd
222#define vec_msum __builtin_vec_msum
223#define vec_msums __builtin_vec_msums
224#define vec_mule __builtin_vec_mule
225#define vec_mulo __builtin_vec_mulo
226#define vec_nor __builtin_vec_nor
227#define vec_or __builtin_vec_or
228#define vec_pack __builtin_vec_pack
229#define vec_packs __builtin_vec_packs
230#define vec_packsu __builtin_vec_packsu
231#define vec_perm __builtin_vec_perm
232#define vec_rl __builtin_vec_rl
233#define vec_sel __builtin_vec_sel
234#define vec_sl __builtin_vec_sl
235#define vec_sld __builtin_vec_sld
236#define vec_sll __builtin_vec_sll
237#define vec_slo __builtin_vec_slo
238#define vec_splat __builtin_vec_splat
239#define vec_sr __builtin_vec_sr
240#define vec_sra __builtin_vec_sra
241#define vec_srl __builtin_vec_srl
242#define vec_sro __builtin_vec_sro
243#define vec_st __builtin_vec_st
244#define vec_ste __builtin_vec_ste
245#define vec_stl __builtin_vec_stl
246#define vec_stvebx __builtin_vec_stvebx
247#define vec_stvehx __builtin_vec_stvehx
248#define vec_stvewx __builtin_vec_stvewx
0b61703c
AP
249/* Cell only intrinsics. */
250#ifdef __PPU__
251#define vec_stvlx __builtin_vec_stvlx
252#define vec_stvlxl __builtin_vec_stvlxl
253#define vec_stvrx __builtin_vec_stvrx
254#define vec_stvrxl __builtin_vec_stvrxl
255#endif
58646b77
PB
256#define vec_sub __builtin_vec_sub
257#define vec_subs __builtin_vec_subs
258#define vec_sum __builtin_vec_sum
259#define vec_unpackh __builtin_vec_unpackh
260#define vec_unpackl __builtin_vec_unpackl
261#define vec_vaddubm __builtin_vec_vaddubm
262#define vec_vaddubs __builtin_vec_vaddubs
263#define vec_vadduhm __builtin_vec_vadduhm
264#define vec_vadduhs __builtin_vec_vadduhs
265#define vec_vadduwm __builtin_vec_vadduwm
266#define vec_vadduws __builtin_vec_vadduws
267#define vec_vcmpequb __builtin_vec_vcmpequb
268#define vec_vcmpequh __builtin_vec_vcmpequh
269#define vec_vcmpequw __builtin_vec_vcmpequw
270#define vec_vmaxub __builtin_vec_vmaxub
271#define vec_vmaxuh __builtin_vec_vmaxuh
272#define vec_vmaxuw __builtin_vec_vmaxuw
273#define vec_vminub __builtin_vec_vminub
274#define vec_vminuh __builtin_vec_vminuh
275#define vec_vminuw __builtin_vec_vminuw
276#define vec_vmrghb __builtin_vec_vmrghb
277#define vec_vmrghh __builtin_vec_vmrghh
278#define vec_vmrghw __builtin_vec_vmrghw
279#define vec_vmrglb __builtin_vec_vmrglb
280#define vec_vmrglh __builtin_vec_vmrglh
281#define vec_vmrglw __builtin_vec_vmrglw
282#define vec_vpkuhum __builtin_vec_vpkuhum
283#define vec_vpkuwum __builtin_vec_vpkuwum
284#define vec_vrlb __builtin_vec_vrlb
285#define vec_vrlh __builtin_vec_vrlh
286#define vec_vrlw __builtin_vec_vrlw
287#define vec_vslb __builtin_vec_vslb
288#define vec_vslh __builtin_vec_vslh
289#define vec_vslw __builtin_vec_vslw
290#define vec_vspltb __builtin_vec_vspltb
291#define vec_vsplth __builtin_vec_vsplth
292#define vec_vspltw __builtin_vec_vspltw
293#define vec_vsrab __builtin_vec_vsrab
294#define vec_vsrah __builtin_vec_vsrah
295#define vec_vsraw __builtin_vec_vsraw
296#define vec_vsrb __builtin_vec_vsrb
297#define vec_vsrh __builtin_vec_vsrh
298#define vec_vsrw __builtin_vec_vsrw
299#define vec_vsububs __builtin_vec_vsububs
300#define vec_vsububm __builtin_vec_vsububm
301#define vec_vsubuhm __builtin_vec_vsubuhm
302#define vec_vsubuhs __builtin_vec_vsubuhs
303#define vec_vsubuwm __builtin_vec_vsubuwm
304#define vec_vsubuws __builtin_vec_vsubuws
305#define vec_xor __builtin_vec_xor
306
266b4890
AP
307#define vec_extract __builtin_vec_extract
308#define vec_insert __builtin_vec_insert
309#define vec_splats __builtin_vec_splats
310#define vec_promote __builtin_vec_promote
311
58646b77
PB
312/* Predicates.
313 For C++, we use templates in order to allow non-parenthesized arguments.
314 For C, instead, we use macros since non-parenthesized arguments were
315 not allowed even in older GCC implementation of AltiVec.
316
317 In the future, we may add more magic to the back-end, so that no
318 one- or two-argument macros are used. */
319
320#ifdef __cplusplus__
321#define __altivec_unary_pred(NAME, CALL) \
322template <class T> int NAME (T a1) { return CALL; }
323
324#define __altivec_scalar_pred(NAME, CALL) \
325template <class T, class U> int NAME (T a1, U a2) { return CALL; }
326
327/* Given the vec_step of a type, return the corresponding bool type. */
328template <int STEP> class __altivec_bool_ret { };
329template <> class __altivec_bool_ret <4> {
330 typedef __vector __bool int __ret;
8bb418a3 331};
58646b77
PB
332template <> class __altivec_bool_ret <8> {
333 typedef __vector __bool short __ret;
98705d7d 334};
58646b77
PB
335template <> class __altivec_bool_ret <16> {
336 typedef __vector __bool char __ret;
8bb418a3
ZL
337};
338
58646b77
PB
339/* Be very liberal in the pairs we accept. Mistakes such as passing
340 a `vector char' and `vector short' will be caught by the middle-end,
341 while any attempt to detect them here would produce hard to understand
342 error messages involving the implementation details of AltiVec. */
343#define __altivec_binary_pred(NAME, CALL) \
344template <class T, class U> \
345typename __altivec_bool_ret <vec_step (T)>::__ret \
346NAME (T a1, U a2) \
347{ \
348 return CALL; \
349}
350
351__altivec_binary_pred(vec_cmplt,
352 __builtin_vec_cmpgt (a2, a1))
353__altivec_binary_pred(vec_cmple,
00c8e9f6 354 __builtin_vec_cmpge (a2, a1))
58646b77
PB
355
356__altivec_scalar_pred(vec_all_in,
357 __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2))
358__altivec_scalar_pred(vec_any_out,
359 __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2))
360
361__altivec_unary_pred(vec_all_nan,
362 __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a1))
363__altivec_unary_pred(vec_any_nan,
364 __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a1))
365
366__altivec_unary_pred(vec_all_numeric,
367 __builtin_altivec_vcmpeqfp_p (__CR6_LT, a1, a1))
368__altivec_unary_pred(vec_any_numeric,
369 __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, a1, a1))
370
371__altivec_scalar_pred(vec_all_eq,
372 __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2))
373__altivec_scalar_pred(vec_all_ne,
374 __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2))
375__altivec_scalar_pred(vec_any_eq,
376 __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2))
377__altivec_scalar_pred(vec_any_ne,
378 __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2))
379
380__altivec_scalar_pred(vec_all_gt,
381 __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2))
382__altivec_scalar_pred(vec_all_lt,
383 __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1))
384__altivec_scalar_pred(vec_any_gt,
385 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2))
386__altivec_scalar_pred(vec_any_lt,
387 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1))
388
389__altivec_scalar_pred(vec_all_ngt,
390 __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a1, a2))
391__altivec_scalar_pred(vec_all_nlt,
392 __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a2, a1))
393__altivec_scalar_pred(vec_any_ngt,
394 __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a1, a2))
395__altivec_scalar_pred(vec_any_nlt,
396 __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a2, a1))
397
398/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
399 while for integer types it is converted to __builtin_vec_vcmpgt_p,
400 with inverted args and condition code. */
401__altivec_scalar_pred(vec_all_le,
402 __builtin_vec_vcmpge_p (__CR6_LT, a2, a1))
403__altivec_scalar_pred(vec_all_ge,
404 __builtin_vec_vcmpge_p (__CR6_LT, a1, a2))
405__altivec_scalar_pred(vec_any_le,
406 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1))
407__altivec_scalar_pred(vec_any_ge,
408 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2))
409
410__altivec_scalar_pred(vec_all_nge,
411 __builtin_altivec_vcmpgefp_p (__CR6_EQ, a1, a2))
412__altivec_scalar_pred(vec_all_nle,
413 __builtin_altivec_vcmpgefp_p (__CR6_EQ, a2, a1))
414__altivec_scalar_pred(vec_any_nge,
415 __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a1, a2))
416__altivec_scalar_pred(vec_any_nle,
417 __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a2, a1))
418
419#undef __altivec_scalar_pred
420#undef __altivec_unary_pred
421#undef __altivec_binary_pred
422#else
423#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1))
00c8e9f6 424#define vec_cmple(a1, a2) __builtin_vec_cmpge ((a2), (a1))
58646b77
PB
425
426#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2))
427#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2))
428
429#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (a1), (a1))
430#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, (a1), (a1))
431
432#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT, (a1), (a1))
433#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, (a1), (a1))
434
435#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2))
436#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2))
437#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2))
438#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2))
439
440#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2))
441#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1))
442#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2))
443#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1))
444
445#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a1), (a2))
446#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a2), (a1))
447#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a1), (a2))
448#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a2), (a1))
449
450/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
451 while for integer types it is converted to __builtin_vec_vcmpgt_p,
452 with inverted args and condition code. */
453#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1))
454#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2))
455#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1))
456#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2))
457
458#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a1), (a2))
459#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a2), (a1))
460#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a1), (a2))
461#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a2), (a1))
462#endif
5fb4cf24 463
58646b77
PB
464/* These do not accept vectors, so they do not have a __builtin_vec_*
465 counterpart. */
466#define vec_dss(x) __builtin_altivec_dss((x))
5fb4cf24 467#define vec_dssall() __builtin_altivec_dssall ()
58646b77
PB
468#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ())
469#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x))
470#define vec_splat_s16(x) __builtin_altivec_vspltish ((x))
471#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x))
472#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x)))
473#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x)))
474#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x)))
475
476/* This also accepts a type for its parameter, so it is not enough
477 to #define vec_step to __builtin_vec_step. */
478#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0)
5fb4cf24
AH
479
480#endif /* _ALTIVEC_H */