altivec.h revision 1.1
1/* PowerPC AltiVec include file. 2 Copyright (C) 2002, 2003, 2004, 2005, 2008, 2009, 2010, 2011 3 Free Software Foundation, Inc. 4 Contributed by Aldy Hernandez (aldyh@redhat.com). 5 Rewritten by Paolo Bonzini (bonzini@gnu.org). 6 7 This file is part of GCC. 8 9 GCC is free software; you can redistribute it and/or modify it 10 under the terms of the GNU General Public License as published 11 by the Free Software Foundation; either version 3, or (at your 12 option) any later version. 13 14 GCC is distributed in the hope that it will be useful, but WITHOUT 15 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 16 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 17 License for more details. 18 19 Under Section 7 of GPL version 3, you are granted additional 20 permissions described in the GCC Runtime Library Exception, version 21 3.1, as published by the Free Software Foundation. 22 23 You should have received a copy of the GNU General Public License and 24 a copy of the GCC Runtime Library Exception along with this program; 25 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 26 <http://www.gnu.org/licenses/>. */ 27 28/* Implemented to conform to the specification included in the AltiVec 29 Technology Programming Interface Manual (ALTIVECPIM/D 6/1999 Rev 0). */ 30 31#ifndef _ALTIVEC_H 32#define _ALTIVEC_H 1 33 34#if !defined(__VEC__) || !defined(__ALTIVEC__) 35#error Use the "-maltivec" flag to enable PowerPC AltiVec support 36#endif 37 38/* If __APPLE_ALTIVEC__ is defined, the compiler supports 'vector', 39 'pixel' and 'bool' as context-sensitive AltiVec keywords (in 40 non-AltiVec contexts, they revert to their original meanings, 41 if any), so we do not need to define them as macros. */ 42 43#if !defined(__APPLE_ALTIVEC__) 44/* You are allowed to undef these for C++ compatibility. */ 45#define vector __vector 46#define pixel __pixel 47#define bool __bool 48#endif 49 50/* Condition register codes for AltiVec predicates. */ 51 52#define __CR6_EQ 0 53#define __CR6_EQ_REV 1 54#define __CR6_LT 2 55#define __CR6_LT_REV 3 56 57/* Synonyms. */ 58#define vec_vaddcuw vec_addc 59#define vec_vand vec_and 60#define vec_vandc vec_andc 61#define vec_vrfip vec_ceil 62#define vec_vcmpbfp vec_cmpb 63#define vec_vcmpgefp vec_cmpge 64#define vec_vctsxs vec_cts 65#define vec_vctuxs vec_ctu 66#define vec_vexptefp vec_expte 67#define vec_vrfim vec_floor 68#define vec_lvx vec_ld 69#define vec_lvxl vec_ldl 70#define vec_vlogefp vec_loge 71#define vec_vmaddfp vec_madd 72#define vec_vmhaddshs vec_madds 73#define vec_vmladduhm vec_mladd 74#define vec_vmhraddshs vec_mradds 75#define vec_vnmsubfp vec_nmsub 76#define vec_vnor vec_nor 77#define vec_vor vec_or 78#define vec_vpkpx vec_packpx 79#define vec_vperm vec_perm 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_vaddsws __builtin_vec_vaddsws 105#define vec_vaddshs __builtin_vec_vaddshs 106#define vec_vaddsbs __builtin_vec_vaddsbs 107#define vec_vavgsw __builtin_vec_vavgsw 108#define vec_vavguw __builtin_vec_vavguw 109#define vec_vavgsh __builtin_vec_vavgsh 110#define vec_vavguh __builtin_vec_vavguh 111#define vec_vavgsb __builtin_vec_vavgsb 112#define vec_vavgub __builtin_vec_vavgub 113#define vec_ceil __builtin_vec_ceil 114#define vec_cmpb __builtin_vec_cmpb 115#define vec_vcmpeqfp __builtin_vec_vcmpeqfp 116#define vec_cmpge __builtin_vec_cmpge 117#define vec_vcmpgtfp __builtin_vec_vcmpgtfp 118#define vec_vcmpgtsw __builtin_vec_vcmpgtsw 119#define vec_vcmpgtuw __builtin_vec_vcmpgtuw 120#define vec_vcmpgtsh __builtin_vec_vcmpgtsh 121#define vec_vcmpgtuh __builtin_vec_vcmpgtuh 122#define vec_vcmpgtsb __builtin_vec_vcmpgtsb 123#define vec_vcmpgtub __builtin_vec_vcmpgtub 124#define vec_vcfsx __builtin_vec_vcfsx 125#define vec_vcfux __builtin_vec_vcfux 126#define vec_cts __builtin_vec_cts 127#define vec_ctu __builtin_vec_ctu 128#define vec_expte __builtin_vec_expte 129#define vec_floor __builtin_vec_floor 130#define vec_loge __builtin_vec_loge 131#define vec_madd __builtin_vec_madd 132#define vec_madds __builtin_vec_madds 133#define vec_mtvscr __builtin_vec_mtvscr 134#define vec_vmaxfp __builtin_vec_vmaxfp 135#define vec_vmaxsw __builtin_vec_vmaxsw 136#define vec_vmaxsh __builtin_vec_vmaxsh 137#define vec_vmaxsb __builtin_vec_vmaxsb 138#define vec_vminfp __builtin_vec_vminfp 139#define vec_vminsw __builtin_vec_vminsw 140#define vec_vminsh __builtin_vec_vminsh 141#define vec_vminsb __builtin_vec_vminsb 142#define vec_mradds __builtin_vec_mradds 143#define vec_vmsumshm __builtin_vec_vmsumshm 144#define vec_vmsumuhm __builtin_vec_vmsumuhm 145#define vec_vmsummbm __builtin_vec_vmsummbm 146#define vec_vmsumubm __builtin_vec_vmsumubm 147#define vec_vmsumshs __builtin_vec_vmsumshs 148#define vec_vmsumuhs __builtin_vec_vmsumuhs 149#define vec_vmulesb __builtin_vec_vmulesb 150#define vec_vmulesh __builtin_vec_vmulesh 151#define vec_vmuleuh __builtin_vec_vmuleuh 152#define vec_vmuleub __builtin_vec_vmuleub 153#define vec_vmulosh __builtin_vec_vmulosh 154#define vec_vmulouh __builtin_vec_vmulouh 155#define vec_vmulosb __builtin_vec_vmulosb 156#define vec_vmuloub __builtin_vec_vmuloub 157#define vec_nmsub __builtin_vec_nmsub 158#define vec_packpx __builtin_vec_packpx 159#define vec_vpkswss __builtin_vec_vpkswss 160#define vec_vpkuwus __builtin_vec_vpkuwus 161#define vec_vpkshss __builtin_vec_vpkshss 162#define vec_vpkuhus __builtin_vec_vpkuhus 163#define vec_vpkswus __builtin_vec_vpkswus 164#define vec_vpkshus __builtin_vec_vpkshus 165#define vec_re __builtin_vec_re 166#define vec_round __builtin_vec_round 167#define vec_rsqrte __builtin_vec_rsqrte 168#define vec_vsubfp __builtin_vec_vsubfp 169#define vec_subc __builtin_vec_subc 170#define vec_vsubsws __builtin_vec_vsubsws 171#define vec_vsubshs __builtin_vec_vsubshs 172#define vec_vsubsbs __builtin_vec_vsubsbs 173#define vec_sum4s __builtin_vec_sum4s 174#define vec_vsum4shs __builtin_vec_vsum4shs 175#define vec_vsum4sbs __builtin_vec_vsum4sbs 176#define vec_vsum4ubs __builtin_vec_vsum4ubs 177#define vec_sum2s __builtin_vec_sum2s 178#define vec_sums __builtin_vec_sums 179#define vec_trunc __builtin_vec_trunc 180#define vec_vupkhpx __builtin_vec_vupkhpx 181#define vec_vupkhsh __builtin_vec_vupkhsh 182#define vec_vupkhsb __builtin_vec_vupkhsb 183#define vec_vupklpx __builtin_vec_vupklpx 184#define vec_vupklsh __builtin_vec_vupklsh 185#define vec_vupklsb __builtin_vec_vupklsb 186#define vec_abs __builtin_vec_abs 187#define vec_abss __builtin_vec_abss 188#define vec_add __builtin_vec_add 189#define vec_adds __builtin_vec_adds 190#define vec_and __builtin_vec_and 191#define vec_andc __builtin_vec_andc 192#define vec_avg __builtin_vec_avg 193#define vec_cmpeq __builtin_vec_cmpeq 194#define vec_cmpgt __builtin_vec_cmpgt 195#define vec_ctf __builtin_vec_ctf 196#define vec_dst __builtin_vec_dst 197#define vec_dstst __builtin_vec_dstst 198#define vec_dststt __builtin_vec_dststt 199#define vec_dstt __builtin_vec_dstt 200#define vec_ld __builtin_vec_ld 201#define vec_lde __builtin_vec_lde 202#define vec_ldl __builtin_vec_ldl 203#define vec_lvebx __builtin_vec_lvebx 204#define vec_lvehx __builtin_vec_lvehx 205#define vec_lvewx __builtin_vec_lvewx 206/* Cell only intrinsics. */ 207#ifdef __PPU__ 208#define vec_lvlx __builtin_vec_lvlx 209#define vec_lvlxl __builtin_vec_lvlxl 210#define vec_lvrx __builtin_vec_lvrx 211#define vec_lvrxl __builtin_vec_lvrxl 212#endif 213#define vec_lvsl __builtin_vec_lvsl 214#define vec_lvsr __builtin_vec_lvsr 215#define vec_max __builtin_vec_max 216#define vec_mergeh __builtin_vec_mergeh 217#define vec_mergel __builtin_vec_mergel 218#define vec_min __builtin_vec_min 219#define vec_mladd __builtin_vec_mladd 220#define vec_msum __builtin_vec_msum 221#define vec_msums __builtin_vec_msums 222#define vec_mule __builtin_vec_mule 223#define vec_mulo __builtin_vec_mulo 224#define vec_nor __builtin_vec_nor 225#define vec_or __builtin_vec_or 226#define vec_pack __builtin_vec_pack 227#define vec_packs __builtin_vec_packs 228#define vec_packsu __builtin_vec_packsu 229#define vec_perm __builtin_vec_perm 230#define vec_rl __builtin_vec_rl 231#define vec_sel __builtin_vec_sel 232#define vec_sl __builtin_vec_sl 233#define vec_sld __builtin_vec_sld 234#define vec_sll __builtin_vec_sll 235#define vec_slo __builtin_vec_slo 236#define vec_splat __builtin_vec_splat 237#define vec_sr __builtin_vec_sr 238#define vec_sra __builtin_vec_sra 239#define vec_srl __builtin_vec_srl 240#define vec_sro __builtin_vec_sro 241#define vec_st __builtin_vec_st 242#define vec_ste __builtin_vec_ste 243#define vec_stl __builtin_vec_stl 244#define vec_stvebx __builtin_vec_stvebx 245#define vec_stvehx __builtin_vec_stvehx 246#define vec_stvewx __builtin_vec_stvewx 247/* Cell only intrinsics. */ 248#ifdef __PPU__ 249#define vec_stvlx __builtin_vec_stvlx 250#define vec_stvlxl __builtin_vec_stvlxl 251#define vec_stvrx __builtin_vec_stvrx 252#define vec_stvrxl __builtin_vec_stvrxl 253#endif 254#define vec_sub __builtin_vec_sub 255#define vec_subs __builtin_vec_subs 256#define vec_sum __builtin_vec_sum 257#define vec_unpackh __builtin_vec_unpackh 258#define vec_unpackl __builtin_vec_unpackl 259#define vec_vaddubm __builtin_vec_vaddubm 260#define vec_vaddubs __builtin_vec_vaddubs 261#define vec_vadduhm __builtin_vec_vadduhm 262#define vec_vadduhs __builtin_vec_vadduhs 263#define vec_vadduwm __builtin_vec_vadduwm 264#define vec_vadduws __builtin_vec_vadduws 265#define vec_vcmpequb __builtin_vec_vcmpequb 266#define vec_vcmpequh __builtin_vec_vcmpequh 267#define vec_vcmpequw __builtin_vec_vcmpequw 268#define vec_vmaxub __builtin_vec_vmaxub 269#define vec_vmaxuh __builtin_vec_vmaxuh 270#define vec_vmaxuw __builtin_vec_vmaxuw 271#define vec_vminub __builtin_vec_vminub 272#define vec_vminuh __builtin_vec_vminuh 273#define vec_vminuw __builtin_vec_vminuw 274#define vec_vmrghb __builtin_vec_vmrghb 275#define vec_vmrghh __builtin_vec_vmrghh 276#define vec_vmrghw __builtin_vec_vmrghw 277#define vec_vmrglb __builtin_vec_vmrglb 278#define vec_vmrglh __builtin_vec_vmrglh 279#define vec_vmrglw __builtin_vec_vmrglw 280#define vec_vpkuhum __builtin_vec_vpkuhum 281#define vec_vpkuwum __builtin_vec_vpkuwum 282#define vec_vrlb __builtin_vec_vrlb 283#define vec_vrlh __builtin_vec_vrlh 284#define vec_vrlw __builtin_vec_vrlw 285#define vec_vslb __builtin_vec_vslb 286#define vec_vslh __builtin_vec_vslh 287#define vec_vslw __builtin_vec_vslw 288#define vec_vspltb __builtin_vec_vspltb 289#define vec_vsplth __builtin_vec_vsplth 290#define vec_vspltw __builtin_vec_vspltw 291#define vec_vsrab __builtin_vec_vsrab 292#define vec_vsrah __builtin_vec_vsrah 293#define vec_vsraw __builtin_vec_vsraw 294#define vec_vsrb __builtin_vec_vsrb 295#define vec_vsrh __builtin_vec_vsrh 296#define vec_vsrw __builtin_vec_vsrw 297#define vec_vsububs __builtin_vec_vsububs 298#define vec_vsububm __builtin_vec_vsububm 299#define vec_vsubuhm __builtin_vec_vsubuhm 300#define vec_vsubuhs __builtin_vec_vsubuhs 301#define vec_vsubuwm __builtin_vec_vsubuwm 302#define vec_vsubuws __builtin_vec_vsubuws 303#define vec_xor __builtin_vec_xor 304 305#define vec_extract __builtin_vec_extract 306#define vec_insert __builtin_vec_insert 307#define vec_splats __builtin_vec_splats 308#define vec_promote __builtin_vec_promote 309 310#ifdef __VSX__ 311/* VSX additions */ 312#define vec_div __builtin_vec_div 313#define vec_mul __builtin_vec_mul 314#define vec_msub __builtin_vec_msub 315#define vec_nmadd __builtin_vec_nmadd 316#define vec_nearbyint __builtin_vec_nearbyint 317#define vec_rint __builtin_vec_rint 318#define vec_sqrt __builtin_vec_sqrt 319#define vec_vsx_ld __builtin_vec_vsx_ld 320#define vec_vsx_st __builtin_vec_vsx_st 321#endif 322 323/* Predicates. 324 For C++, we use templates in order to allow non-parenthesized arguments. 325 For C, instead, we use macros since non-parenthesized arguments were 326 not allowed even in older GCC implementation of AltiVec. 327 328 In the future, we may add more magic to the back-end, so that no 329 one- or two-argument macros are used. */ 330 331#ifdef __cplusplus__ 332#define __altivec_unary_pred(NAME, CALL) \ 333template <class T> int NAME (T a1) { return CALL; } 334 335#define __altivec_scalar_pred(NAME, CALL) \ 336template <class T, class U> int NAME (T a1, U a2) { return CALL; } 337 338/* Given the vec_step of a type, return the corresponding bool type. */ 339template <int STEP> class __altivec_bool_ret { }; 340template <> class __altivec_bool_ret <4> { 341 typedef __vector __bool int __ret; 342}; 343template <> class __altivec_bool_ret <8> { 344 typedef __vector __bool short __ret; 345}; 346template <> class __altivec_bool_ret <16> { 347 typedef __vector __bool char __ret; 348}; 349 350/* Be very liberal in the pairs we accept. Mistakes such as passing 351 a `vector char' and `vector short' will be caught by the middle-end, 352 while any attempt to detect them here would produce hard to understand 353 error messages involving the implementation details of AltiVec. */ 354#define __altivec_binary_pred(NAME, CALL) \ 355template <class T, class U> \ 356typename __altivec_bool_ret <vec_step (T)>::__ret \ 357NAME (T a1, U a2) \ 358{ \ 359 return CALL; \ 360} 361 362__altivec_binary_pred(vec_cmplt, 363 __builtin_vec_cmpgt (a2, a1)) 364__altivec_binary_pred(vec_cmple, 365 __builtin_vec_cmpge (a2, a1)) 366 367__altivec_scalar_pred(vec_all_in, 368 __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2)) 369__altivec_scalar_pred(vec_any_out, 370 __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2)) 371 372__altivec_unary_pred(vec_all_nan, 373 __builtin_altivec_vcmpeq_p (__CR6_EQ, a1, a1)) 374__altivec_unary_pred(vec_any_nan, 375 __builtin_altivec_vcmpeq_p (__CR6_LT_REV, a1, a1)) 376 377__altivec_unary_pred(vec_all_numeric, 378 __builtin_altivec_vcmpeq_p (__CR6_LT, a1, a1)) 379__altivec_unary_pred(vec_any_numeric, 380 __builtin_altivec_vcmpeq_p (__CR6_EQ_REV, a1, a1)) 381 382__altivec_scalar_pred(vec_all_eq, 383 __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2)) 384__altivec_scalar_pred(vec_all_ne, 385 __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2)) 386__altivec_scalar_pred(vec_any_eq, 387 __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2)) 388__altivec_scalar_pred(vec_any_ne, 389 __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2)) 390 391__altivec_scalar_pred(vec_all_gt, 392 __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2)) 393__altivec_scalar_pred(vec_all_lt, 394 __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1)) 395__altivec_scalar_pred(vec_any_gt, 396 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2)) 397__altivec_scalar_pred(vec_any_lt, 398 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1)) 399 400__altivec_scalar_pred(vec_all_ngt, 401 __builtin_altivec_vcmpgt_p (__CR6_EQ, a1, a2)) 402__altivec_scalar_pred(vec_all_nlt, 403 __builtin_altivec_vcmpgt_p (__CR6_EQ, a2, a1)) 404__altivec_scalar_pred(vec_any_ngt, 405 __builtin_altivec_vcmpgt_p (__CR6_LT_REV, a1, a2)) 406__altivec_scalar_pred(vec_any_nlt, 407 __builtin_altivec_vcmpgt_p (__CR6_LT_REV, a2, a1)) 408 409/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, 410 while for integer types it is converted to __builtin_vec_vcmpgt_p, 411 with inverted args and condition code. */ 412__altivec_scalar_pred(vec_all_le, 413 __builtin_vec_vcmpge_p (__CR6_LT, a2, a1)) 414__altivec_scalar_pred(vec_all_ge, 415 __builtin_vec_vcmpge_p (__CR6_LT, a1, a2)) 416__altivec_scalar_pred(vec_any_le, 417 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1)) 418__altivec_scalar_pred(vec_any_ge, 419 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2)) 420 421__altivec_scalar_pred(vec_all_nge, 422 __builtin_altivec_vcmpge_p (__CR6_EQ, a1, a2)) 423__altivec_scalar_pred(vec_all_nle, 424 __builtin_altivec_vcmpge_p (__CR6_EQ, a2, a1)) 425__altivec_scalar_pred(vec_any_nge, 426 __builtin_altivec_vcmpge_p (__CR6_LT_REV, a1, a2)) 427__altivec_scalar_pred(vec_any_nle, 428 __builtin_altivec_vcmpge_p (__CR6_LT_REV, a2, a1)) 429 430#undef __altivec_scalar_pred 431#undef __altivec_unary_pred 432#undef __altivec_binary_pred 433#else 434#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1)) 435#define vec_cmple(a1, a2) __builtin_vec_cmpge ((a2), (a1)) 436 437#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2)) 438#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2)) 439 440#define vec_all_nan(a1) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a1)) 441#define vec_any_nan(a1) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a1)) 442 443#define vec_all_numeric(a1) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a1)) 444#define vec_any_numeric(a1) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a1)) 445 446#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2)) 447#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2)) 448#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2)) 449#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2)) 450 451#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2)) 452#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1)) 453#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2)) 454#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1)) 455 456#define vec_all_ngt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ, (a1), (a2)) 457#define vec_all_nlt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ, (a2), (a1)) 458#define vec_any_ngt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT_REV, (a1), (a2)) 459#define vec_any_nlt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT_REV, (a2), (a1)) 460 461/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, 462 while for integer types it is converted to __builtin_vec_vcmpgt_p, 463 with inverted args and condition code. */ 464#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1)) 465#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2)) 466#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1)) 467#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2)) 468 469#define vec_all_nge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ, (a1), (a2)) 470#define vec_all_nle(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ, (a2), (a1)) 471#define vec_any_nge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT_REV, (a1), (a2)) 472#define vec_any_nle(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT_REV, (a2), (a1)) 473#endif 474 475/* These do not accept vectors, so they do not have a __builtin_vec_* 476 counterpart. */ 477#define vec_dss(x) __builtin_altivec_dss((x)) 478#define vec_dssall() __builtin_altivec_dssall () 479#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ()) 480#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x)) 481#define vec_splat_s16(x) __builtin_altivec_vspltish ((x)) 482#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x)) 483#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x))) 484#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x))) 485#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x))) 486 487/* This also accepts a type for its parameter, so it is not enough 488 to #define vec_step to __builtin_vec_step. */ 489#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0) 490 491#endif /* _ALTIVEC_H */ 492