]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/config/rs6000/altivec.h
c++: Some additional tests
[thirdparty/gcc.git] / gcc / config / rs6000 / altivec.h
CommitLineData
5fb4cf24 1/* PowerPC AltiVec include file.
8d9254fc 2 Copyright (C) 2002-2020 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
748086b7 10 by the Free Software Foundation; either version 3, or (at your
5de601cf 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
748086b7
JJ
18 Under Section 7 of GPL version 3, you are granted additional
19 permissions described in the GCC Runtime Library Exception, version
20 3.1, as published by the Free Software Foundation.
21
22 You should have received a copy of the GNU General Public License and
23 a copy of the GCC Runtime Library Exception along with this program;
24 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
25 <http://www.gnu.org/licenses/>. */
5fb4cf24
AH
26
27/* Implemented to conform to the specification included in the AltiVec
28 Technology Programming Interface Manual (ALTIVECPIM/D 6/1999 Rev 0). */
29
30#ifndef _ALTIVEC_H
31#define _ALTIVEC_H 1
32
8bb418a3
ZL
33#if !defined(__VEC__) || !defined(__ALTIVEC__)
34#error Use the "-maltivec" flag to enable PowerPC AltiVec support
71a0ab0c 35#endif
5fb4cf24 36
f95d9272
ZL
37/* If __APPLE_ALTIVEC__ is defined, the compiler supports 'vector',
38 'pixel' and 'bool' as context-sensitive AltiVec keywords (in
39 non-AltiVec contexts, they revert to their original meanings,
e756e900
BS
40 if any), so we do not need to define them as macros. Also,
41 avoid defining them as macros for C++ with strict ANSI, as
42 this is not compatible. */
f95d9272 43
e756e900
BS
44#if !defined(__APPLE_ALTIVEC__) \
45 && (!defined(__STRICT_ANSI__) || !defined(__cplusplus))
5fb4cf24 46#define vector __vector
8bb418a3
ZL
47#define pixel __pixel
48#define bool __bool
f95d9272 49#endif
5fb4cf24 50
8bb418a3 51/* Condition register codes for AltiVec predicates. */
5fb4cf24 52
ae4b4a02
AH
53#define __CR6_EQ 0
54#define __CR6_EQ_REV 1
55#define __CR6_LT 2
56#define __CR6_LT_REV 3
57
58646b77 58/* Synonyms. */
4287a893
AH
59#define vec_vaddcuw vec_addc
60#define vec_vand vec_and
61#define vec_vandc vec_andc
62#define vec_vrfip vec_ceil
63#define vec_vcmpbfp vec_cmpb
64#define vec_vcmpgefp vec_cmpge
65#define vec_vctsxs vec_cts
66#define vec_vctuxs vec_ctu
67#define vec_vexptefp vec_expte
68#define vec_vrfim vec_floor
69#define vec_lvx vec_ld
70#define vec_lvxl vec_ldl
71#define vec_vlogefp vec_loge
72#define vec_vmaddfp vec_madd
73#define vec_vmhaddshs vec_madds
74#define vec_vmladduhm vec_mladd
75#define vec_vmhraddshs vec_mradds
76#define vec_vnmsubfp vec_nmsub
77#define vec_vnor vec_nor
78#define vec_vor vec_or
79#define vec_vpkpx vec_packpx
80#define vec_vperm vec_perm
cb90e18c 81#define vec_permxor __builtin_vec_vpermxor
4287a893
AH
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
29ec406a
BS
106#define vec_adde __builtin_vec_adde
107#define vec_addec __builtin_vec_addec
58646b77
PB
108#define vec_vaddsws __builtin_vec_vaddsws
109#define vec_vaddshs __builtin_vec_vaddshs
110#define vec_vaddsbs __builtin_vec_vaddsbs
111#define vec_vavgsw __builtin_vec_vavgsw
112#define vec_vavguw __builtin_vec_vavguw
113#define vec_vavgsh __builtin_vec_vavgsh
114#define vec_vavguh __builtin_vec_vavguh
115#define vec_vavgsb __builtin_vec_vavgsb
116#define vec_vavgub __builtin_vec_vavgub
117#define vec_ceil __builtin_vec_ceil
118#define vec_cmpb __builtin_vec_cmpb
119#define vec_vcmpeqfp __builtin_vec_vcmpeqfp
120#define vec_cmpge __builtin_vec_cmpge
121#define vec_vcmpgtfp __builtin_vec_vcmpgtfp
122#define vec_vcmpgtsw __builtin_vec_vcmpgtsw
123#define vec_vcmpgtuw __builtin_vec_vcmpgtuw
124#define vec_vcmpgtsh __builtin_vec_vcmpgtsh
125#define vec_vcmpgtuh __builtin_vec_vcmpgtuh
126#define vec_vcmpgtsb __builtin_vec_vcmpgtsb
127#define vec_vcmpgtub __builtin_vec_vcmpgtub
128#define vec_vcfsx __builtin_vec_vcfsx
129#define vec_vcfux __builtin_vec_vcfux
130#define vec_cts __builtin_vec_cts
131#define vec_ctu __builtin_vec_ctu
65fa79c3 132#define vec_cpsgn __builtin_vec_copysign
29ec406a 133#define vec_double __builtin_vec_double
3fd44c8a
CL
134#define vec_doublee __builtin_vec_doublee
135#define vec_doubleo __builtin_vec_doubleo
136#define vec_doublel __builtin_vec_doublel
137#define vec_doubleh __builtin_vec_doubleh
58646b77 138#define vec_expte __builtin_vec_expte
be1418c7
CL
139#define vec_float __builtin_vec_float
140#define vec_float2 __builtin_vec_float2
141#define vec_floate __builtin_vec_floate
142#define vec_floato __builtin_vec_floato
58646b77
PB
143#define vec_floor __builtin_vec_floor
144#define vec_loge __builtin_vec_loge
145#define vec_madd __builtin_vec_madd
146#define vec_madds __builtin_vec_madds
147#define vec_mtvscr __builtin_vec_mtvscr
952ac945 148#define vec_reve __builtin_vec_vreve
58646b77
PB
149#define vec_vmaxfp __builtin_vec_vmaxfp
150#define vec_vmaxsw __builtin_vec_vmaxsw
151#define vec_vmaxsh __builtin_vec_vmaxsh
152#define vec_vmaxsb __builtin_vec_vmaxsb
153#define vec_vminfp __builtin_vec_vminfp
154#define vec_vminsw __builtin_vec_vminsw
155#define vec_vminsh __builtin_vec_vminsh
156#define vec_vminsb __builtin_vec_vminsb
157#define vec_mradds __builtin_vec_mradds
158#define vec_vmsumshm __builtin_vec_vmsumshm
159#define vec_vmsumuhm __builtin_vec_vmsumuhm
160#define vec_vmsummbm __builtin_vec_vmsummbm
161#define vec_vmsumubm __builtin_vec_vmsumubm
162#define vec_vmsumshs __builtin_vec_vmsumshs
163#define vec_vmsumuhs __builtin_vec_vmsumuhs
c1a57681 164#define vec_vmsumudm __builtin_vec_vmsumudm
58646b77
PB
165#define vec_vmulesb __builtin_vec_vmulesb
166#define vec_vmulesh __builtin_vec_vmulesh
167#define vec_vmuleuh __builtin_vec_vmuleuh
168#define vec_vmuleub __builtin_vec_vmuleub
169#define vec_vmulosh __builtin_vec_vmulosh
170#define vec_vmulouh __builtin_vec_vmulouh
171#define vec_vmulosb __builtin_vec_vmulosb
172#define vec_vmuloub __builtin_vec_vmuloub
173#define vec_nmsub __builtin_vec_nmsub
174#define vec_packpx __builtin_vec_packpx
175#define vec_vpkswss __builtin_vec_vpkswss
176#define vec_vpkuwus __builtin_vec_vpkuwus
177#define vec_vpkshss __builtin_vec_vpkshss
178#define vec_vpkuhus __builtin_vec_vpkuhus
179#define vec_vpkswus __builtin_vec_vpkswus
180#define vec_vpkshus __builtin_vec_vpkshus
181#define vec_re __builtin_vec_re
182#define vec_round __builtin_vec_round
92902797 183#define vec_recipdiv __builtin_vec_recipdiv
a6607774
BS
184#define vec_rlmi __builtin_vec_rlmi
185#define vec_vrlnm __builtin_vec_rlnm
e97929e2 186#define vec_rlnm(a,b,c) (__builtin_vec_rlnm((a),((c)<<8)|(b)))
92902797 187#define vec_rsqrt __builtin_vec_rsqrt
58646b77 188#define vec_rsqrte __builtin_vec_rsqrte
e5898daf
CL
189#define vec_signed __builtin_vec_vsigned
190#define vec_signed2 __builtin_vec_vsigned2
191#define vec_signede __builtin_vec_vsignede
192#define vec_signedo __builtin_vec_vsignedo
193#define vec_unsigned __builtin_vec_vunsigned
194#define vec_unsigned2 __builtin_vec_vunsigned2
195#define vec_unsignede __builtin_vec_vunsignede
196#define vec_unsignedo __builtin_vec_vunsignedo
58646b77
PB
197#define vec_vsubfp __builtin_vec_vsubfp
198#define vec_subc __builtin_vec_subc
08e60e19
CL
199#define vec_sube __builtin_vec_sube
200#define vec_subec __builtin_vec_subec
58646b77
PB
201#define vec_vsubsws __builtin_vec_vsubsws
202#define vec_vsubshs __builtin_vec_vsubshs
203#define vec_vsubsbs __builtin_vec_vsubsbs
204#define vec_sum4s __builtin_vec_sum4s
205#define vec_vsum4shs __builtin_vec_vsum4shs
206#define vec_vsum4sbs __builtin_vec_vsum4sbs
207#define vec_vsum4ubs __builtin_vec_vsum4ubs
208#define vec_sum2s __builtin_vec_sum2s
209#define vec_sums __builtin_vec_sums
210#define vec_trunc __builtin_vec_trunc
211#define vec_vupkhpx __builtin_vec_vupkhpx
212#define vec_vupkhsh __builtin_vec_vupkhsh
213#define vec_vupkhsb __builtin_vec_vupkhsb
214#define vec_vupklpx __builtin_vec_vupklpx
215#define vec_vupklsh __builtin_vec_vupklsh
216#define vec_vupklsb __builtin_vec_vupklsb
217#define vec_abs __builtin_vec_abs
76689ffc 218#define vec_nabs __builtin_vec_nabs
58646b77
PB
219#define vec_abss __builtin_vec_abss
220#define vec_add __builtin_vec_add
221#define vec_adds __builtin_vec_adds
222#define vec_and __builtin_vec_and
223#define vec_andc __builtin_vec_andc
224#define vec_avg __builtin_vec_avg
225#define vec_cmpeq __builtin_vec_cmpeq
f9d6ce73 226#define vec_cmpne __builtin_vec_cmpne
58646b77
PB
227#define vec_cmpgt __builtin_vec_cmpgt
228#define vec_ctf __builtin_vec_ctf
229#define vec_dst __builtin_vec_dst
230#define vec_dstst __builtin_vec_dstst
231#define vec_dststt __builtin_vec_dststt
232#define vec_dstt __builtin_vec_dstt
233#define vec_ld __builtin_vec_ld
234#define vec_lde __builtin_vec_lde
235#define vec_ldl __builtin_vec_ldl
236#define vec_lvebx __builtin_vec_lvebx
237#define vec_lvehx __builtin_vec_lvehx
238#define vec_lvewx __builtin_vec_lvewx
b69c0061
WS
239#define vec_xl_zext __builtin_vec_ze_lxvrx
240#define vec_xl_sext __builtin_vec_se_lxvrx
241#define vec_xst_trunc __builtin_vec_tr_stxvrx
5562ebfc 242#define vec_neg __builtin_vec_neg
6992707b
BS
243#define vec_pmsum_be __builtin_vec_vpmsum
244#define vec_shasigma_be __builtin_crypto_vshasigma
0b61703c
AP
245/* Cell only intrinsics. */
246#ifdef __PPU__
247#define vec_lvlx __builtin_vec_lvlx
248#define vec_lvlxl __builtin_vec_lvlxl
249#define vec_lvrx __builtin_vec_lvrx
250#define vec_lvrxl __builtin_vec_lvrxl
251#endif
58646b77
PB
252#define vec_lvsl __builtin_vec_lvsl
253#define vec_lvsr __builtin_vec_lvsr
254#define vec_max __builtin_vec_max
65fa79c3 255#define vec_mergee __builtin_vec_vmrgew
58646b77
PB
256#define vec_mergeh __builtin_vec_mergeh
257#define vec_mergel __builtin_vec_mergel
65fa79c3 258#define vec_mergeo __builtin_vec_vmrgow
58646b77
PB
259#define vec_min __builtin_vec_min
260#define vec_mladd __builtin_vec_mladd
261#define vec_msum __builtin_vec_msum
262#define vec_msums __builtin_vec_msums
a23e6f1c 263#define vec_mul __builtin_vec_mul
58646b77
PB
264#define vec_mule __builtin_vec_mule
265#define vec_mulo __builtin_vec_mulo
266#define vec_nor __builtin_vec_nor
267#define vec_or __builtin_vec_or
268#define vec_pack __builtin_vec_pack
269#define vec_packs __builtin_vec_packs
270#define vec_packsu __builtin_vec_packsu
271#define vec_perm __builtin_vec_perm
272#define vec_rl __builtin_vec_rl
273#define vec_sel __builtin_vec_sel
274#define vec_sl __builtin_vec_sl
275#define vec_sld __builtin_vec_sld
727577c2 276#define vec_sldw __builtin_vsx_xxsldwi
58646b77
PB
277#define vec_sll __builtin_vec_sll
278#define vec_slo __builtin_vec_slo
279#define vec_splat __builtin_vec_splat
280#define vec_sr __builtin_vec_sr
281#define vec_sra __builtin_vec_sra
282#define vec_srl __builtin_vec_srl
283#define vec_sro __builtin_vec_sro
284#define vec_st __builtin_vec_st
285#define vec_ste __builtin_vec_ste
286#define vec_stl __builtin_vec_stl
287#define vec_stvebx __builtin_vec_stvebx
288#define vec_stvehx __builtin_vec_stvehx
289#define vec_stvewx __builtin_vec_stvewx
0b61703c
AP
290/* Cell only intrinsics. */
291#ifdef __PPU__
292#define vec_stvlx __builtin_vec_stvlx
293#define vec_stvlxl __builtin_vec_stvlxl
294#define vec_stvrx __builtin_vec_stvrx
295#define vec_stvrxl __builtin_vec_stvrxl
296#endif
58646b77
PB
297#define vec_sub __builtin_vec_sub
298#define vec_subs __builtin_vec_subs
299#define vec_sum __builtin_vec_sum
300#define vec_unpackh __builtin_vec_unpackh
301#define vec_unpackl __builtin_vec_unpackl
302#define vec_vaddubm __builtin_vec_vaddubm
303#define vec_vaddubs __builtin_vec_vaddubs
304#define vec_vadduhm __builtin_vec_vadduhm
305#define vec_vadduhs __builtin_vec_vadduhs
306#define vec_vadduwm __builtin_vec_vadduwm
307#define vec_vadduws __builtin_vec_vadduws
308#define vec_vcmpequb __builtin_vec_vcmpequb
309#define vec_vcmpequh __builtin_vec_vcmpequh
310#define vec_vcmpequw __builtin_vec_vcmpequw
311#define vec_vmaxub __builtin_vec_vmaxub
312#define vec_vmaxuh __builtin_vec_vmaxuh
313#define vec_vmaxuw __builtin_vec_vmaxuw
314#define vec_vminub __builtin_vec_vminub
315#define vec_vminuh __builtin_vec_vminuh
316#define vec_vminuw __builtin_vec_vminuw
317#define vec_vmrghb __builtin_vec_vmrghb
318#define vec_vmrghh __builtin_vec_vmrghh
319#define vec_vmrghw __builtin_vec_vmrghw
320#define vec_vmrglb __builtin_vec_vmrglb
321#define vec_vmrglh __builtin_vec_vmrglh
322#define vec_vmrglw __builtin_vec_vmrglw
323#define vec_vpkuhum __builtin_vec_vpkuhum
324#define vec_vpkuwum __builtin_vec_vpkuwum
325#define vec_vrlb __builtin_vec_vrlb
326#define vec_vrlh __builtin_vec_vrlh
327#define vec_vrlw __builtin_vec_vrlw
328#define vec_vslb __builtin_vec_vslb
329#define vec_vslh __builtin_vec_vslh
330#define vec_vslw __builtin_vec_vslw
331#define vec_vspltb __builtin_vec_vspltb
332#define vec_vsplth __builtin_vec_vsplth
333#define vec_vspltw __builtin_vec_vspltw
334#define vec_vsrab __builtin_vec_vsrab
335#define vec_vsrah __builtin_vec_vsrah
336#define vec_vsraw __builtin_vec_vsraw
337#define vec_vsrb __builtin_vec_vsrb
338#define vec_vsrh __builtin_vec_vsrh
339#define vec_vsrw __builtin_vec_vsrw
340#define vec_vsububs __builtin_vec_vsububs
341#define vec_vsububm __builtin_vec_vsububm
342#define vec_vsubuhm __builtin_vec_vsubuhm
343#define vec_vsubuhs __builtin_vec_vsubuhs
344#define vec_vsubuwm __builtin_vec_vsubuwm
345#define vec_vsubuws __builtin_vec_vsubuws
346#define vec_xor __builtin_vec_xor
347
266b4890
AP
348#define vec_extract __builtin_vec_extract
349#define vec_insert __builtin_vec_insert
350#define vec_splats __builtin_vec_splats
351#define vec_promote __builtin_vec_promote
352
29e6733c
MM
353#ifdef __VSX__
354/* VSX additions */
355#define vec_div __builtin_vec_div
356#define vec_mul __builtin_vec_mul
357#define vec_msub __builtin_vec_msub
358#define vec_nmadd __builtin_vec_nmadd
359#define vec_nearbyint __builtin_vec_nearbyint
360#define vec_rint __builtin_vec_rint
361#define vec_sqrt __builtin_vec_sqrt
c9485473
MM
362#define vec_vsx_ld __builtin_vec_vsx_ld
363#define vec_vsx_st __builtin_vec_vsx_st
6687d58d 364#define vec_xl __builtin_vec_vsx_ld
b40e941b 365#define vec_xl_be __builtin_vec_xl_be
6687d58d 366#define vec_xst __builtin_vec_vsx_st
3ef9e1ec 367#define vec_xst_be __builtin_vec_xst_be
117f16fb
MM
368
369/* Note, xxsldi and xxpermdi were added as __builtin_vsx_<xxx> functions
370 instead of __builtin_vec_<xxx> */
371#define vec_xxsldwi __builtin_vsx_xxsldwi
372#define vec_xxpermdi __builtin_vsx_xxpermdi
29e6733c
MM
373#endif
374
a5965b52
MM
375#ifdef _ARCH_PWR8
376/* Vector additions added in ISA 2.07. */
0bd62dca
MM
377#define vec_eqv __builtin_vec_eqv
378#define vec_nand __builtin_vec_nand
379#define vec_orc __builtin_vec_orc
a16a872d 380#define vec_vaddcuq __builtin_vec_vaddcuq
a5965b52 381#define vec_vaddudm __builtin_vec_vaddudm
a16a872d 382#define vec_vadduqm __builtin_vec_vadduqm
117f16fb 383#define vec_vbpermq __builtin_vec_vbpermq
dfc42f08 384#define vec_bperm __builtin_vec_vbperm_api
0bd62dca 385#define vec_vclz __builtin_vec_vclz
65fa79c3 386#define vec_cntlz __builtin_vec_vclz
0bd62dca
MM
387#define vec_vclzb __builtin_vec_vclzb
388#define vec_vclzd __builtin_vec_vclzd
389#define vec_vclzh __builtin_vec_vclzh
390#define vec_vclzw __builtin_vec_vclzw
a16a872d
MM
391#define vec_vaddecuq __builtin_vec_vaddecuq
392#define vec_vaddeuqm __builtin_vec_vaddeuqm
393#define vec_vsubecuq __builtin_vec_vsubecuq
394#define vec_vsubeuqm __builtin_vec_vsubeuqm
0bd62dca 395#define vec_vgbbd __builtin_vec_vgbbd
29ec406a 396#define vec_gb __builtin_vec_vgbbd
a5965b52
MM
397#define vec_vmaxsd __builtin_vec_vmaxsd
398#define vec_vmaxud __builtin_vec_vmaxud
399#define vec_vminsd __builtin_vec_vminsd
400#define vec_vminud __builtin_vec_vminud
0bd62dca
MM
401#define vec_vmrgew __builtin_vec_vmrgew
402#define vec_vmrgow __builtin_vec_vmrgow
a5965b52
MM
403#define vec_vpksdss __builtin_vec_vpksdss
404#define vec_vpksdus __builtin_vec_vpksdus
405#define vec_vpkudum __builtin_vec_vpkudum
406#define vec_vpkudus __builtin_vec_vpkudus
0bd62dca
MM
407#define vec_vpopcnt __builtin_vec_vpopcnt
408#define vec_vpopcntb __builtin_vec_vpopcntb
409#define vec_vpopcntd __builtin_vec_vpopcntd
410#define vec_vpopcnth __builtin_vec_vpopcnth
411#define vec_vpopcntw __builtin_vec_vpopcntw
b403beb8 412#define vec_popcnt __builtin_vec_vpopcntu
a5965b52
MM
413#define vec_vrld __builtin_vec_vrld
414#define vec_vsld __builtin_vec_vsld
415#define vec_vsrad __builtin_vec_vsrad
416#define vec_vsrd __builtin_vec_vsrd
a16a872d 417#define vec_vsubcuq __builtin_vec_vsubcuq
a5965b52 418#define vec_vsubudm __builtin_vec_vsubudm
a16a872d 419#define vec_vsubuqm __builtin_vec_vsubuqm
a5965b52
MM
420#define vec_vupkhsw __builtin_vec_vupkhsw
421#define vec_vupklsw __builtin_vec_vupklsw
fc504349 422#define vec_revb __builtin_vec_revb
d60a02c8
XHL
423#define vec_sbox_be __builtin_crypto_vsbox_be
424#define vec_cipher_be __builtin_crypto_vcipher_be
425#define vec_cipherlast_be __builtin_crypto_vcipherlast_be
426#define vec_ncipher_be __builtin_crypto_vncipher_be
427#define vec_ncipherlast_be __builtin_crypto_vncipherlast_be
a5965b52
MM
428#endif
429
50181506 430#ifdef __POWER9_VECTOR__
4bfc9db7 431/* Vector additions added in ISA 3.0. */
4d85d480
CL
432#define vec_first_match_index __builtin_vec_first_match_index
433#define vec_first_match_or_eos_index __builtin_vec_first_match_or_eos_index
434#define vec_first_mismatch_index __builtin_vec_first_mismatch_index
435#define vec_first_mismatch_or_eos_index __builtin_vec_first_mismatch_or_eos_index
58b475a2 436#define vec_pack_to_short_fp32 __builtin_vec_convert_4f32_8f16
f281956e 437#define vec_parity_lsbb __builtin_vec_vparity_lsbb
4bfc9db7 438#define vec_vctz __builtin_vec_vctz
1c8bf560 439#define vec_cnttz __builtin_vec_vctz
4bfc9db7
MM
440#define vec_vctzb __builtin_vec_vctzb
441#define vec_vctzd __builtin_vec_vctzd
442#define vec_vctzh __builtin_vec_vctzh
443#define vec_vctzw __builtin_vec_vctzw
b8bf5603
CL
444#define vec_extract4b __builtin_vec_extract4b
445#define vec_insert4b __builtin_vec_insert4b
4bfc9db7
MM
446#define vec_vprtyb __builtin_vec_vprtyb
447#define vec_vprtybd __builtin_vec_vprtybd
448#define vec_vprtybw __builtin_vec_vprtybw
449
450#ifdef _ARCH_PPC64
451#define vec_vprtybq __builtin_vec_vprtybq
452#endif
e342b9d8 453
5408a64a
KN
454#define vec_absd __builtin_vec_vadu
455#define vec_absdb __builtin_vec_vadub
456#define vec_absdh __builtin_vec_vaduh
457#define vec_absdw __builtin_vec_vaduw
458
e342b9d8
KN
459#define vec_slv __builtin_vec_vslv
460#define vec_srv __builtin_vec_vsrv
e9e6d4f6
KN
461
462#define vec_extract_exp __builtin_vec_extract_exp
463#define vec_extract_sig __builtin_vec_extract_sig
464#define vec_insert_exp __builtin_vec_insert_exp
465#define vec_test_data_class __builtin_vec_test_data_class
466
26bca0ed
CL
467#define vec_extract_fp_from_shorth __builtin_vec_vextract_fp_from_shorth
468#define vec_extract_fp_from_shortl __builtin_vec_vextract_fp_from_shortl
4ded4b23
CL
469#define vec_extract_fp32_from_shorth __builtin_vec_vextract_fp_from_shorth
470#define vec_extract_fp32_from_shortl __builtin_vec_vextract_fp_from_shortl
26bca0ed 471
e9e6d4f6
KN
472#define scalar_extract_exp __builtin_vec_scalar_extract_exp
473#define scalar_extract_sig __builtin_vec_scalar_extract_sig
474#define scalar_insert_exp __builtin_vec_scalar_insert_exp
475#define scalar_test_data_class __builtin_vec_scalar_test_data_class
476#define scalar_test_neg __builtin_vec_scalar_test_neg
477
478#define scalar_cmp_exp_gt __builtin_vec_scalar_cmp_exp_gt
479#define scalar_cmp_exp_lt __builtin_vec_scalar_cmp_exp_lt
480#define scalar_cmp_exp_eq __builtin_vec_scalar_cmp_exp_eq
481#define scalar_cmp_exp_unordered __builtin_vec_scalar_cmp_exp_unordered
482
902cb7b1
KN
483#ifdef _ARCH_PPC64
484#define vec_xl_len __builtin_vec_lxvl
485#define vec_xst_len __builtin_vec_stxvl
1262c6cf
CL
486#define vec_xl_len_r __builtin_vec_xl_len_r
487#define vec_xst_len_r __builtin_vec_xst_len_r
902cb7b1
KN
488#endif
489
490#define vec_cmpnez __builtin_vec_vcmpnez
491
492#define vec_cntlz_lsbb __builtin_vec_vclzlsbb
493#define vec_cnttz_lsbb __builtin_vec_vctzlsbb
494
cf5d0fc2
WS
495#define vec_test_lsbb_all_ones __builtin_vec_xvtlsbb_all_ones
496#define vec_test_lsbb_all_zeros __builtin_vec_xvtlsbb_all_zeros
497
902cb7b1
KN
498#define vec_xlx __builtin_vec_vextulx
499#define vec_xrx __builtin_vec_vexturx
4bfc9db7
MM
500#endif
501
58646b77
PB
502/* Predicates.
503 For C++, we use templates in order to allow non-parenthesized arguments.
504 For C, instead, we use macros since non-parenthesized arguments were
505 not allowed even in older GCC implementation of AltiVec.
506
507 In the future, we may add more magic to the back-end, so that no
508 one- or two-argument macros are used. */
509
510#ifdef __cplusplus__
511#define __altivec_unary_pred(NAME, CALL) \
512template <class T> int NAME (T a1) { return CALL; }
513
514#define __altivec_scalar_pred(NAME, CALL) \
515template <class T, class U> int NAME (T a1, U a2) { return CALL; }
516
517/* Given the vec_step of a type, return the corresponding bool type. */
518template <int STEP> class __altivec_bool_ret { };
519template <> class __altivec_bool_ret <4> {
520 typedef __vector __bool int __ret;
8bb418a3 521};
58646b77
PB
522template <> class __altivec_bool_ret <8> {
523 typedef __vector __bool short __ret;
98705d7d 524};
58646b77
PB
525template <> class __altivec_bool_ret <16> {
526 typedef __vector __bool char __ret;
8bb418a3
ZL
527};
528
58646b77
PB
529/* Be very liberal in the pairs we accept. Mistakes such as passing
530 a `vector char' and `vector short' will be caught by the middle-end,
531 while any attempt to detect them here would produce hard to understand
532 error messages involving the implementation details of AltiVec. */
533#define __altivec_binary_pred(NAME, CALL) \
534template <class T, class U> \
535typename __altivec_bool_ret <vec_step (T)>::__ret \
536NAME (T a1, U a2) \
537{ \
538 return CALL; \
539}
540
541__altivec_binary_pred(vec_cmplt,
542 __builtin_vec_cmpgt (a2, a1))
543__altivec_binary_pred(vec_cmple,
00c8e9f6 544 __builtin_vec_cmpge (a2, a1))
58646b77
PB
545
546__altivec_scalar_pred(vec_all_in,
547 __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2))
548__altivec_scalar_pred(vec_any_out,
549 __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2))
550
551__altivec_unary_pred(vec_all_nan,
29e6733c 552 __builtin_altivec_vcmpeq_p (__CR6_EQ, a1, a1))
58646b77 553__altivec_unary_pred(vec_any_nan,
29e6733c 554 __builtin_altivec_vcmpeq_p (__CR6_LT_REV, a1, a1))
58646b77
PB
555
556__altivec_unary_pred(vec_all_numeric,
29e6733c 557 __builtin_altivec_vcmpeq_p (__CR6_LT, a1, a1))
58646b77 558__altivec_unary_pred(vec_any_numeric,
29e6733c 559 __builtin_altivec_vcmpeq_p (__CR6_EQ_REV, a1, a1))
58646b77
PB
560
561__altivec_scalar_pred(vec_all_eq,
562 __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2))
902cb7b1 563
50181506 564#ifndef __POWER9_VECTOR__
58646b77
PB
565__altivec_scalar_pred(vec_all_ne,
566 __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2))
567__altivec_scalar_pred(vec_any_eq,
568 __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2))
902cb7b1
KN
569#else
570__altivec_scalar_pred(vec_all_nez,
571 __builtin_vec_vcmpnez_p (__CR6_LT, a1, a2))
572__altivec_scalar_pred(vec_any_eqz,
573 __builtin_vec_vcmpnez_p (__CR6_LT_REV, a1, a2))
574__altivec_scalar_pred(vec_all_ne,
b0ba96c2 575 __builtin_vec_vcmpne_p (a1, a2))
902cb7b1 576__altivec_scalar_pred(vec_any_eq,
b0ba96c2 577 __builtin_vec_vcmpae_p (a1, a2))
902cb7b1
KN
578#endif
579
58646b77
PB
580__altivec_scalar_pred(vec_any_ne,
581 __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2))
582
583__altivec_scalar_pred(vec_all_gt,
584 __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2))
585__altivec_scalar_pred(vec_all_lt,
586 __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1))
587__altivec_scalar_pred(vec_any_gt,
588 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2))
589__altivec_scalar_pred(vec_any_lt,
590 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1))
591
592__altivec_scalar_pred(vec_all_ngt,
29e6733c 593 __builtin_altivec_vcmpgt_p (__CR6_EQ, a1, a2))
58646b77 594__altivec_scalar_pred(vec_all_nlt,
29e6733c 595 __builtin_altivec_vcmpgt_p (__CR6_EQ, a2, a1))
58646b77 596__altivec_scalar_pred(vec_any_ngt,
29e6733c 597 __builtin_altivec_vcmpgt_p (__CR6_LT_REV, a1, a2))
58646b77 598__altivec_scalar_pred(vec_any_nlt,
29e6733c 599 __builtin_altivec_vcmpgt_p (__CR6_LT_REV, a2, a1))
58646b77
PB
600
601/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
602 while for integer types it is converted to __builtin_vec_vcmpgt_p,
603 with inverted args and condition code. */
604__altivec_scalar_pred(vec_all_le,
605 __builtin_vec_vcmpge_p (__CR6_LT, a2, a1))
606__altivec_scalar_pred(vec_all_ge,
607 __builtin_vec_vcmpge_p (__CR6_LT, a1, a2))
608__altivec_scalar_pred(vec_any_le,
609 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1))
610__altivec_scalar_pred(vec_any_ge,
611 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2))
612
613__altivec_scalar_pred(vec_all_nge,
29e6733c 614 __builtin_altivec_vcmpge_p (__CR6_EQ, a1, a2))
58646b77 615__altivec_scalar_pred(vec_all_nle,
29e6733c 616 __builtin_altivec_vcmpge_p (__CR6_EQ, a2, a1))
58646b77 617__altivec_scalar_pred(vec_any_nge,
29e6733c 618 __builtin_altivec_vcmpge_p (__CR6_LT_REV, a1, a2))
58646b77 619__altivec_scalar_pred(vec_any_nle,
29e6733c 620 __builtin_altivec_vcmpge_p (__CR6_LT_REV, a2, a1))
58646b77
PB
621
622#undef __altivec_scalar_pred
623#undef __altivec_unary_pred
624#undef __altivec_binary_pred
625#else
626#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1))
00c8e9f6 627#define vec_cmple(a1, a2) __builtin_vec_cmpge ((a2), (a1))
58646b77
PB
628
629#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2))
630#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2))
631
29e6733c
MM
632#define vec_all_nan(a1) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a1))
633#define vec_any_nan(a1) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a1))
58646b77 634
29e6733c
MM
635#define vec_all_numeric(a1) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a1))
636#define vec_any_numeric(a1) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a1))
58646b77
PB
637
638#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2))
902cb7b1 639
50181506 640#ifdef __POWER9_VECTOR__
902cb7b1
KN
641#define vec_all_nez(a1, a2) __builtin_vec_vcmpnez_p (__CR6_LT, (a1), (a2))
642#define vec_any_eqz(a1, a2) __builtin_vec_vcmpnez_p (__CR6_LT_REV, (a1), (a2))
50181506
KN
643#define vec_all_ne(a1, a2) __builtin_vec_vcmpne_p ((a1), (a2))
644#define vec_any_eq(a1, a2) __builtin_vec_vcmpae_p ((a1), (a2))
902cb7b1 645#else
58646b77
PB
646#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2))
647#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2))
902cb7b1
KN
648#endif
649
58646b77
PB
650#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2))
651
652#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2))
653#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1))
654#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2))
655#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1))
656
29e6733c
MM
657#define vec_all_ngt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ, (a1), (a2))
658#define vec_all_nlt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ, (a2), (a1))
659#define vec_any_ngt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT_REV, (a1), (a2))
660#define vec_any_nlt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT_REV, (a2), (a1))
58646b77
PB
661
662/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
663 while for integer types it is converted to __builtin_vec_vcmpgt_p,
664 with inverted args and condition code. */
665#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1))
666#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2))
667#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1))
668#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2))
669
29e6733c
MM
670#define vec_all_nge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ, (a1), (a2))
671#define vec_all_nle(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ, (a2), (a1))
672#define vec_any_nge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT_REV, (a1), (a2))
673#define vec_any_nle(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT_REV, (a2), (a1))
58646b77 674#endif
5fb4cf24 675
58646b77
PB
676/* These do not accept vectors, so they do not have a __builtin_vec_*
677 counterpart. */
678#define vec_dss(x) __builtin_altivec_dss((x))
5fb4cf24 679#define vec_dssall() __builtin_altivec_dssall ()
58646b77
PB
680#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ())
681#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x))
682#define vec_splat_s16(x) __builtin_altivec_vspltish ((x))
683#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x))
684#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x)))
685#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x)))
686#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x)))
687
688/* This also accepts a type for its parameter, so it is not enough
689 to #define vec_step to __builtin_vec_step. */
690#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0)
5fb4cf24 691
5d9d0c94 692#ifdef _ARCH_PWR10
a1821a24
KN
693/* May modify these macro definitions if future capabilities overload
694 with support for different vector argument and result types. */
3ebd168b
KN
695#define vec_cntlzm(a, b) __builtin_altivec_vclzdm (a, b)
696#define vec_cnttzm(a, b) __builtin_altivec_vctzdm (a, b)
894ac7bc
KN
697#define vec_pdep(a, b) __builtin_altivec_vpdepd (a, b)
698#define vec_pext(a, b) __builtin_altivec_vpextd (a, b)
ed07d681 699#define vec_cfuge(a, b) __builtin_altivec_vcfuged (a, b)
b8eaa754 700#define vec_genpcvm(a, b) __builtin_vec_xxgenpcvm (a, b)
894ac7bc 701
5d9d0c94 702/* Overloaded built-in functions for ISA 3.1. */
c21d2b66
KN
703#define vec_extractl(a, b, c) __builtin_vec_extractl (a, b, c)
704#define vec_extracth(a, b, c) __builtin_vec_extracth (a, b, c)
530e9095
CL
705#define vec_insertl(a, b, c) __builtin_vec_insertl (a, b, c)
706#define vec_inserth(a, b, c) __builtin_vec_inserth (a, b, c)
3f029aea
CL
707#define vec_replace_elt(a, b, c) __builtin_vec_replace_elt (a, b, c)
708#define vec_replace_unaligned(a, b, c) __builtin_vec_replace_un (a, b, c)
82f10dee
CL
709#define vec_sldb(a, b, c) __builtin_vec_sldb (a, b, c)
710#define vec_srdb(a, b, c) __builtin_vec_srdb (a, b, c)
7f3b1997
CL
711#define vec_splati(a) __builtin_vec_xxspltiw (a)
712#define vec_splatid(a) __builtin_vec_xxspltid (a)
713#define vec_splati_ins(a, b, c) __builtin_vec_xxsplti32dx (a, b, c)
5998f1bb
CL
714#define vec_blendv(a, b, c) __builtin_vec_xxblend (a, b, c)
715#define vec_permx(a, b, c, d) __builtin_vec_xxpermx (a, b, c, d)
c21d2b66 716
7c00c559 717#define vec_gnb(a, b) __builtin_vec_gnb (a, b)
25bf7d32
KN
718#define vec_clrl(a, b) __builtin_vec_clrl (a, b)
719#define vec_clrr(a, b) __builtin_vec_clrr (a, b)
840ac85c 720#define vec_ternarylogic(a, b, c, d) __builtin_vec_xxeval (a, b, c, d)
89ce3290
KN
721
722#define vec_strir(a) __builtin_vec_strir (a)
723#define vec_stril(a) __builtin_vec_stril (a)
724
725#define vec_strir_p(a) __builtin_vec_strir_p (a)
726#define vec_stril_p(a) __builtin_vec_stril_p (a)
02ef74ba
CL
727
728/* VSX Mask Manipulation builtin. */
729#define vec_genbm __builtin_vec_mtvsrbm
730#define vec_genhm __builtin_vec_mtvsrhm
731#define vec_genwm __builtin_vec_mtvsrwm
732#define vec_gendm __builtin_vec_mtvsrdm
733#define vec_genqm __builtin_vec_mtvsrqm
734#define vec_cntm __builtin_vec_cntm
735#define vec_expandm __builtin_vec_vexpandm
736#define vec_extractm __builtin_vec_vextractm
a1821a24
KN
737#endif
738
5fb4cf24 739#endif /* _ALTIVEC_H */