1 /* PowerPC AltiVec include file. 2 Copyright (C) 2002-2019 Free Software Foundation, Inc. 3 Contributed by Aldy Hernandez (aldyh@redhat.com). 4 Rewritten by Paolo Bonzini (bonzini@gnu.org). 5 6 This file is part of GCC. 7 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 3, or (at your 11 option) any later version. 12 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. 17 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/>. */ 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 33 #if !defined(__VEC__) || !defined(__ALTIVEC__) 34 #error Use the "-maltivec" flag to enable PowerPC AltiVec support 35 #endif 36 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, 40 if any), so we do not need to define them as macros. */ 41 42 #if !defined(__APPLE_ALTIVEC__) 43 /* You are allowed to undef these for C++ compatibility. */ 44 #define vector __vector 45 #define pixel __pixel 46 #define bool __bool 47 #endif 48 49 /* Condition register codes for AltiVec predicates. */ 50 51 #define __CR6_EQ 0 52 #define __CR6_EQ_REV 1 53 #define __CR6_LT 2 54 #define __CR6_LT_REV 3 55 56 /* Synonyms. */ 57 #define vec_vaddcuw vec_addc 58 #define vec_vand vec_and 59 #define vec_vandc vec_andc 60 #define vec_vrfip vec_ceil 61 #define vec_vcmpbfp vec_cmpb 62 #define vec_vcmpgefp vec_cmpge 63 #define vec_vctsxs vec_cts 64 #define vec_vctuxs vec_ctu 65 #define vec_vexptefp vec_expte 66 #define vec_vrfim vec_floor 67 #define vec_lvx vec_ld 68 #define vec_lvxl vec_ldl 69 #define vec_vlogefp vec_loge 70 #define vec_vmaddfp vec_madd 71 #define vec_vmhaddshs vec_madds 72 #define vec_vmladduhm vec_mladd 73 #define vec_vmhraddshs vec_mradds 74 #define vec_vnmsubfp vec_nmsub 75 #define vec_vnor vec_nor 76 #define vec_vor vec_or 77 #define vec_vpkpx vec_packpx 78 #define vec_vperm vec_perm 79 #define vec_permxor __builtin_vec_vpermxor 80 #define vec_vrefp vec_re 81 #define vec_vrfin vec_round 82 #define vec_vrsqrtefp vec_rsqrte 83 #define vec_vsel vec_sel 84 #define vec_vsldoi vec_sld 85 #define vec_vsl vec_sll 86 #define vec_vslo vec_slo 87 #define vec_vspltisb vec_splat_s8 88 #define vec_vspltish vec_splat_s16 89 #define vec_vspltisw vec_splat_s32 90 #define vec_vsr vec_srl 91 #define vec_vsro vec_sro 92 #define vec_stvx vec_st 93 #define vec_stvxl vec_stl 94 #define vec_vsubcuw vec_subc 95 #define vec_vsum2sws vec_sum2s 96 #define vec_vsumsws vec_sums 97 #define vec_vrfiz vec_trunc 98 #define vec_vxor vec_xor 99 100 /* Functions that are resolved by the backend to one of the 101 typed builtins. */ 102 #define vec_vaddfp __builtin_vec_vaddfp 103 #define vec_addc __builtin_vec_addc 104 #define vec_adde __builtin_vec_adde 105 #define vec_addec __builtin_vec_addec 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_cpsgn __builtin_vec_copysign 131 #define vec_double __builtin_vec_double 132 #define vec_doublee __builtin_vec_doublee 133 #define vec_doubleo __builtin_vec_doubleo 134 #define vec_doublel __builtin_vec_doublel 135 #define vec_doubleh __builtin_vec_doubleh 136 #define vec_expte __builtin_vec_expte 137 #define vec_float __builtin_vec_float 138 #define vec_float2 __builtin_vec_float2 139 #define vec_floate __builtin_vec_floate 140 #define vec_floato __builtin_vec_floato 141 #define vec_floor __builtin_vec_floor 142 #define vec_loge __builtin_vec_loge 143 #define vec_madd __builtin_vec_madd 144 #define vec_madds __builtin_vec_madds 145 #define vec_mtvscr __builtin_vec_mtvscr 146 #define vec_reve __builtin_vec_vreve 147 #define vec_vmaxfp __builtin_vec_vmaxfp 148 #define vec_vmaxsw __builtin_vec_vmaxsw 149 #define vec_vmaxsh __builtin_vec_vmaxsh 150 #define vec_vmaxsb __builtin_vec_vmaxsb 151 #define vec_vminfp __builtin_vec_vminfp 152 #define vec_vminsw __builtin_vec_vminsw 153 #define vec_vminsh __builtin_vec_vminsh 154 #define vec_vminsb __builtin_vec_vminsb 155 #define vec_mradds __builtin_vec_mradds 156 #define vec_vmsumshm __builtin_vec_vmsumshm 157 #define vec_vmsumuhm __builtin_vec_vmsumuhm 158 #define vec_vmsummbm __builtin_vec_vmsummbm 159 #define vec_vmsumubm __builtin_vec_vmsumubm 160 #define vec_vmsumshs __builtin_vec_vmsumshs 161 #define vec_vmsumuhs __builtin_vec_vmsumuhs 162 #define vec_vmsumudm __builtin_vec_vmsumudm 163 #define vec_vmulesb __builtin_vec_vmulesb 164 #define vec_vmulesh __builtin_vec_vmulesh 165 #define vec_vmuleuh __builtin_vec_vmuleuh 166 #define vec_vmuleub __builtin_vec_vmuleub 167 #define vec_vmulosh __builtin_vec_vmulosh 168 #define vec_vmulouh __builtin_vec_vmulouh 169 #define vec_vmulosb __builtin_vec_vmulosb 170 #define vec_vmuloub __builtin_vec_vmuloub 171 #define vec_nmsub __builtin_vec_nmsub 172 #define vec_packpx __builtin_vec_packpx 173 #define vec_vpkswss __builtin_vec_vpkswss 174 #define vec_vpkuwus __builtin_vec_vpkuwus 175 #define vec_vpkshss __builtin_vec_vpkshss 176 #define vec_vpkuhus __builtin_vec_vpkuhus 177 #define vec_vpkswus __builtin_vec_vpkswus 178 #define vec_vpkshus __builtin_vec_vpkshus 179 #define vec_re __builtin_vec_re 180 #define vec_round __builtin_vec_round 181 #define vec_recipdiv __builtin_vec_recipdiv 182 #define vec_rlmi __builtin_vec_rlmi 183 #define vec_vrlnm __builtin_vec_rlnm 184 #define vec_rlnm(a,b,c) (__builtin_vec_rlnm((a),((c)<<8)|(b))) 185 #define vec_rsqrt __builtin_vec_rsqrt 186 #define vec_rsqrte __builtin_vec_rsqrte 187 #define vec_signed __builtin_vec_vsigned 188 #define vec_signed2 __builtin_vec_vsigned2 189 #define vec_signede __builtin_vec_vsignede 190 #define vec_signedo __builtin_vec_vsignedo 191 #define vec_unsigned __builtin_vec_vunsigned 192 #define vec_unsigned2 __builtin_vec_vunsigned2 193 #define vec_unsignede __builtin_vec_vunsignede 194 #define vec_unsignedo __builtin_vec_vunsignedo 195 #define vec_vsubfp __builtin_vec_vsubfp 196 #define vec_subc __builtin_vec_subc 197 #define vec_sube __builtin_vec_sube 198 #define vec_subec __builtin_vec_subec 199 #define vec_vsubsws __builtin_vec_vsubsws 200 #define vec_vsubshs __builtin_vec_vsubshs 201 #define vec_vsubsbs __builtin_vec_vsubsbs 202 #define vec_sum4s __builtin_vec_sum4s 203 #define vec_vsum4shs __builtin_vec_vsum4shs 204 #define vec_vsum4sbs __builtin_vec_vsum4sbs 205 #define vec_vsum4ubs __builtin_vec_vsum4ubs 206 #define vec_sum2s __builtin_vec_sum2s 207 #define vec_sums __builtin_vec_sums 208 #define vec_trunc __builtin_vec_trunc 209 #define vec_vupkhpx __builtin_vec_vupkhpx 210 #define vec_vupkhsh __builtin_vec_vupkhsh 211 #define vec_vupkhsb __builtin_vec_vupkhsb 212 #define vec_vupklpx __builtin_vec_vupklpx 213 #define vec_vupklsh __builtin_vec_vupklsh 214 #define vec_vupklsb __builtin_vec_vupklsb 215 #define vec_abs __builtin_vec_abs 216 #define vec_nabs __builtin_vec_nabs 217 #define vec_abss __builtin_vec_abss 218 #define vec_add __builtin_vec_add 219 #define vec_adds __builtin_vec_adds 220 #define vec_and __builtin_vec_and 221 #define vec_andc __builtin_vec_andc 222 #define vec_avg __builtin_vec_avg 223 #define vec_cmpeq __builtin_vec_cmpeq 224 #define vec_cmpne __builtin_vec_cmpne 225 #define vec_cmpgt __builtin_vec_cmpgt 226 #define vec_ctf __builtin_vec_ctf 227 #define vec_dst __builtin_vec_dst 228 #define vec_dstst __builtin_vec_dstst 229 #define vec_dststt __builtin_vec_dststt 230 #define vec_dstt __builtin_vec_dstt 231 #define vec_ld __builtin_vec_ld 232 #define vec_lde __builtin_vec_lde 233 #define vec_ldl __builtin_vec_ldl 234 #define vec_lvebx __builtin_vec_lvebx 235 #define vec_lvehx __builtin_vec_lvehx 236 #define vec_lvewx __builtin_vec_lvewx 237 #define vec_neg __builtin_vec_neg 238 #define vec_pmsum_be __builtin_vec_vpmsum 239 #define vec_shasigma_be __builtin_crypto_vshasigma 240 /* Cell only intrinsics. */ 241 #ifdef __PPU__ 242 #define vec_lvlx __builtin_vec_lvlx 243 #define vec_lvlxl __builtin_vec_lvlxl 244 #define vec_lvrx __builtin_vec_lvrx 245 #define vec_lvrxl __builtin_vec_lvrxl 246 #endif 247 #define vec_lvsl __builtin_vec_lvsl 248 #define vec_lvsr __builtin_vec_lvsr 249 #define vec_max __builtin_vec_max 250 #define vec_mergee __builtin_vec_vmrgew 251 #define vec_mergeh __builtin_vec_mergeh 252 #define vec_mergel __builtin_vec_mergel 253 #define vec_mergeo __builtin_vec_vmrgow 254 #define vec_min __builtin_vec_min 255 #define vec_mladd __builtin_vec_mladd 256 #define vec_msum __builtin_vec_msum 257 #define vec_msums __builtin_vec_msums 258 #define vec_mul __builtin_vec_mul 259 #define vec_mule __builtin_vec_mule 260 #define vec_mulo __builtin_vec_mulo 261 #define vec_nor __builtin_vec_nor 262 #define vec_or __builtin_vec_or 263 #define vec_pack __builtin_vec_pack 264 #define vec_packs __builtin_vec_packs 265 #define vec_packsu __builtin_vec_packsu 266 #define vec_perm __builtin_vec_perm 267 #define vec_rl __builtin_vec_rl 268 #define vec_sel __builtin_vec_sel 269 #define vec_sl __builtin_vec_sl 270 #define vec_sld __builtin_vec_sld 271 #define vec_sldw __builtin_vsx_xxsldwi 272 #define vec_sll __builtin_vec_sll 273 #define vec_slo __builtin_vec_slo 274 #define vec_splat __builtin_vec_splat 275 #define vec_sr __builtin_vec_sr 276 #define vec_sra __builtin_vec_sra 277 #define vec_srl __builtin_vec_srl 278 #define vec_sro __builtin_vec_sro 279 #define vec_st __builtin_vec_st 280 #define vec_ste __builtin_vec_ste 281 #define vec_stl __builtin_vec_stl 282 #define vec_stvebx __builtin_vec_stvebx 283 #define vec_stvehx __builtin_vec_stvehx 284 #define vec_stvewx __builtin_vec_stvewx 285 /* Cell only intrinsics. */ 286 #ifdef __PPU__ 287 #define vec_stvlx __builtin_vec_stvlx 288 #define vec_stvlxl __builtin_vec_stvlxl 289 #define vec_stvrx __builtin_vec_stvrx 290 #define vec_stvrxl __builtin_vec_stvrxl 291 #endif 292 #define vec_sub __builtin_vec_sub 293 #define vec_subs __builtin_vec_subs 294 #define vec_sum __builtin_vec_sum 295 #define vec_unpackh __builtin_vec_unpackh 296 #define vec_unpackl __builtin_vec_unpackl 297 #define vec_vaddubm __builtin_vec_vaddubm 298 #define vec_vaddubs __builtin_vec_vaddubs 299 #define vec_vadduhm __builtin_vec_vadduhm 300 #define vec_vadduhs __builtin_vec_vadduhs 301 #define vec_vadduwm __builtin_vec_vadduwm 302 #define vec_vadduws __builtin_vec_vadduws 303 #define vec_vcmpequb __builtin_vec_vcmpequb 304 #define vec_vcmpequh __builtin_vec_vcmpequh 305 #define vec_vcmpequw __builtin_vec_vcmpequw 306 #define vec_vmaxub __builtin_vec_vmaxub 307 #define vec_vmaxuh __builtin_vec_vmaxuh 308 #define vec_vmaxuw __builtin_vec_vmaxuw 309 #define vec_vminub __builtin_vec_vminub 310 #define vec_vminuh __builtin_vec_vminuh 311 #define vec_vminuw __builtin_vec_vminuw 312 #define vec_vmrghb __builtin_vec_vmrghb 313 #define vec_vmrghh __builtin_vec_vmrghh 314 #define vec_vmrghw __builtin_vec_vmrghw 315 #define vec_vmrglb __builtin_vec_vmrglb 316 #define vec_vmrglh __builtin_vec_vmrglh 317 #define vec_vmrglw __builtin_vec_vmrglw 318 #define vec_vpkuhum __builtin_vec_vpkuhum 319 #define vec_vpkuwum __builtin_vec_vpkuwum 320 #define vec_vrlb __builtin_vec_vrlb 321 #define vec_vrlh __builtin_vec_vrlh 322 #define vec_vrlw __builtin_vec_vrlw 323 #define vec_vslb __builtin_vec_vslb 324 #define vec_vslh __builtin_vec_vslh 325 #define vec_vslw __builtin_vec_vslw 326 #define vec_vspltb __builtin_vec_vspltb 327 #define vec_vsplth __builtin_vec_vsplth 328 #define vec_vspltw __builtin_vec_vspltw 329 #define vec_vsrab __builtin_vec_vsrab 330 #define vec_vsrah __builtin_vec_vsrah 331 #define vec_vsraw __builtin_vec_vsraw 332 #define vec_vsrb __builtin_vec_vsrb 333 #define vec_vsrh __builtin_vec_vsrh 334 #define vec_vsrw __builtin_vec_vsrw 335 #define vec_vsububs __builtin_vec_vsububs 336 #define vec_vsububm __builtin_vec_vsububm 337 #define vec_vsubuhm __builtin_vec_vsubuhm 338 #define vec_vsubuhs __builtin_vec_vsubuhs 339 #define vec_vsubuwm __builtin_vec_vsubuwm 340 #define vec_vsubuws __builtin_vec_vsubuws 341 #define vec_xor __builtin_vec_xor 342 343 #define vec_extract __builtin_vec_extract 344 #define vec_insert __builtin_vec_insert 345 #define vec_splats __builtin_vec_splats 346 #define vec_promote __builtin_vec_promote 347 348 #ifdef __VSX__ 349 /* VSX additions */ 350 #define vec_div __builtin_vec_div 351 #define vec_mul __builtin_vec_mul 352 #define vec_msub __builtin_vec_msub 353 #define vec_nmadd __builtin_vec_nmadd 354 #define vec_nearbyint __builtin_vec_nearbyint 355 #define vec_rint __builtin_vec_rint 356 #define vec_sqrt __builtin_vec_sqrt 357 #define vec_vsx_ld __builtin_vec_vsx_ld 358 #define vec_vsx_st __builtin_vec_vsx_st 359 #define vec_xl __builtin_vec_vsx_ld 360 #define vec_xl_be __builtin_vec_xl_be 361 #define vec_xst __builtin_vec_vsx_st 362 #define vec_xst_be __builtin_vec_xst_be 363 364 /* Note, xxsldi and xxpermdi were added as __builtin_vsx_<xxx> functions 365 instead of __builtin_vec_<xxx> */ 366 #define vec_xxsldwi __builtin_vsx_xxsldwi 367 #define vec_xxpermdi __builtin_vsx_xxpermdi 368 #endif 369 370 #ifdef _ARCH_PWR8 371 /* Vector additions added in ISA 2.07. */ 372 #define vec_eqv __builtin_vec_eqv 373 #define vec_nand __builtin_vec_nand 374 #define vec_orc __builtin_vec_orc 375 #define vec_vaddcuq __builtin_vec_vaddcuq 376 #define vec_vaddudm __builtin_vec_vaddudm 377 #define vec_vadduqm __builtin_vec_vadduqm 378 #define vec_vbpermq __builtin_vec_vbpermq 379 #define vec_bperm __builtin_vec_vbperm_api 380 #define vec_vclz __builtin_vec_vclz 381 #define vec_cntlz __builtin_vec_vclz 382 #define vec_vclzb __builtin_vec_vclzb 383 #define vec_vclzd __builtin_vec_vclzd 384 #define vec_vclzh __builtin_vec_vclzh 385 #define vec_vclzw __builtin_vec_vclzw 386 #define vec_vaddecuq __builtin_vec_vaddecuq 387 #define vec_vaddeuqm __builtin_vec_vaddeuqm 388 #define vec_vsubecuq __builtin_vec_vsubecuq 389 #define vec_vsubeuqm __builtin_vec_vsubeuqm 390 #define vec_vgbbd __builtin_vec_vgbbd 391 #define vec_gb __builtin_vec_vgbbd 392 #define vec_vmaxsd __builtin_vec_vmaxsd 393 #define vec_vmaxud __builtin_vec_vmaxud 394 #define vec_vminsd __builtin_vec_vminsd 395 #define vec_vminud __builtin_vec_vminud 396 #define vec_vmrgew __builtin_vec_vmrgew 397 #define vec_vmrgow __builtin_vec_vmrgow 398 #define vec_vpksdss __builtin_vec_vpksdss 399 #define vec_vpksdus __builtin_vec_vpksdus 400 #define vec_vpkudum __builtin_vec_vpkudum 401 #define vec_vpkudus __builtin_vec_vpkudus 402 #define vec_vpopcnt __builtin_vec_vpopcnt 403 #define vec_vpopcntb __builtin_vec_vpopcntb 404 #define vec_vpopcntd __builtin_vec_vpopcntd 405 #define vec_vpopcnth __builtin_vec_vpopcnth 406 #define vec_vpopcntw __builtin_vec_vpopcntw 407 #define vec_popcnt __builtin_vec_vpopcntu 408 #define vec_popcntb __builtin_vec_vpopcntub 409 #define vec_popcnth __builtin_vec_vpopcntuh 410 #define vec_popcntw __builtin_vec_vpopcntuw 411 #define vec_popcntd __builtin_vec_vpopcntud 412 #define vec_vrld __builtin_vec_vrld 413 #define vec_vsld __builtin_vec_vsld 414 #define vec_vsrad __builtin_vec_vsrad 415 #define vec_vsrd __builtin_vec_vsrd 416 #define vec_vsubcuq __builtin_vec_vsubcuq 417 #define vec_vsubudm __builtin_vec_vsubudm 418 #define vec_vsubuqm __builtin_vec_vsubuqm 419 #define vec_vupkhsw __builtin_vec_vupkhsw 420 #define vec_vupklsw __builtin_vec_vupklsw 421 #define vec_revb __builtin_vec_revb 422 #define vec_sbox_be __builtin_crypto_vsbox_be 423 #define vec_cipher_be __builtin_crypto_vcipher_be 424 #define vec_cipherlast_be __builtin_crypto_vcipherlast_be 425 #define vec_ncipher_be __builtin_crypto_vncipher_be 426 #define vec_ncipherlast_be __builtin_crypto_vncipherlast_be 427 #endif 428 429 #ifdef __POWER9_VECTOR__ 430 /* Vector additions added in ISA 3.0. */ 431 #define vec_first_match_index __builtin_vec_first_match_index 432 #define vec_first_match_or_eos_index __builtin_vec_first_match_or_eos_index 433 #define vec_first_mismatch_index __builtin_vec_first_mismatch_index 434 #define vec_first_mismatch_or_eos_index __builtin_vec_first_mismatch_or_eos_index 435 #define vec_pack_to_short_fp32 __builtin_vec_convert_4f32_8f16 436 #define vec_parity_lsbb __builtin_vec_vparity_lsbb 437 #define vec_vctz __builtin_vec_vctz 438 #define vec_cnttz __builtin_vec_vctz 439 #define vec_vctzb __builtin_vec_vctzb 440 #define vec_vctzd __builtin_vec_vctzd 441 #define vec_vctzh __builtin_vec_vctzh 442 #define vec_vctzw __builtin_vec_vctzw 443 #define vec_extract4b __builtin_vec_extract4b 444 #define vec_insert4b __builtin_vec_insert4b 445 #define vec_vprtyb __builtin_vec_vprtyb 446 #define vec_vprtybd __builtin_vec_vprtybd 447 #define vec_vprtybw __builtin_vec_vprtybw 448 449 #ifdef _ARCH_PPC64 450 #define vec_vprtybq __builtin_vec_vprtybq 451 #endif 452 453 #define vec_absd __builtin_vec_vadu 454 #define vec_absdb __builtin_vec_vadub 455 #define vec_absdh __builtin_vec_vaduh 456 #define vec_absdw __builtin_vec_vaduw 457 458 #define vec_slv __builtin_vec_vslv 459 #define vec_srv __builtin_vec_vsrv 460 461 #define vec_extract_exp __builtin_vec_extract_exp 462 #define vec_extract_sig __builtin_vec_extract_sig 463 #define vec_insert_exp __builtin_vec_insert_exp 464 #define vec_test_data_class __builtin_vec_test_data_class 465 466 #define vec_extract_fp_from_shorth __builtin_vec_vextract_fp_from_shorth 467 #define vec_extract_fp_from_shortl __builtin_vec_vextract_fp_from_shortl 468 #define vec_extract_fp32_from_shorth __builtin_vec_vextract_fp_from_shorth 469 #define vec_extract_fp32_from_shortl __builtin_vec_vextract_fp_from_shortl 470 471 #define scalar_extract_exp __builtin_vec_scalar_extract_exp 472 #define scalar_extract_sig __builtin_vec_scalar_extract_sig 473 #define scalar_insert_exp __builtin_vec_scalar_insert_exp 474 #define scalar_test_data_class __builtin_vec_scalar_test_data_class 475 #define scalar_test_neg __builtin_vec_scalar_test_neg 476 477 #define scalar_cmp_exp_gt __builtin_vec_scalar_cmp_exp_gt 478 #define scalar_cmp_exp_lt __builtin_vec_scalar_cmp_exp_lt 479 #define scalar_cmp_exp_eq __builtin_vec_scalar_cmp_exp_eq 480 #define scalar_cmp_exp_unordered __builtin_vec_scalar_cmp_exp_unordered 481 482 #ifdef _ARCH_PPC64 483 #define vec_xl_len __builtin_vec_lxvl 484 #define vec_xst_len __builtin_vec_stxvl 485 #define vec_xl_len_r __builtin_vec_xl_len_r 486 #define vec_xst_len_r __builtin_vec_xst_len_r 487 #endif 488 489 #define vec_cmpnez __builtin_vec_vcmpnez 490 491 #define vec_cntlz_lsbb __builtin_vec_vclzlsbb 492 #define vec_cnttz_lsbb __builtin_vec_vctzlsbb 493 494 #define vec_xlx __builtin_vec_vextulx 495 #define vec_xrx __builtin_vec_vexturx 496 #endif 497 498 /* Predicates. 499 For C++, we use templates in order to allow non-parenthesized arguments. 500 For C, instead, we use macros since non-parenthesized arguments were 501 not allowed even in older GCC implementation of AltiVec. 502 503 In the future, we may add more magic to the back-end, so that no 504 one- or two-argument macros are used. */ 505 506 #ifdef __cplusplus__ 507 #define __altivec_unary_pred(NAME, CALL) \ 508 template <class T> int NAME (T a1) { return CALL; } 509 510 #define __altivec_scalar_pred(NAME, CALL) \ 511 template <class T, class U> int NAME (T a1, U a2) { return CALL; } 512 513 /* Given the vec_step of a type, return the corresponding bool type. */ 514 template <int STEP> class __altivec_bool_ret { }; 515 template <> class __altivec_bool_ret <4> { 516 typedef __vector __bool int __ret; 517 }; 518 template <> class __altivec_bool_ret <8> { 519 typedef __vector __bool short __ret; 520 }; 521 template <> class __altivec_bool_ret <16> { 522 typedef __vector __bool char __ret; 523 }; 524 525 /* Be very liberal in the pairs we accept. Mistakes such as passing 526 a `vector char' and `vector short' will be caught by the middle-end, 527 while any attempt to detect them here would produce hard to understand 528 error messages involving the implementation details of AltiVec. */ 529 #define __altivec_binary_pred(NAME, CALL) \ 530 template <class T, class U> \ 531 typename __altivec_bool_ret <vec_step (T)>::__ret \ 532 NAME (T a1, U a2) \ 533 { \ 534 return CALL; \ 535 } 536 537 __altivec_binary_pred(vec_cmplt, 538 __builtin_vec_cmpgt (a2, a1)) 539 __altivec_binary_pred(vec_cmple, 540 __builtin_vec_cmpge (a2, a1)) 541 542 __altivec_scalar_pred(vec_all_in, 543 __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2)) 544 __altivec_scalar_pred(vec_any_out, 545 __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2)) 546 547 __altivec_unary_pred(vec_all_nan, 548 __builtin_altivec_vcmpeq_p (__CR6_EQ, a1, a1)) 549 __altivec_unary_pred(vec_any_nan, 550 __builtin_altivec_vcmpeq_p (__CR6_LT_REV, a1, a1)) 551 552 __altivec_unary_pred(vec_all_numeric, 553 __builtin_altivec_vcmpeq_p (__CR6_LT, a1, a1)) 554 __altivec_unary_pred(vec_any_numeric, 555 __builtin_altivec_vcmpeq_p (__CR6_EQ_REV, a1, a1)) 556 557 __altivec_scalar_pred(vec_all_eq, 558 __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2)) 559 560 #ifndef __POWER9_VECTOR__ 561 __altivec_scalar_pred(vec_all_ne, 562 __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2)) 563 __altivec_scalar_pred(vec_any_eq, 564 __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2)) 565 #else 566 __altivec_scalar_pred(vec_all_nez, 567 __builtin_vec_vcmpnez_p (__CR6_LT, a1, a2)) 568 __altivec_scalar_pred(vec_any_eqz, 569 __builtin_vec_vcmpnez_p (__CR6_LT_REV, a1, a2)) 570 __altivec_scalar_pred(vec_all_ne, 571 __builtin_vec_vcmpne_p (a1, a2)) 572 __altivec_scalar_pred(vec_any_eq, 573 __builtin_vec_vcmpae_p (a1, a2)) 574 #endif 575 576 __altivec_scalar_pred(vec_any_ne, 577 __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2)) 578 579 __altivec_scalar_pred(vec_all_gt, 580 __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2)) 581 __altivec_scalar_pred(vec_all_lt, 582 __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1)) 583 __altivec_scalar_pred(vec_any_gt, 584 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2)) 585 __altivec_scalar_pred(vec_any_lt, 586 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1)) 587 588 __altivec_scalar_pred(vec_all_ngt, 589 __builtin_altivec_vcmpgt_p (__CR6_EQ, a1, a2)) 590 __altivec_scalar_pred(vec_all_nlt, 591 __builtin_altivec_vcmpgt_p (__CR6_EQ, a2, a1)) 592 __altivec_scalar_pred(vec_any_ngt, 593 __builtin_altivec_vcmpgt_p (__CR6_LT_REV, a1, a2)) 594 __altivec_scalar_pred(vec_any_nlt, 595 __builtin_altivec_vcmpgt_p (__CR6_LT_REV, a2, a1)) 596 597 /* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, 598 while for integer types it is converted to __builtin_vec_vcmpgt_p, 599 with inverted args and condition code. */ 600 __altivec_scalar_pred(vec_all_le, 601 __builtin_vec_vcmpge_p (__CR6_LT, a2, a1)) 602 __altivec_scalar_pred(vec_all_ge, 603 __builtin_vec_vcmpge_p (__CR6_LT, a1, a2)) 604 __altivec_scalar_pred(vec_any_le, 605 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1)) 606 __altivec_scalar_pred(vec_any_ge, 607 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2)) 608 609 __altivec_scalar_pred(vec_all_nge, 610 __builtin_altivec_vcmpge_p (__CR6_EQ, a1, a2)) 611 __altivec_scalar_pred(vec_all_nle, 612 __builtin_altivec_vcmpge_p (__CR6_EQ, a2, a1)) 613 __altivec_scalar_pred(vec_any_nge, 614 __builtin_altivec_vcmpge_p (__CR6_LT_REV, a1, a2)) 615 __altivec_scalar_pred(vec_any_nle, 616 __builtin_altivec_vcmpge_p (__CR6_LT_REV, a2, a1)) 617 618 #undef __altivec_scalar_pred 619 #undef __altivec_unary_pred 620 #undef __altivec_binary_pred 621 #else 622 #define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1)) 623 #define vec_cmple(a1, a2) __builtin_vec_cmpge ((a2), (a1)) 624 625 #define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2)) 626 #define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2)) 627 628 #define vec_all_nan(a1) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a1)) 629 #define vec_any_nan(a1) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a1)) 630 631 #define vec_all_numeric(a1) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a1)) 632 #define vec_any_numeric(a1) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a1)) 633 634 #define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2)) 635 636 #ifdef __POWER9_VECTOR__ 637 #define vec_all_nez(a1, a2) __builtin_vec_vcmpnez_p (__CR6_LT, (a1), (a2)) 638 #define vec_any_eqz(a1, a2) __builtin_vec_vcmpnez_p (__CR6_LT_REV, (a1), (a2)) 639 #define vec_all_ne(a1, a2) __builtin_vec_vcmpne_p ((a1), (a2)) 640 #define vec_any_eq(a1, a2) __builtin_vec_vcmpae_p ((a1), (a2)) 641 #else 642 #define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2)) 643 #define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2)) 644 #endif 645 646 #define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2)) 647 648 #define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2)) 649 #define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1)) 650 #define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2)) 651 #define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1)) 652 653 #define vec_all_ngt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ, (a1), (a2)) 654 #define vec_all_nlt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ, (a2), (a1)) 655 #define vec_any_ngt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT_REV, (a1), (a2)) 656 #define vec_any_nlt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT_REV, (a2), (a1)) 657 658 /* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, 659 while for integer types it is converted to __builtin_vec_vcmpgt_p, 660 with inverted args and condition code. */ 661 #define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1)) 662 #define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2)) 663 #define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1)) 664 #define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2)) 665 666 #define vec_all_nge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ, (a1), (a2)) 667 #define vec_all_nle(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ, (a2), (a1)) 668 #define vec_any_nge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT_REV, (a1), (a2)) 669 #define vec_any_nle(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT_REV, (a2), (a1)) 670 #endif 671 672 /* These do not accept vectors, so they do not have a __builtin_vec_* 673 counterpart. */ 674 #define vec_dss(x) __builtin_altivec_dss((x)) 675 #define vec_dssall() __builtin_altivec_dssall () 676 #define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ()) 677 #define vec_splat_s8(x) __builtin_altivec_vspltisb ((x)) 678 #define vec_splat_s16(x) __builtin_altivec_vspltish ((x)) 679 #define vec_splat_s32(x) __builtin_altivec_vspltisw ((x)) 680 #define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x))) 681 #define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x))) 682 #define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x))) 683 684 /* This also accepts a type for its parameter, so it is not enough 685 to #define vec_step to __builtin_vec_step. */ 686 #define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0) 687 688 #endif /* _ALTIVEC_H */ 689