190075Sobrien/* PowerPC AltiVec include file. 2169689Skan Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 390075Sobrien Contributed by Aldy Hernandez (aldyh@redhat.com). 4169689Skan Rewritten by Paolo Bonzini (bonzini@gnu.org). 590075Sobrien 6132718Skan This file is part of GCC. 790075Sobrien 8132718Skan GCC is free software; you can redistribute it and/or modify it 9132718Skan under the terms of the GNU General Public License as published 10132718Skan by the Free Software Foundation; either version 2, or (at your 11132718Skan option) any later version. 1290075Sobrien 13132718Skan GCC is distributed in the hope that it will be useful, but WITHOUT 14132718Skan ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 15132718Skan or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 16132718Skan License for more details. 1790075Sobrien 18132718Skan You should have received a copy of the GNU General Public License 19132718Skan along with GCC; see the file COPYING. If not, write to the 20169689Skan Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 21169689Skan MA 02110-1301, USA. */ 2290075Sobrien 2390075Sobrien/* As a special exception, if you include this header file into source 2490075Sobrien files compiled by GCC, this header file does not by itself cause 2590075Sobrien the resulting executable to be covered by the GNU General Public 2690075Sobrien License. This exception does not however invalidate any other 2790075Sobrien reasons why the executable file might be covered by the GNU General 2890075Sobrien Public License. */ 2990075Sobrien 3090075Sobrien/* Implemented to conform to the specification included in the AltiVec 3190075Sobrien Technology Programming Interface Manual (ALTIVECPIM/D 6/1999 Rev 0). */ 3290075Sobrien 3390075Sobrien#ifndef _ALTIVEC_H 3490075Sobrien#define _ALTIVEC_H 1 3590075Sobrien 36146895Skan#if !defined(__VEC__) || !defined(__ALTIVEC__) 37146895Skan#error Use the "-maltivec" flag to enable PowerPC AltiVec support 3896263Sobrien#endif 3990075Sobrien 40146895Skan/* If __APPLE_ALTIVEC__ is defined, the compiler supports 'vector', 41146895Skan 'pixel' and 'bool' as context-sensitive AltiVec keywords (in 42146895Skan non-AltiVec contexts, they revert to their original meanings, 43146895Skan if any), so we do not need to define them as macros. */ 4490075Sobrien 45146895Skan#if !defined(__APPLE_ALTIVEC__) 46146895Skan/* You are allowed to undef these for C++ compatibility. */ 4790075Sobrien#define vector __vector 48146895Skan#define pixel __pixel 49146895Skan#define bool __bool 50146895Skan#endif 5190075Sobrien 52146895Skan/* Condition register codes for AltiVec predicates. */ 5396263Sobrien 5496263Sobrien#define __CR6_EQ 0 5596263Sobrien#define __CR6_EQ_REV 1 5696263Sobrien#define __CR6_LT 2 5796263Sobrien#define __CR6_LT_REV 3 5896263Sobrien 59169689Skan/* Synonyms. */ 6096263Sobrien#define vec_vaddcuw vec_addc 6196263Sobrien#define vec_vand vec_and 6296263Sobrien#define vec_vandc vec_andc 6396263Sobrien#define vec_vrfip vec_ceil 6496263Sobrien#define vec_vcmpbfp vec_cmpb 6596263Sobrien#define vec_vcmpgefp vec_cmpge 6696263Sobrien#define vec_vctsxs vec_cts 6796263Sobrien#define vec_vctuxs vec_ctu 6896263Sobrien#define vec_vexptefp vec_expte 6996263Sobrien#define vec_vrfim vec_floor 7096263Sobrien#define vec_lvx vec_ld 7196263Sobrien#define vec_lvxl vec_ldl 7296263Sobrien#define vec_vlogefp vec_loge 7396263Sobrien#define vec_vmaddfp vec_madd 7496263Sobrien#define vec_vmhaddshs vec_madds 7596263Sobrien#define vec_vmladduhm vec_mladd 7696263Sobrien#define vec_vmhraddshs vec_mradds 7796263Sobrien#define vec_vnmsubfp vec_nmsub 7896263Sobrien#define vec_vnor vec_nor 7996263Sobrien#define vec_vor vec_or 8096263Sobrien#define vec_vpkpx vec_packpx 8196263Sobrien#define vec_vperm vec_perm 8296263Sobrien#define vec_vrefp vec_re 8396263Sobrien#define vec_vrfin vec_round 8496263Sobrien#define vec_vrsqrtefp vec_rsqrte 8596263Sobrien#define vec_vsel vec_sel 8696263Sobrien#define vec_vsldoi vec_sld 8796263Sobrien#define vec_vsl vec_sll 8896263Sobrien#define vec_vslo vec_slo 8996263Sobrien#define vec_vspltisb vec_splat_s8 9096263Sobrien#define vec_vspltish vec_splat_s16 9196263Sobrien#define vec_vspltisw vec_splat_s32 9296263Sobrien#define vec_vsr vec_srl 9396263Sobrien#define vec_vsro vec_sro 9496263Sobrien#define vec_stvx vec_st 9596263Sobrien#define vec_stvxl vec_stl 9696263Sobrien#define vec_vsubcuw vec_subc 9796263Sobrien#define vec_vsum2sws vec_sum2s 9896263Sobrien#define vec_vsumsws vec_sums 9996263Sobrien#define vec_vrfiz vec_trunc 10096263Sobrien#define vec_vxor vec_xor 10196263Sobrien 102169689Skan/* Functions that are resolved by the backend to one of the 103169689Skan typed builtins. */ 104169689Skan#define vec_vaddfp __builtin_vec_vaddfp 105169689Skan#define vec_addc __builtin_vec_addc 106169689Skan#define vec_vaddsws __builtin_vec_vaddsws 107169689Skan#define vec_vaddshs __builtin_vec_vaddshs 108169689Skan#define vec_vaddsbs __builtin_vec_vaddsbs 109169689Skan#define vec_vavgsw __builtin_vec_vavgsw 110169689Skan#define vec_vavguw __builtin_vec_vavguw 111169689Skan#define vec_vavgsh __builtin_vec_vavgsh 112169689Skan#define vec_vavguh __builtin_vec_vavguh 113169689Skan#define vec_vavgsb __builtin_vec_vavgsb 114169689Skan#define vec_vavgub __builtin_vec_vavgub 115169689Skan#define vec_ceil __builtin_vec_ceil 116169689Skan#define vec_cmpb __builtin_vec_cmpb 117169689Skan#define vec_vcmpeqfp __builtin_vec_vcmpeqfp 118169689Skan#define vec_cmpge __builtin_vec_cmpge 119169689Skan#define vec_vcmpgtfp __builtin_vec_vcmpgtfp 120169689Skan#define vec_vcmpgtsw __builtin_vec_vcmpgtsw 121169689Skan#define vec_vcmpgtuw __builtin_vec_vcmpgtuw 122169689Skan#define vec_vcmpgtsh __builtin_vec_vcmpgtsh 123169689Skan#define vec_vcmpgtuh __builtin_vec_vcmpgtuh 124169689Skan#define vec_vcmpgtsb __builtin_vec_vcmpgtsb 125169689Skan#define vec_vcmpgtub __builtin_vec_vcmpgtub 126169689Skan#define vec_vcfsx __builtin_vec_vcfsx 127169689Skan#define vec_vcfux __builtin_vec_vcfux 128169689Skan#define vec_cts __builtin_vec_cts 129169689Skan#define vec_ctu __builtin_vec_ctu 130169689Skan#define vec_expte __builtin_vec_expte 131169689Skan#define vec_floor __builtin_vec_floor 132169689Skan#define vec_loge __builtin_vec_loge 133169689Skan#define vec_madd __builtin_vec_madd 134169689Skan#define vec_madds __builtin_vec_madds 135169689Skan#define vec_mtvscr __builtin_vec_mtvscr 136169689Skan#define vec_vmaxfp __builtin_vec_vmaxfp 137169689Skan#define vec_vmaxsw __builtin_vec_vmaxsw 138169689Skan#define vec_vmaxsh __builtin_vec_vmaxsh 139169689Skan#define vec_vmaxsb __builtin_vec_vmaxsb 140169689Skan#define vec_vminfp __builtin_vec_vminfp 141169689Skan#define vec_vminsw __builtin_vec_vminsw 142169689Skan#define vec_vminsh __builtin_vec_vminsh 143169689Skan#define vec_vminsb __builtin_vec_vminsb 144169689Skan#define vec_mradds __builtin_vec_mradds 145169689Skan#define vec_vmsumshm __builtin_vec_vmsumshm 146169689Skan#define vec_vmsumuhm __builtin_vec_vmsumuhm 147169689Skan#define vec_vmsummbm __builtin_vec_vmsummbm 148169689Skan#define vec_vmsumubm __builtin_vec_vmsumubm 149169689Skan#define vec_vmsumshs __builtin_vec_vmsumshs 150169689Skan#define vec_vmsumuhs __builtin_vec_vmsumuhs 151169689Skan#define vec_vmulesb __builtin_vec_vmulesb 152169689Skan#define vec_vmulesh __builtin_vec_vmulesh 153169689Skan#define vec_vmuleuh __builtin_vec_vmuleuh 154169689Skan#define vec_vmuleub __builtin_vec_vmuleub 155169689Skan#define vec_vmulosh __builtin_vec_vmulosh 156169689Skan#define vec_vmulouh __builtin_vec_vmulouh 157169689Skan#define vec_vmulosb __builtin_vec_vmulosb 158169689Skan#define vec_vmuloub __builtin_vec_vmuloub 159169689Skan#define vec_nmsub __builtin_vec_nmsub 160169689Skan#define vec_packpx __builtin_vec_packpx 161169689Skan#define vec_vpkswss __builtin_vec_vpkswss 162169689Skan#define vec_vpkuwus __builtin_vec_vpkuwus 163169689Skan#define vec_vpkshss __builtin_vec_vpkshss 164169689Skan#define vec_vpkuhus __builtin_vec_vpkuhus 165169689Skan#define vec_vpkswus __builtin_vec_vpkswus 166169689Skan#define vec_vpkshus __builtin_vec_vpkshus 167169689Skan#define vec_re __builtin_vec_re 168169689Skan#define vec_round __builtin_vec_round 169169689Skan#define vec_rsqrte __builtin_vec_rsqrte 170169689Skan#define vec_vsubfp __builtin_vec_vsubfp 171169689Skan#define vec_subc __builtin_vec_subc 172169689Skan#define vec_vsubsws __builtin_vec_vsubsws 173169689Skan#define vec_vsubshs __builtin_vec_vsubshs 174169689Skan#define vec_vsubsbs __builtin_vec_vsubsbs 175169689Skan#define vec_sum4s __builtin_vec_sum4s 176169689Skan#define vec_vsum4shs __builtin_vec_vsum4shs 177169689Skan#define vec_vsum4sbs __builtin_vec_vsum4sbs 178169689Skan#define vec_vsum4ubs __builtin_vec_vsum4ubs 179169689Skan#define vec_sum2s __builtin_vec_sum2s 180169689Skan#define vec_sums __builtin_vec_sums 181169689Skan#define vec_trunc __builtin_vec_trunc 182169689Skan#define vec_vupkhpx __builtin_vec_vupkhpx 183169689Skan#define vec_vupkhsh __builtin_vec_vupkhsh 184169689Skan#define vec_vupkhsb __builtin_vec_vupkhsb 185169689Skan#define vec_vupklpx __builtin_vec_vupklpx 186169689Skan#define vec_vupklsh __builtin_vec_vupklsh 187169689Skan#define vec_vupklsb __builtin_vec_vupklsb 188169689Skan#define vec_abs __builtin_vec_abs 189169689Skan#define vec_abss __builtin_vec_abss 190169689Skan#define vec_add __builtin_vec_add 191169689Skan#define vec_adds __builtin_vec_adds 192169689Skan#define vec_and __builtin_vec_and 193169689Skan#define vec_andc __builtin_vec_andc 194169689Skan#define vec_avg __builtin_vec_avg 195169689Skan#define vec_cmpeq __builtin_vec_cmpeq 196169689Skan#define vec_cmpgt __builtin_vec_cmpgt 197169689Skan#define vec_ctf __builtin_vec_ctf 198169689Skan#define vec_dst __builtin_vec_dst 199169689Skan#define vec_dstst __builtin_vec_dstst 200169689Skan#define vec_dststt __builtin_vec_dststt 201169689Skan#define vec_dstt __builtin_vec_dstt 202169689Skan#define vec_ld __builtin_vec_ld 203169689Skan#define vec_lde __builtin_vec_lde 204169689Skan#define vec_ldl __builtin_vec_ldl 205169689Skan#define vec_lvebx __builtin_vec_lvebx 206169689Skan#define vec_lvehx __builtin_vec_lvehx 207169689Skan#define vec_lvewx __builtin_vec_lvewx 208169689Skan#define vec_lvsl __builtin_vec_lvsl 209169689Skan#define vec_lvsr __builtin_vec_lvsr 210169689Skan#define vec_max __builtin_vec_max 211169689Skan#define vec_mergeh __builtin_vec_mergeh 212169689Skan#define vec_mergel __builtin_vec_mergel 213169689Skan#define vec_min __builtin_vec_min 214169689Skan#define vec_mladd __builtin_vec_mladd 215169689Skan#define vec_msum __builtin_vec_msum 216169689Skan#define vec_msums __builtin_vec_msums 217169689Skan#define vec_mule __builtin_vec_mule 218169689Skan#define vec_mulo __builtin_vec_mulo 219169689Skan#define vec_nor __builtin_vec_nor 220169689Skan#define vec_or __builtin_vec_or 221169689Skan#define vec_pack __builtin_vec_pack 222169689Skan#define vec_packs __builtin_vec_packs 223169689Skan#define vec_packsu __builtin_vec_packsu 224169689Skan#define vec_perm __builtin_vec_perm 225169689Skan#define vec_rl __builtin_vec_rl 226169689Skan#define vec_sel __builtin_vec_sel 227169689Skan#define vec_sl __builtin_vec_sl 228169689Skan#define vec_sld __builtin_vec_sld 229169689Skan#define vec_sll __builtin_vec_sll 230169689Skan#define vec_slo __builtin_vec_slo 231169689Skan#define vec_splat __builtin_vec_splat 232169689Skan#define vec_sr __builtin_vec_sr 233169689Skan#define vec_sra __builtin_vec_sra 234169689Skan#define vec_srl __builtin_vec_srl 235169689Skan#define vec_sro __builtin_vec_sro 236169689Skan#define vec_st __builtin_vec_st 237169689Skan#define vec_ste __builtin_vec_ste 238169689Skan#define vec_stl __builtin_vec_stl 239169689Skan#define vec_stvebx __builtin_vec_stvebx 240169689Skan#define vec_stvehx __builtin_vec_stvehx 241169689Skan#define vec_stvewx __builtin_vec_stvewx 242169689Skan#define vec_sub __builtin_vec_sub 243169689Skan#define vec_subs __builtin_vec_subs 244169689Skan#define vec_sum __builtin_vec_sum 245169689Skan#define vec_unpackh __builtin_vec_unpackh 246169689Skan#define vec_unpackl __builtin_vec_unpackl 247169689Skan#define vec_vaddubm __builtin_vec_vaddubm 248169689Skan#define vec_vaddubs __builtin_vec_vaddubs 249169689Skan#define vec_vadduhm __builtin_vec_vadduhm 250169689Skan#define vec_vadduhs __builtin_vec_vadduhs 251169689Skan#define vec_vadduwm __builtin_vec_vadduwm 252169689Skan#define vec_vadduws __builtin_vec_vadduws 253169689Skan#define vec_vcmpequb __builtin_vec_vcmpequb 254169689Skan#define vec_vcmpequh __builtin_vec_vcmpequh 255169689Skan#define vec_vcmpequw __builtin_vec_vcmpequw 256169689Skan#define vec_vmaxub __builtin_vec_vmaxub 257169689Skan#define vec_vmaxuh __builtin_vec_vmaxuh 258169689Skan#define vec_vmaxuw __builtin_vec_vmaxuw 259169689Skan#define vec_vminub __builtin_vec_vminub 260169689Skan#define vec_vminuh __builtin_vec_vminuh 261169689Skan#define vec_vminuw __builtin_vec_vminuw 262169689Skan#define vec_vmrghb __builtin_vec_vmrghb 263169689Skan#define vec_vmrghh __builtin_vec_vmrghh 264169689Skan#define vec_vmrghw __builtin_vec_vmrghw 265169689Skan#define vec_vmrglb __builtin_vec_vmrglb 266169689Skan#define vec_vmrglh __builtin_vec_vmrglh 267169689Skan#define vec_vmrglw __builtin_vec_vmrglw 268169689Skan#define vec_vpkuhum __builtin_vec_vpkuhum 269169689Skan#define vec_vpkuwum __builtin_vec_vpkuwum 270169689Skan#define vec_vrlb __builtin_vec_vrlb 271169689Skan#define vec_vrlh __builtin_vec_vrlh 272169689Skan#define vec_vrlw __builtin_vec_vrlw 273169689Skan#define vec_vslb __builtin_vec_vslb 274169689Skan#define vec_vslh __builtin_vec_vslh 275169689Skan#define vec_vslw __builtin_vec_vslw 276169689Skan#define vec_vspltb __builtin_vec_vspltb 277169689Skan#define vec_vsplth __builtin_vec_vsplth 278169689Skan#define vec_vspltw __builtin_vec_vspltw 279169689Skan#define vec_vsrab __builtin_vec_vsrab 280169689Skan#define vec_vsrah __builtin_vec_vsrah 281169689Skan#define vec_vsraw __builtin_vec_vsraw 282169689Skan#define vec_vsrb __builtin_vec_vsrb 283169689Skan#define vec_vsrh __builtin_vec_vsrh 284169689Skan#define vec_vsrw __builtin_vec_vsrw 285169689Skan#define vec_vsububs __builtin_vec_vsububs 286169689Skan#define vec_vsububm __builtin_vec_vsububm 287169689Skan#define vec_vsubuhm __builtin_vec_vsubuhm 288169689Skan#define vec_vsubuhs __builtin_vec_vsubuhs 289169689Skan#define vec_vsubuwm __builtin_vec_vsubuwm 290169689Skan#define vec_vsubuws __builtin_vec_vsubuws 291169689Skan#define vec_xor __builtin_vec_xor 29290075Sobrien 293169689Skan/* Predicates. 294169689Skan For C++, we use templates in order to allow non-parenthesized arguments. 295169689Skan For C, instead, we use macros since non-parenthesized arguments were 296169689Skan not allowed even in older GCC implementation of AltiVec. 297132718Skan 298169689Skan In the future, we may add more magic to the back-end, so that no 299169689Skan one- or two-argument macros are used. */ 300102780Skan 301169689Skan#ifdef __cplusplus__ 302169689Skan#define __altivec_unary_pred(NAME, CALL) \ 303169689Skantemplate <class T> int NAME (T a1) { return CALL; } 304102780Skan 305169689Skan#define __altivec_scalar_pred(NAME, CALL) \ 306169689Skantemplate <class T, class U> int NAME (T a1, U a2) { return CALL; } 307102780Skan 308169689Skan/* Given the vec_step of a type, return the corresponding bool type. */ 309169689Skantemplate <int STEP> class __altivec_bool_ret { }; 310169689Skantemplate <> class __altivec_bool_ret <4> { 311169689Skan typedef __vector __bool int __ret; 312146895Skan}; 313169689Skantemplate <> class __altivec_bool_ret <8> { 314169689Skan typedef __vector __bool short __ret; 315146895Skan}; 316169689Skantemplate <> class __altivec_bool_ret <16> { 317169689Skan typedef __vector __bool char __ret; 318146895Skan}; 319146895Skan 320169689Skan/* Be very liberal in the pairs we accept. Mistakes such as passing 321169689Skan a `vector char' and `vector short' will be caught by the middle-end, 322169689Skan while any attempt to detect them here would produce hard to understand 323169689Skan error messages involving the implementation details of AltiVec. */ 324169689Skan#define __altivec_binary_pred(NAME, CALL) \ 325169689Skantemplate <class T, class U> \ 326169689Skantypename __altivec_bool_ret <vec_step (T)>::__ret \ 327169689SkanNAME (T a1, U a2) \ 328169689Skan{ \ 329169689Skan return CALL; \ 33096263Sobrien} 33196263Sobrien 332169689Skan__altivec_binary_pred(vec_cmplt, 333169689Skan __builtin_vec_cmpgt (a2, a1)) 334169689Skan__altivec_binary_pred(vec_cmple, 335260075Spfg __builtin_vec_cmpge (a2, a1)) 33696263Sobrien 337169689Skan__altivec_scalar_pred(vec_all_in, 338169689Skan __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2)) 339169689Skan__altivec_scalar_pred(vec_any_out, 340169689Skan __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2)) 34196263Sobrien 342169689Skan__altivec_unary_pred(vec_all_nan, 343169689Skan __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a1)) 344169689Skan__altivec_unary_pred(vec_any_nan, 345169689Skan __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a1)) 34696263Sobrien 347169689Skan__altivec_unary_pred(vec_all_numeric, 348169689Skan __builtin_altivec_vcmpeqfp_p (__CR6_LT, a1, a1)) 349169689Skan__altivec_unary_pred(vec_any_numeric, 350169689Skan __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, a1, a1)) 35196263Sobrien 352169689Skan__altivec_scalar_pred(vec_all_eq, 353169689Skan __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2)) 354169689Skan__altivec_scalar_pred(vec_all_ne, 355169689Skan __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2)) 356169689Skan__altivec_scalar_pred(vec_any_eq, 357169689Skan __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2)) 358169689Skan__altivec_scalar_pred(vec_any_ne, 359169689Skan __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2)) 36096263Sobrien 361169689Skan__altivec_scalar_pred(vec_all_gt, 362169689Skan __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2)) 363169689Skan__altivec_scalar_pred(vec_all_lt, 364169689Skan __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1)) 365169689Skan__altivec_scalar_pred(vec_any_gt, 366169689Skan __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2)) 367169689Skan__altivec_scalar_pred(vec_any_lt, 368169689Skan __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1)) 36996263Sobrien 370169689Skan__altivec_scalar_pred(vec_all_ngt, 371169689Skan __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a1, a2)) 372169689Skan__altivec_scalar_pred(vec_all_nlt, 373169689Skan __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a2, a1)) 374169689Skan__altivec_scalar_pred(vec_any_ngt, 375169689Skan __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a1, a2)) 376169689Skan__altivec_scalar_pred(vec_any_nlt, 377169689Skan __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a2, a1)) 37896263Sobrien 379169689Skan/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, 380169689Skan while for integer types it is converted to __builtin_vec_vcmpgt_p, 381169689Skan with inverted args and condition code. */ 382169689Skan__altivec_scalar_pred(vec_all_le, 383169689Skan __builtin_vec_vcmpge_p (__CR6_LT, a2, a1)) 384169689Skan__altivec_scalar_pred(vec_all_ge, 385169689Skan __builtin_vec_vcmpge_p (__CR6_LT, a1, a2)) 386169689Skan__altivec_scalar_pred(vec_any_le, 387169689Skan __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1)) 388169689Skan__altivec_scalar_pred(vec_any_ge, 389169689Skan __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2)) 39096263Sobrien 391169689Skan__altivec_scalar_pred(vec_all_nge, 392169689Skan __builtin_altivec_vcmpgefp_p (__CR6_EQ, a1, a2)) 393169689Skan__altivec_scalar_pred(vec_all_nle, 394169689Skan __builtin_altivec_vcmpgefp_p (__CR6_EQ, a2, a1)) 395169689Skan__altivec_scalar_pred(vec_any_nge, 396169689Skan __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a1, a2)) 397169689Skan__altivec_scalar_pred(vec_any_nle, 398169689Skan __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a2, a1)) 39996263Sobrien 400169689Skan#undef __altivec_scalar_pred 401169689Skan#undef __altivec_unary_pred 402169689Skan#undef __altivec_binary_pred 403169689Skan#else 404169689Skan#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1)) 405260075Spfg#define vec_cmple(a1, a2) __builtin_vec_cmpge ((a2), (a1)) 40696263Sobrien 407169689Skan#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2)) 408169689Skan#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2)) 40996263Sobrien 410169689Skan#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (a1), (a1)) 411169689Skan#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, (a1), (a1)) 41296263Sobrien 413169689Skan#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT, (a1), (a1)) 414169689Skan#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, (a1), (a1)) 41596263Sobrien 416169689Skan#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2)) 417169689Skan#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2)) 418169689Skan#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2)) 419169689Skan#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2)) 42096263Sobrien 421169689Skan#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2)) 422169689Skan#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1)) 423169689Skan#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2)) 424169689Skan#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1)) 42596263Sobrien 426169689Skan#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a1), (a2)) 427169689Skan#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a2), (a1)) 428169689Skan#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a1), (a2)) 429169689Skan#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a2), (a1)) 43096263Sobrien 431169689Skan/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, 432169689Skan while for integer types it is converted to __builtin_vec_vcmpgt_p, 433169689Skan with inverted args and condition code. */ 434169689Skan#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1)) 435169689Skan#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2)) 436169689Skan#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1)) 437169689Skan#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2)) 43896263Sobrien 439169689Skan#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a1), (a2)) 440169689Skan#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a2), (a1)) 441169689Skan#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a1), (a2)) 442169689Skan#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a2), (a1)) 443169689Skan#endif 44496263Sobrien 445169689Skan/* These do not accept vectors, so they do not have a __builtin_vec_* 446169689Skan counterpart. */ 447169689Skan#define vec_dss(x) __builtin_altivec_dss((x)) 44890075Sobrien#define vec_dssall() __builtin_altivec_dssall () 449169689Skan#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ()) 450169689Skan#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x)) 451169689Skan#define vec_splat_s16(x) __builtin_altivec_vspltish ((x)) 452169689Skan#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x)) 453169689Skan#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x))) 454169689Skan#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x))) 455169689Skan#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x))) 45690075Sobrien 457169689Skan/* This also accepts a type for its parameter, so it is not enough 458169689Skan to #define vec_step to __builtin_vec_step. */ 459169689Skan#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0) 46090075Sobrien 46190075Sobrien#endif /* _ALTIVEC_H */ 462