altivec.h revision 169689
1306196Sjkim/* PowerPC AltiVec include file. 296593Smarkm Copyright (C) 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 396593Smarkm Contributed by Aldy Hernandez (aldyh@redhat.com). 4142429Snectar Rewritten by Paolo Bonzini (bonzini@gnu.org). 596593Smarkm 696593Smarkm This file is part of GCC. 796593Smarkm 896593Smarkm GCC is free software; you can redistribute it and/or modify it 996593Smarkm under the terms of the GNU General Public License as published 1096593Smarkm by the Free Software Foundation; either version 2, or (at your 1196593Smarkm option) any later version. 1296593Smarkm 1396593Smarkm GCC is distributed in the hope that it will be useful, but WITHOUT 1496593Smarkm ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 1596593Smarkm or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 1696593Smarkm License for more details. 1796593Smarkm 1896593Smarkm You should have received a copy of the GNU General Public License 1996593Smarkm along with GCC; see the file COPYING. If not, write to the 20215698Ssimon Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, 21215698Ssimon MA 02110-1301, USA. */ 22215698Ssimon 23215698Ssimon/* As a special exception, if you include this header file into source 24215698Ssimon files compiled by GCC, this header file does not by itself cause 2596593Smarkm the resulting executable to be covered by the GNU General Public 2696593Smarkm License. This exception does not however invalidate any other 2796593Smarkm reasons why the executable file might be covered by the GNU General 2896593Smarkm Public License. */ 2996593Smarkm 3096593Smarkm/* Implemented to conform to the specification included in the AltiVec 3196593Smarkm Technology Programming Interface Manual (ALTIVECPIM/D 6/1999 Rev 0). */ 3296593Smarkm 3396593Smarkm#ifndef _ALTIVEC_H 3496593Smarkm#define _ALTIVEC_H 1 3596593Smarkm 3696593Smarkm#if !defined(__VEC__) || !defined(__ALTIVEC__) 3796593Smarkm#error Use the "-maltivec" flag to enable PowerPC AltiVec support 3896593Smarkm#endif 3996593Smarkm 4096593Smarkm/* If __APPLE_ALTIVEC__ is defined, the compiler supports 'vector', 41276864Sjkim 'pixel' and 'bool' as context-sensitive AltiVec keywords (in 42276864Sjkim non-AltiVec contexts, they revert to their original meanings, 4396593Smarkm if any), so we do not need to define them as macros. */ 4496593Smarkm 45215698Ssimon#if !defined(__APPLE_ALTIVEC__) 46215698Ssimon/* You are allowed to undef these for C++ compatibility. */ 47215698Ssimon#define vector __vector 48215698Ssimon#define pixel __pixel 49142429Snectar#define bool __bool 50215698Ssimon#endif 51142429Snectar 52142429Snectar/* Condition register codes for AltiVec predicates. */ 53276864Sjkim 54276864Sjkim#define __CR6_EQ 0 55276864Sjkim#define __CR6_EQ_REV 1 5696593Smarkm#define __CR6_LT 2 57276864Sjkim#define __CR6_LT_REV 3 58276864Sjkim 59276864Sjkim/* Synonyms. */ 60276864Sjkim#define vec_vaddcuw vec_addc 61276864Sjkim#define vec_vand vec_and 62276864Sjkim#define vec_vandc vec_andc 63215698Ssimon#define vec_vrfip vec_ceil 64276864Sjkim#define vec_vcmpbfp vec_cmpb 65276864Sjkim#define vec_vcmpgefp vec_cmpge 66276864Sjkim#define vec_vctsxs vec_cts 67276864Sjkim#define vec_vctuxs vec_ctu 68276864Sjkim#define vec_vexptefp vec_expte 69215698Ssimon#define vec_vrfim vec_floor 70276864Sjkim#define vec_lvx vec_ld 7196593Smarkm#define vec_lvxl vec_ldl 7296593Smarkm#define vec_vlogefp vec_loge 7396593Smarkm#define vec_vmaddfp vec_madd 7496593Smarkm#define vec_vmhaddshs vec_madds 7596593Smarkm#define vec_vmladduhm vec_mladd 7696593Smarkm#define vec_vmhraddshs vec_mradds 7796593Smarkm#define vec_vnmsubfp vec_nmsub 7896593Smarkm#define vec_vnor vec_nor 7996593Smarkm#define vec_vor vec_or 8096593Smarkm#define vec_vpkpx vec_packpx 8196593Smarkm#define vec_vperm vec_perm 8296593Smarkm#define vec_vrefp vec_re 8396593Smarkm#define vec_vrfin vec_round 8496593Smarkm#define vec_vrsqrtefp vec_rsqrte 8596593Smarkm#define vec_vsel vec_sel 8696593Smarkm#define vec_vsldoi vec_sld 8796593Smarkm#define vec_vsl vec_sll 8896593Smarkm#define vec_vslo vec_slo 8996593Smarkm#define vec_vspltisb vec_splat_s8 9096593Smarkm#define vec_vspltish vec_splat_s16 9196593Smarkm#define vec_vspltisw vec_splat_s32 9296593Smarkm#define vec_vsr vec_srl 9396593Smarkm#define vec_vsro vec_sro 9496593Smarkm#define vec_stvx vec_st 9596593Smarkm#define vec_stvxl vec_stl 9696593Smarkm#define vec_vsubcuw vec_subc 9796593Smarkm#define vec_vsum2sws vec_sum2s 9896593Smarkm#define vec_vsumsws vec_sums 9996593Smarkm#define vec_vrfiz vec_trunc 10096593Smarkm#define vec_vxor vec_xor 10196593Smarkm 10296593Smarkm/* Functions that are resolved by the backend to one of the 10396593Smarkm typed builtins. */ 10496593Smarkm#define vec_vaddfp __builtin_vec_vaddfp 10596593Smarkm#define vec_addc __builtin_vec_addc 10696593Smarkm#define vec_vaddsws __builtin_vec_vaddsws 10796593Smarkm#define vec_vaddshs __builtin_vec_vaddshs 10896593Smarkm#define vec_vaddsbs __builtin_vec_vaddsbs 10996593Smarkm#define vec_vavgsw __builtin_vec_vavgsw 11096593Smarkm#define vec_vavguw __builtin_vec_vavguw 11196593Smarkm#define vec_vavgsh __builtin_vec_vavgsh 11296593Smarkm#define vec_vavguh __builtin_vec_vavguh 11396593Smarkm#define vec_vavgsb __builtin_vec_vavgsb 11496593Smarkm#define vec_vavgub __builtin_vec_vavgub 11596593Smarkm#define vec_ceil __builtin_vec_ceil 11696593Smarkm#define vec_cmpb __builtin_vec_cmpb 11796593Smarkm#define vec_vcmpeqfp __builtin_vec_vcmpeqfp 11896593Smarkm#define vec_cmpge __builtin_vec_cmpge 11996593Smarkm#define vec_vcmpgtfp __builtin_vec_vcmpgtfp 12096593Smarkm#define vec_vcmpgtsw __builtin_vec_vcmpgtsw 12196593Smarkm#define vec_vcmpgtuw __builtin_vec_vcmpgtuw 12296593Smarkm#define vec_vcmpgtsh __builtin_vec_vcmpgtsh 12396593Smarkm#define vec_vcmpgtuh __builtin_vec_vcmpgtuh 12496593Smarkm#define vec_vcmpgtsb __builtin_vec_vcmpgtsb 12596593Smarkm#define vec_vcmpgtub __builtin_vec_vcmpgtub 12696593Smarkm#define vec_vcfsx __builtin_vec_vcfsx 12796593Smarkm#define vec_vcfux __builtin_vec_vcfux 12896593Smarkm#define vec_cts __builtin_vec_cts 12996593Smarkm#define vec_ctu __builtin_vec_ctu 13096593Smarkm#define vec_expte __builtin_vec_expte 13196593Smarkm#define vec_floor __builtin_vec_floor 13296593Smarkm#define vec_loge __builtin_vec_loge 133142429Snectar#define vec_madd __builtin_vec_madd 13496593Smarkm#define vec_madds __builtin_vec_madds 135100946Snectar#define vec_mtvscr __builtin_vec_mtvscr 136306196Sjkim#define vec_vmaxfp __builtin_vec_vmaxfp 137215698Ssimon#define vec_vmaxsw __builtin_vec_vmaxsw 138215698Ssimon#define vec_vmaxsh __builtin_vec_vmaxsh 139215698Ssimon#define vec_vmaxsb __builtin_vec_vmaxsb 140215698Ssimon#define vec_vminfp __builtin_vec_vminfp 14196593Smarkm#define vec_vminsw __builtin_vec_vminsw 142142429Snectar#define vec_vminsh __builtin_vec_vminsh 14396593Smarkm#define vec_vminsb __builtin_vec_vminsb 14496593Smarkm#define vec_mradds __builtin_vec_mradds 14596593Smarkm#define vec_vmsumshm __builtin_vec_vmsumshm 14696593Smarkm#define vec_vmsumuhm __builtin_vec_vmsumuhm 147215698Ssimon#define vec_vmsummbm __builtin_vec_vmsummbm 14896593Smarkm#define vec_vmsumubm __builtin_vec_vmsumubm 149215698Ssimon#define vec_vmsumshs __builtin_vec_vmsumshs 15096593Smarkm#define vec_vmsumuhs __builtin_vec_vmsumuhs 15196593Smarkm#define vec_vmulesb __builtin_vec_vmulesb 15296593Smarkm#define vec_vmulesh __builtin_vec_vmulesh 15396593Smarkm#define vec_vmuleuh __builtin_vec_vmuleuh 154110010Smarkm#define vec_vmuleub __builtin_vec_vmuleub 155110010Smarkm#define vec_vmulosh __builtin_vec_vmulosh 15696593Smarkm#define vec_vmulouh __builtin_vec_vmulouh 15796593Smarkm#define vec_vmulosb __builtin_vec_vmulosb 15896593Smarkm#define vec_vmuloub __builtin_vec_vmuloub 15996593Smarkm#define vec_nmsub __builtin_vec_nmsub 16096593Smarkm#define vec_packpx __builtin_vec_packpx 16196593Smarkm#define vec_vpkswss __builtin_vec_vpkswss 162142429Snectar#define vec_vpkuwus __builtin_vec_vpkuwus 16396593Smarkm#define vec_vpkshss __builtin_vec_vpkshss 16496593Smarkm#define vec_vpkuhus __builtin_vec_vpkuhus 16596593Smarkm#define vec_vpkswus __builtin_vec_vpkswus 16696593Smarkm#define vec_vpkshus __builtin_vec_vpkshus 16796593Smarkm#define vec_re __builtin_vec_re 168142429Snectar#define vec_round __builtin_vec_round 169142429Snectar#define vec_rsqrte __builtin_vec_rsqrte 170142429Snectar#define vec_vsubfp __builtin_vec_vsubfp 17196593Smarkm#define vec_subc __builtin_vec_subc 17296593Smarkm#define vec_vsubsws __builtin_vec_vsubsws 17396593Smarkm#define vec_vsubshs __builtin_vec_vsubshs 174#define vec_vsubsbs __builtin_vec_vsubsbs 175#define vec_sum4s __builtin_vec_sum4s 176#define vec_vsum4shs __builtin_vec_vsum4shs 177#define vec_vsum4sbs __builtin_vec_vsum4sbs 178#define vec_vsum4ubs __builtin_vec_vsum4ubs 179#define vec_sum2s __builtin_vec_sum2s 180#define vec_sums __builtin_vec_sums 181#define vec_trunc __builtin_vec_trunc 182#define vec_vupkhpx __builtin_vec_vupkhpx 183#define vec_vupkhsh __builtin_vec_vupkhsh 184#define vec_vupkhsb __builtin_vec_vupkhsb 185#define vec_vupklpx __builtin_vec_vupklpx 186#define vec_vupklsh __builtin_vec_vupklsh 187#define vec_vupklsb __builtin_vec_vupklsb 188#define vec_abs __builtin_vec_abs 189#define vec_abss __builtin_vec_abss 190#define vec_add __builtin_vec_add 191#define vec_adds __builtin_vec_adds 192#define vec_and __builtin_vec_and 193#define vec_andc __builtin_vec_andc 194#define vec_avg __builtin_vec_avg 195#define vec_cmpeq __builtin_vec_cmpeq 196#define vec_cmpgt __builtin_vec_cmpgt 197#define vec_ctf __builtin_vec_ctf 198#define vec_dst __builtin_vec_dst 199#define vec_dstst __builtin_vec_dstst 200#define vec_dststt __builtin_vec_dststt 201#define vec_dstt __builtin_vec_dstt 202#define vec_ld __builtin_vec_ld 203#define vec_lde __builtin_vec_lde 204#define vec_ldl __builtin_vec_ldl 205#define vec_lvebx __builtin_vec_lvebx 206#define vec_lvehx __builtin_vec_lvehx 207#define vec_lvewx __builtin_vec_lvewx 208#define vec_lvsl __builtin_vec_lvsl 209#define vec_lvsr __builtin_vec_lvsr 210#define vec_max __builtin_vec_max 211#define vec_mergeh __builtin_vec_mergeh 212#define vec_mergel __builtin_vec_mergel 213#define vec_min __builtin_vec_min 214#define vec_mladd __builtin_vec_mladd 215#define vec_msum __builtin_vec_msum 216#define vec_msums __builtin_vec_msums 217#define vec_mule __builtin_vec_mule 218#define vec_mulo __builtin_vec_mulo 219#define vec_nor __builtin_vec_nor 220#define vec_or __builtin_vec_or 221#define vec_pack __builtin_vec_pack 222#define vec_packs __builtin_vec_packs 223#define vec_packsu __builtin_vec_packsu 224#define vec_perm __builtin_vec_perm 225#define vec_rl __builtin_vec_rl 226#define vec_sel __builtin_vec_sel 227#define vec_sl __builtin_vec_sl 228#define vec_sld __builtin_vec_sld 229#define vec_sll __builtin_vec_sll 230#define vec_slo __builtin_vec_slo 231#define vec_splat __builtin_vec_splat 232#define vec_sr __builtin_vec_sr 233#define vec_sra __builtin_vec_sra 234#define vec_srl __builtin_vec_srl 235#define vec_sro __builtin_vec_sro 236#define vec_st __builtin_vec_st 237#define vec_ste __builtin_vec_ste 238#define vec_stl __builtin_vec_stl 239#define vec_stvebx __builtin_vec_stvebx 240#define vec_stvehx __builtin_vec_stvehx 241#define vec_stvewx __builtin_vec_stvewx 242#define vec_sub __builtin_vec_sub 243#define vec_subs __builtin_vec_subs 244#define vec_sum __builtin_vec_sum 245#define vec_unpackh __builtin_vec_unpackh 246#define vec_unpackl __builtin_vec_unpackl 247#define vec_vaddubm __builtin_vec_vaddubm 248#define vec_vaddubs __builtin_vec_vaddubs 249#define vec_vadduhm __builtin_vec_vadduhm 250#define vec_vadduhs __builtin_vec_vadduhs 251#define vec_vadduwm __builtin_vec_vadduwm 252#define vec_vadduws __builtin_vec_vadduws 253#define vec_vcmpequb __builtin_vec_vcmpequb 254#define vec_vcmpequh __builtin_vec_vcmpequh 255#define vec_vcmpequw __builtin_vec_vcmpequw 256#define vec_vmaxub __builtin_vec_vmaxub 257#define vec_vmaxuh __builtin_vec_vmaxuh 258#define vec_vmaxuw __builtin_vec_vmaxuw 259#define vec_vminub __builtin_vec_vminub 260#define vec_vminuh __builtin_vec_vminuh 261#define vec_vminuw __builtin_vec_vminuw 262#define vec_vmrghb __builtin_vec_vmrghb 263#define vec_vmrghh __builtin_vec_vmrghh 264#define vec_vmrghw __builtin_vec_vmrghw 265#define vec_vmrglb __builtin_vec_vmrglb 266#define vec_vmrglh __builtin_vec_vmrglh 267#define vec_vmrglw __builtin_vec_vmrglw 268#define vec_vpkuhum __builtin_vec_vpkuhum 269#define vec_vpkuwum __builtin_vec_vpkuwum 270#define vec_vrlb __builtin_vec_vrlb 271#define vec_vrlh __builtin_vec_vrlh 272#define vec_vrlw __builtin_vec_vrlw 273#define vec_vslb __builtin_vec_vslb 274#define vec_vslh __builtin_vec_vslh 275#define vec_vslw __builtin_vec_vslw 276#define vec_vspltb __builtin_vec_vspltb 277#define vec_vsplth __builtin_vec_vsplth 278#define vec_vspltw __builtin_vec_vspltw 279#define vec_vsrab __builtin_vec_vsrab 280#define vec_vsrah __builtin_vec_vsrah 281#define vec_vsraw __builtin_vec_vsraw 282#define vec_vsrb __builtin_vec_vsrb 283#define vec_vsrh __builtin_vec_vsrh 284#define vec_vsrw __builtin_vec_vsrw 285#define vec_vsububs __builtin_vec_vsububs 286#define vec_vsububm __builtin_vec_vsububm 287#define vec_vsubuhm __builtin_vec_vsubuhm 288#define vec_vsubuhs __builtin_vec_vsubuhs 289#define vec_vsubuwm __builtin_vec_vsubuwm 290#define vec_vsubuws __builtin_vec_vsubuws 291#define vec_xor __builtin_vec_xor 292 293/* Predicates. 294 For C++, we use templates in order to allow non-parenthesized arguments. 295 For C, instead, we use macros since non-parenthesized arguments were 296 not allowed even in older GCC implementation of AltiVec. 297 298 In the future, we may add more magic to the back-end, so that no 299 one- or two-argument macros are used. */ 300 301#ifdef __cplusplus__ 302#define __altivec_unary_pred(NAME, CALL) \ 303template <class T> int NAME (T a1) { return CALL; } 304 305#define __altivec_scalar_pred(NAME, CALL) \ 306template <class T, class U> int NAME (T a1, U a2) { return CALL; } 307 308/* Given the vec_step of a type, return the corresponding bool type. */ 309template <int STEP> class __altivec_bool_ret { }; 310template <> class __altivec_bool_ret <4> { 311 typedef __vector __bool int __ret; 312}; 313template <> class __altivec_bool_ret <8> { 314 typedef __vector __bool short __ret; 315}; 316template <> class __altivec_bool_ret <16> { 317 typedef __vector __bool char __ret; 318}; 319 320/* Be very liberal in the pairs we accept. Mistakes such as passing 321 a `vector char' and `vector short' will be caught by the middle-end, 322 while any attempt to detect them here would produce hard to understand 323 error messages involving the implementation details of AltiVec. */ 324#define __altivec_binary_pred(NAME, CALL) \ 325template <class T, class U> \ 326typename __altivec_bool_ret <vec_step (T)>::__ret \ 327NAME (T a1, U a2) \ 328{ \ 329 return CALL; \ 330} 331 332__altivec_binary_pred(vec_cmplt, 333 __builtin_vec_cmpgt (a2, a1)) 334__altivec_binary_pred(vec_cmple, 335 __builtin_altivec_cmpge (a2, a1)) 336 337__altivec_scalar_pred(vec_all_in, 338 __builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2)) 339__altivec_scalar_pred(vec_any_out, 340 __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2)) 341 342__altivec_unary_pred(vec_all_nan, 343 __builtin_altivec_vcmpeqfp_p (__CR6_EQ, a1, a1)) 344__altivec_unary_pred(vec_any_nan, 345 __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, a1, a1)) 346 347__altivec_unary_pred(vec_all_numeric, 348 __builtin_altivec_vcmpeqfp_p (__CR6_LT, a1, a1)) 349__altivec_unary_pred(vec_any_numeric, 350 __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, a1, a1)) 351 352__altivec_scalar_pred(vec_all_eq, 353 __builtin_vec_vcmpeq_p (__CR6_LT, a1, a2)) 354__altivec_scalar_pred(vec_all_ne, 355 __builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2)) 356__altivec_scalar_pred(vec_any_eq, 357 __builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2)) 358__altivec_scalar_pred(vec_any_ne, 359 __builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2)) 360 361__altivec_scalar_pred(vec_all_gt, 362 __builtin_vec_vcmpgt_p (__CR6_LT, a1, a2)) 363__altivec_scalar_pred(vec_all_lt, 364 __builtin_vec_vcmpgt_p (__CR6_LT, a2, a1)) 365__altivec_scalar_pred(vec_any_gt, 366 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2)) 367__altivec_scalar_pred(vec_any_lt, 368 __builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1)) 369 370__altivec_scalar_pred(vec_all_ngt, 371 __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a1, a2)) 372__altivec_scalar_pred(vec_all_nlt, 373 __builtin_altivec_vcmpgtfp_p (__CR6_EQ, a2, a1)) 374__altivec_scalar_pred(vec_any_ngt, 375 __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a1, a2)) 376__altivec_scalar_pred(vec_any_nlt, 377 __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, a2, a1)) 378 379/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, 380 while for integer types it is converted to __builtin_vec_vcmpgt_p, 381 with inverted args and condition code. */ 382__altivec_scalar_pred(vec_all_le, 383 __builtin_vec_vcmpge_p (__CR6_LT, a2, a1)) 384__altivec_scalar_pred(vec_all_ge, 385 __builtin_vec_vcmpge_p (__CR6_LT, a1, a2)) 386__altivec_scalar_pred(vec_any_le, 387 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1)) 388__altivec_scalar_pred(vec_any_ge, 389 __builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2)) 390 391__altivec_scalar_pred(vec_all_nge, 392 __builtin_altivec_vcmpgefp_p (__CR6_EQ, a1, a2)) 393__altivec_scalar_pred(vec_all_nle, 394 __builtin_altivec_vcmpgefp_p (__CR6_EQ, a2, a1)) 395__altivec_scalar_pred(vec_any_nge, 396 __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a1, a2)) 397__altivec_scalar_pred(vec_any_nle, 398 __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, a2, a1)) 399 400#undef __altivec_scalar_pred 401#undef __altivec_unary_pred 402#undef __altivec_binary_pred 403#else 404#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1)) 405#define vec_cmple(a1, a2) __builtin_altivec_vcmpgefp ((a2), (a1)) 406 407#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2)) 408#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2)) 409 410#define vec_all_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ, (a1), (a1)) 411#define vec_any_nan(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT_REV, (a1), (a1)) 412 413#define vec_all_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_LT, (a1), (a1)) 414#define vec_any_numeric(a1) __builtin_altivec_vcmpeqfp_p (__CR6_EQ_REV, (a1), (a1)) 415 416#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2)) 417#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2)) 418#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2)) 419#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2)) 420 421#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2)) 422#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1)) 423#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2)) 424#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1)) 425 426#define vec_all_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a1), (a2)) 427#define vec_all_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_EQ, (a2), (a1)) 428#define vec_any_ngt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a1), (a2)) 429#define vec_any_nlt(a1, a2) __builtin_altivec_vcmpgtfp_p (__CR6_LT_REV, (a2), (a1)) 430 431/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types, 432 while for integer types it is converted to __builtin_vec_vcmpgt_p, 433 with inverted args and condition code. */ 434#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1)) 435#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2)) 436#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1)) 437#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2)) 438 439#define vec_all_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a1), (a2)) 440#define vec_all_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_EQ, (a2), (a1)) 441#define vec_any_nge(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a1), (a2)) 442#define vec_any_nle(a1, a2) __builtin_altivec_vcmpgefp_p (__CR6_LT_REV, (a2), (a1)) 443#endif 444 445/* These do not accept vectors, so they do not have a __builtin_vec_* 446 counterpart. */ 447#define vec_dss(x) __builtin_altivec_dss((x)) 448#define vec_dssall() __builtin_altivec_dssall () 449#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ()) 450#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x)) 451#define vec_splat_s16(x) __builtin_altivec_vspltish ((x)) 452#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x)) 453#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x))) 454#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x))) 455#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x))) 456 457/* This also accepts a type for its parameter, so it is not enough 458 to #define vec_step to __builtin_vec_step. */ 459#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0) 460 461#endif /* _ALTIVEC_H */ 462