| 1 |
282 |
jeremybenn |
/* PowerPC AltiVec include file.
|
| 2 |
|
|
Copyright (C) 2002, 2003, 2004, 2005, 2008, 2009 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_vrefp vec_re
|
| 80 |
|
|
#define vec_vrfin vec_round
|
| 81 |
|
|
#define vec_vrsqrtefp vec_rsqrte
|
| 82 |
|
|
#define vec_vsel vec_sel
|
| 83 |
|
|
#define vec_vsldoi vec_sld
|
| 84 |
|
|
#define vec_vsl vec_sll
|
| 85 |
|
|
#define vec_vslo vec_slo
|
| 86 |
|
|
#define vec_vspltisb vec_splat_s8
|
| 87 |
|
|
#define vec_vspltish vec_splat_s16
|
| 88 |
|
|
#define vec_vspltisw vec_splat_s32
|
| 89 |
|
|
#define vec_vsr vec_srl
|
| 90 |
|
|
#define vec_vsro vec_sro
|
| 91 |
|
|
#define vec_stvx vec_st
|
| 92 |
|
|
#define vec_stvxl vec_stl
|
| 93 |
|
|
#define vec_vsubcuw vec_subc
|
| 94 |
|
|
#define vec_vsum2sws vec_sum2s
|
| 95 |
|
|
#define vec_vsumsws vec_sums
|
| 96 |
|
|
#define vec_vrfiz vec_trunc
|
| 97 |
|
|
#define vec_vxor vec_xor
|
| 98 |
|
|
|
| 99 |
|
|
/* Functions that are resolved by the backend to one of the
|
| 100 |
|
|
typed builtins. */
|
| 101 |
|
|
#define vec_vaddfp __builtin_vec_vaddfp
|
| 102 |
|
|
#define vec_addc __builtin_vec_addc
|
| 103 |
|
|
#define vec_vaddsws __builtin_vec_vaddsws
|
| 104 |
|
|
#define vec_vaddshs __builtin_vec_vaddshs
|
| 105 |
|
|
#define vec_vaddsbs __builtin_vec_vaddsbs
|
| 106 |
|
|
#define vec_vavgsw __builtin_vec_vavgsw
|
| 107 |
|
|
#define vec_vavguw __builtin_vec_vavguw
|
| 108 |
|
|
#define vec_vavgsh __builtin_vec_vavgsh
|
| 109 |
|
|
#define vec_vavguh __builtin_vec_vavguh
|
| 110 |
|
|
#define vec_vavgsb __builtin_vec_vavgsb
|
| 111 |
|
|
#define vec_vavgub __builtin_vec_vavgub
|
| 112 |
|
|
#define vec_ceil __builtin_vec_ceil
|
| 113 |
|
|
#define vec_cmpb __builtin_vec_cmpb
|
| 114 |
|
|
#define vec_vcmpeqfp __builtin_vec_vcmpeqfp
|
| 115 |
|
|
#define vec_cmpge __builtin_vec_cmpge
|
| 116 |
|
|
#define vec_vcmpgtfp __builtin_vec_vcmpgtfp
|
| 117 |
|
|
#define vec_vcmpgtsw __builtin_vec_vcmpgtsw
|
| 118 |
|
|
#define vec_vcmpgtuw __builtin_vec_vcmpgtuw
|
| 119 |
|
|
#define vec_vcmpgtsh __builtin_vec_vcmpgtsh
|
| 120 |
|
|
#define vec_vcmpgtuh __builtin_vec_vcmpgtuh
|
| 121 |
|
|
#define vec_vcmpgtsb __builtin_vec_vcmpgtsb
|
| 122 |
|
|
#define vec_vcmpgtub __builtin_vec_vcmpgtub
|
| 123 |
|
|
#define vec_vcfsx __builtin_vec_vcfsx
|
| 124 |
|
|
#define vec_vcfux __builtin_vec_vcfux
|
| 125 |
|
|
#define vec_cts __builtin_vec_cts
|
| 126 |
|
|
#define vec_ctu __builtin_vec_ctu
|
| 127 |
|
|
#define vec_expte __builtin_vec_expte
|
| 128 |
|
|
#define vec_floor __builtin_vec_floor
|
| 129 |
|
|
#define vec_loge __builtin_vec_loge
|
| 130 |
|
|
#define vec_madd __builtin_vec_madd
|
| 131 |
|
|
#define vec_madds __builtin_vec_madds
|
| 132 |
|
|
#define vec_mtvscr __builtin_vec_mtvscr
|
| 133 |
|
|
#define vec_vmaxfp __builtin_vec_vmaxfp
|
| 134 |
|
|
#define vec_vmaxsw __builtin_vec_vmaxsw
|
| 135 |
|
|
#define vec_vmaxsh __builtin_vec_vmaxsh
|
| 136 |
|
|
#define vec_vmaxsb __builtin_vec_vmaxsb
|
| 137 |
|
|
#define vec_vminfp __builtin_vec_vminfp
|
| 138 |
|
|
#define vec_vminsw __builtin_vec_vminsw
|
| 139 |
|
|
#define vec_vminsh __builtin_vec_vminsh
|
| 140 |
|
|
#define vec_vminsb __builtin_vec_vminsb
|
| 141 |
|
|
#define vec_mradds __builtin_vec_mradds
|
| 142 |
|
|
#define vec_vmsumshm __builtin_vec_vmsumshm
|
| 143 |
|
|
#define vec_vmsumuhm __builtin_vec_vmsumuhm
|
| 144 |
|
|
#define vec_vmsummbm __builtin_vec_vmsummbm
|
| 145 |
|
|
#define vec_vmsumubm __builtin_vec_vmsumubm
|
| 146 |
|
|
#define vec_vmsumshs __builtin_vec_vmsumshs
|
| 147 |
|
|
#define vec_vmsumuhs __builtin_vec_vmsumuhs
|
| 148 |
|
|
#define vec_vmulesb __builtin_vec_vmulesb
|
| 149 |
|
|
#define vec_vmulesh __builtin_vec_vmulesh
|
| 150 |
|
|
#define vec_vmuleuh __builtin_vec_vmuleuh
|
| 151 |
|
|
#define vec_vmuleub __builtin_vec_vmuleub
|
| 152 |
|
|
#define vec_vmulosh __builtin_vec_vmulosh
|
| 153 |
|
|
#define vec_vmulouh __builtin_vec_vmulouh
|
| 154 |
|
|
#define vec_vmulosb __builtin_vec_vmulosb
|
| 155 |
|
|
#define vec_vmuloub __builtin_vec_vmuloub
|
| 156 |
|
|
#define vec_nmsub __builtin_vec_nmsub
|
| 157 |
|
|
#define vec_packpx __builtin_vec_packpx
|
| 158 |
|
|
#define vec_vpkswss __builtin_vec_vpkswss
|
| 159 |
|
|
#define vec_vpkuwus __builtin_vec_vpkuwus
|
| 160 |
|
|
#define vec_vpkshss __builtin_vec_vpkshss
|
| 161 |
|
|
#define vec_vpkuhus __builtin_vec_vpkuhus
|
| 162 |
|
|
#define vec_vpkswus __builtin_vec_vpkswus
|
| 163 |
|
|
#define vec_vpkshus __builtin_vec_vpkshus
|
| 164 |
|
|
#define vec_re __builtin_vec_re
|
| 165 |
|
|
#define vec_round __builtin_vec_round
|
| 166 |
|
|
#define vec_rsqrte __builtin_vec_rsqrte
|
| 167 |
|
|
#define vec_vsubfp __builtin_vec_vsubfp
|
| 168 |
|
|
#define vec_subc __builtin_vec_subc
|
| 169 |
|
|
#define vec_vsubsws __builtin_vec_vsubsws
|
| 170 |
|
|
#define vec_vsubshs __builtin_vec_vsubshs
|
| 171 |
|
|
#define vec_vsubsbs __builtin_vec_vsubsbs
|
| 172 |
|
|
#define vec_sum4s __builtin_vec_sum4s
|
| 173 |
|
|
#define vec_vsum4shs __builtin_vec_vsum4shs
|
| 174 |
|
|
#define vec_vsum4sbs __builtin_vec_vsum4sbs
|
| 175 |
|
|
#define vec_vsum4ubs __builtin_vec_vsum4ubs
|
| 176 |
|
|
#define vec_sum2s __builtin_vec_sum2s
|
| 177 |
|
|
#define vec_sums __builtin_vec_sums
|
| 178 |
|
|
#define vec_trunc __builtin_vec_trunc
|
| 179 |
|
|
#define vec_vupkhpx __builtin_vec_vupkhpx
|
| 180 |
|
|
#define vec_vupkhsh __builtin_vec_vupkhsh
|
| 181 |
|
|
#define vec_vupkhsb __builtin_vec_vupkhsb
|
| 182 |
|
|
#define vec_vupklpx __builtin_vec_vupklpx
|
| 183 |
|
|
#define vec_vupklsh __builtin_vec_vupklsh
|
| 184 |
|
|
#define vec_vupklsb __builtin_vec_vupklsb
|
| 185 |
|
|
#define vec_abs __builtin_vec_abs
|
| 186 |
|
|
#define vec_abss __builtin_vec_abss
|
| 187 |
|
|
#define vec_add __builtin_vec_add
|
| 188 |
|
|
#define vec_adds __builtin_vec_adds
|
| 189 |
|
|
#define vec_and __builtin_vec_and
|
| 190 |
|
|
#define vec_andc __builtin_vec_andc
|
| 191 |
|
|
#define vec_avg __builtin_vec_avg
|
| 192 |
|
|
#define vec_cmpeq __builtin_vec_cmpeq
|
| 193 |
|
|
#define vec_cmpgt __builtin_vec_cmpgt
|
| 194 |
|
|
#define vec_ctf __builtin_vec_ctf
|
| 195 |
|
|
#define vec_dst __builtin_vec_dst
|
| 196 |
|
|
#define vec_dstst __builtin_vec_dstst
|
| 197 |
|
|
#define vec_dststt __builtin_vec_dststt
|
| 198 |
|
|
#define vec_dstt __builtin_vec_dstt
|
| 199 |
|
|
#define vec_ld __builtin_vec_ld
|
| 200 |
|
|
#define vec_lde __builtin_vec_lde
|
| 201 |
|
|
#define vec_ldl __builtin_vec_ldl
|
| 202 |
|
|
#define vec_lvebx __builtin_vec_lvebx
|
| 203 |
|
|
#define vec_lvehx __builtin_vec_lvehx
|
| 204 |
|
|
#define vec_lvewx __builtin_vec_lvewx
|
| 205 |
|
|
/* Cell only intrinsics. */
|
| 206 |
|
|
#ifdef __PPU__
|
| 207 |
|
|
#define vec_lvlx __builtin_vec_lvlx
|
| 208 |
|
|
#define vec_lvlxl __builtin_vec_lvlxl
|
| 209 |
|
|
#define vec_lvrx __builtin_vec_lvrx
|
| 210 |
|
|
#define vec_lvrxl __builtin_vec_lvrxl
|
| 211 |
|
|
#endif
|
| 212 |
|
|
#define vec_lvsl __builtin_vec_lvsl
|
| 213 |
|
|
#define vec_lvsr __builtin_vec_lvsr
|
| 214 |
|
|
#define vec_max __builtin_vec_max
|
| 215 |
|
|
#define vec_mergeh __builtin_vec_mergeh
|
| 216 |
|
|
#define vec_mergel __builtin_vec_mergel
|
| 217 |
|
|
#define vec_min __builtin_vec_min
|
| 218 |
|
|
#define vec_mladd __builtin_vec_mladd
|
| 219 |
|
|
#define vec_msum __builtin_vec_msum
|
| 220 |
|
|
#define vec_msums __builtin_vec_msums
|
| 221 |
|
|
#define vec_mule __builtin_vec_mule
|
| 222 |
|
|
#define vec_mulo __builtin_vec_mulo
|
| 223 |
|
|
#define vec_nor __builtin_vec_nor
|
| 224 |
|
|
#define vec_or __builtin_vec_or
|
| 225 |
|
|
#define vec_pack __builtin_vec_pack
|
| 226 |
|
|
#define vec_packs __builtin_vec_packs
|
| 227 |
|
|
#define vec_packsu __builtin_vec_packsu
|
| 228 |
|
|
#define vec_perm __builtin_vec_perm
|
| 229 |
|
|
#define vec_rl __builtin_vec_rl
|
| 230 |
|
|
#define vec_sel __builtin_vec_sel
|
| 231 |
|
|
#define vec_sl __builtin_vec_sl
|
| 232 |
|
|
#define vec_sld __builtin_vec_sld
|
| 233 |
|
|
#define vec_sll __builtin_vec_sll
|
| 234 |
|
|
#define vec_slo __builtin_vec_slo
|
| 235 |
|
|
#define vec_splat __builtin_vec_splat
|
| 236 |
|
|
#define vec_sr __builtin_vec_sr
|
| 237 |
|
|
#define vec_sra __builtin_vec_sra
|
| 238 |
|
|
#define vec_srl __builtin_vec_srl
|
| 239 |
|
|
#define vec_sro __builtin_vec_sro
|
| 240 |
|
|
#define vec_st __builtin_vec_st
|
| 241 |
|
|
#define vec_ste __builtin_vec_ste
|
| 242 |
|
|
#define vec_stl __builtin_vec_stl
|
| 243 |
|
|
#define vec_stvebx __builtin_vec_stvebx
|
| 244 |
|
|
#define vec_stvehx __builtin_vec_stvehx
|
| 245 |
|
|
#define vec_stvewx __builtin_vec_stvewx
|
| 246 |
|
|
/* Cell only intrinsics. */
|
| 247 |
|
|
#ifdef __PPU__
|
| 248 |
|
|
#define vec_stvlx __builtin_vec_stvlx
|
| 249 |
|
|
#define vec_stvlxl __builtin_vec_stvlxl
|
| 250 |
|
|
#define vec_stvrx __builtin_vec_stvrx
|
| 251 |
|
|
#define vec_stvrxl __builtin_vec_stvrxl
|
| 252 |
|
|
#endif
|
| 253 |
|
|
#define vec_sub __builtin_vec_sub
|
| 254 |
|
|
#define vec_subs __builtin_vec_subs
|
| 255 |
|
|
#define vec_sum __builtin_vec_sum
|
| 256 |
|
|
#define vec_unpackh __builtin_vec_unpackh
|
| 257 |
|
|
#define vec_unpackl __builtin_vec_unpackl
|
| 258 |
|
|
#define vec_vaddubm __builtin_vec_vaddubm
|
| 259 |
|
|
#define vec_vaddubs __builtin_vec_vaddubs
|
| 260 |
|
|
#define vec_vadduhm __builtin_vec_vadduhm
|
| 261 |
|
|
#define vec_vadduhs __builtin_vec_vadduhs
|
| 262 |
|
|
#define vec_vadduwm __builtin_vec_vadduwm
|
| 263 |
|
|
#define vec_vadduws __builtin_vec_vadduws
|
| 264 |
|
|
#define vec_vcmpequb __builtin_vec_vcmpequb
|
| 265 |
|
|
#define vec_vcmpequh __builtin_vec_vcmpequh
|
| 266 |
|
|
#define vec_vcmpequw __builtin_vec_vcmpequw
|
| 267 |
|
|
#define vec_vmaxub __builtin_vec_vmaxub
|
| 268 |
|
|
#define vec_vmaxuh __builtin_vec_vmaxuh
|
| 269 |
|
|
#define vec_vmaxuw __builtin_vec_vmaxuw
|
| 270 |
|
|
#define vec_vminub __builtin_vec_vminub
|
| 271 |
|
|
#define vec_vminuh __builtin_vec_vminuh
|
| 272 |
|
|
#define vec_vminuw __builtin_vec_vminuw
|
| 273 |
|
|
#define vec_vmrghb __builtin_vec_vmrghb
|
| 274 |
|
|
#define vec_vmrghh __builtin_vec_vmrghh
|
| 275 |
|
|
#define vec_vmrghw __builtin_vec_vmrghw
|
| 276 |
|
|
#define vec_vmrglb __builtin_vec_vmrglb
|
| 277 |
|
|
#define vec_vmrglh __builtin_vec_vmrglh
|
| 278 |
|
|
#define vec_vmrglw __builtin_vec_vmrglw
|
| 279 |
|
|
#define vec_vpkuhum __builtin_vec_vpkuhum
|
| 280 |
|
|
#define vec_vpkuwum __builtin_vec_vpkuwum
|
| 281 |
|
|
#define vec_vrlb __builtin_vec_vrlb
|
| 282 |
|
|
#define vec_vrlh __builtin_vec_vrlh
|
| 283 |
|
|
#define vec_vrlw __builtin_vec_vrlw
|
| 284 |
|
|
#define vec_vslb __builtin_vec_vslb
|
| 285 |
|
|
#define vec_vslh __builtin_vec_vslh
|
| 286 |
|
|
#define vec_vslw __builtin_vec_vslw
|
| 287 |
|
|
#define vec_vspltb __builtin_vec_vspltb
|
| 288 |
|
|
#define vec_vsplth __builtin_vec_vsplth
|
| 289 |
|
|
#define vec_vspltw __builtin_vec_vspltw
|
| 290 |
|
|
#define vec_vsrab __builtin_vec_vsrab
|
| 291 |
|
|
#define vec_vsrah __builtin_vec_vsrah
|
| 292 |
|
|
#define vec_vsraw __builtin_vec_vsraw
|
| 293 |
|
|
#define vec_vsrb __builtin_vec_vsrb
|
| 294 |
|
|
#define vec_vsrh __builtin_vec_vsrh
|
| 295 |
|
|
#define vec_vsrw __builtin_vec_vsrw
|
| 296 |
|
|
#define vec_vsububs __builtin_vec_vsububs
|
| 297 |
|
|
#define vec_vsububm __builtin_vec_vsububm
|
| 298 |
|
|
#define vec_vsubuhm __builtin_vec_vsubuhm
|
| 299 |
|
|
#define vec_vsubuhs __builtin_vec_vsubuhs
|
| 300 |
|
|
#define vec_vsubuwm __builtin_vec_vsubuwm
|
| 301 |
|
|
#define vec_vsubuws __builtin_vec_vsubuws
|
| 302 |
|
|
#define vec_xor __builtin_vec_xor
|
| 303 |
|
|
|
| 304 |
|
|
#define vec_extract __builtin_vec_extract
|
| 305 |
|
|
#define vec_insert __builtin_vec_insert
|
| 306 |
|
|
#define vec_splats __builtin_vec_splats
|
| 307 |
|
|
#define vec_promote __builtin_vec_promote
|
| 308 |
|
|
|
| 309 |
|
|
#ifdef __VSX__
|
| 310 |
|
|
/* VSX additions */
|
| 311 |
|
|
#define vec_div __builtin_vec_div
|
| 312 |
|
|
#define vec_mul __builtin_vec_mul
|
| 313 |
|
|
#define vec_msub __builtin_vec_msub
|
| 314 |
|
|
#define vec_nmadd __builtin_vec_nmadd
|
| 315 |
|
|
#define vec_nearbyint __builtin_vec_nearbyint
|
| 316 |
|
|
#define vec_rint __builtin_vec_rint
|
| 317 |
|
|
#define vec_sqrt __builtin_vec_sqrt
|
| 318 |
|
|
#endif
|
| 319 |
|
|
|
| 320 |
|
|
/* Predicates.
|
| 321 |
|
|
For C++, we use templates in order to allow non-parenthesized arguments.
|
| 322 |
|
|
For C, instead, we use macros since non-parenthesized arguments were
|
| 323 |
|
|
not allowed even in older GCC implementation of AltiVec.
|
| 324 |
|
|
|
| 325 |
|
|
In the future, we may add more magic to the back-end, so that no
|
| 326 |
|
|
one- or two-argument macros are used. */
|
| 327 |
|
|
|
| 328 |
|
|
#ifdef __cplusplus__
|
| 329 |
|
|
#define __altivec_unary_pred(NAME, CALL) \
|
| 330 |
|
|
template <class T> int NAME (T a1) { return CALL; }
|
| 331 |
|
|
|
| 332 |
|
|
#define __altivec_scalar_pred(NAME, CALL) \
|
| 333 |
|
|
template <class T, class U> int NAME (T a1, U a2) { return CALL; }
|
| 334 |
|
|
|
| 335 |
|
|
/* Given the vec_step of a type, return the corresponding bool type. */
|
| 336 |
|
|
template <int STEP> class __altivec_bool_ret { };
|
| 337 |
|
|
template <> class __altivec_bool_ret <4> {
|
| 338 |
|
|
typedef __vector __bool int __ret;
|
| 339 |
|
|
};
|
| 340 |
|
|
template <> class __altivec_bool_ret <8> {
|
| 341 |
|
|
typedef __vector __bool short __ret;
|
| 342 |
|
|
};
|
| 343 |
|
|
template <> class __altivec_bool_ret <16> {
|
| 344 |
|
|
typedef __vector __bool char __ret;
|
| 345 |
|
|
};
|
| 346 |
|
|
|
| 347 |
|
|
/* Be very liberal in the pairs we accept. Mistakes such as passing
|
| 348 |
|
|
a `vector char' and `vector short' will be caught by the middle-end,
|
| 349 |
|
|
while any attempt to detect them here would produce hard to understand
|
| 350 |
|
|
error messages involving the implementation details of AltiVec. */
|
| 351 |
|
|
#define __altivec_binary_pred(NAME, CALL) \
|
| 352 |
|
|
template <class T, class U> \
|
| 353 |
|
|
typename __altivec_bool_ret <vec_step (T)>::__ret \
|
| 354 |
|
|
NAME (T a1, U a2) \
|
| 355 |
|
|
{ \
|
| 356 |
|
|
return CALL; \
|
| 357 |
|
|
}
|
| 358 |
|
|
|
| 359 |
|
|
__altivec_binary_pred(vec_cmplt,
|
| 360 |
|
|
__builtin_vec_cmpgt (a2, a1))
|
| 361 |
|
|
__altivec_binary_pred(vec_cmple,
|
| 362 |
|
|
__builtin_vec_cmpge (a2, a1))
|
| 363 |
|
|
|
| 364 |
|
|
__altivec_scalar_pred(vec_all_in,
|
| 365 |
|
|
__builtin_altivec_vcmpbfp_p (__CR6_EQ, a1, a2))
|
| 366 |
|
|
__altivec_scalar_pred(vec_any_out,
|
| 367 |
|
|
__builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, a1, a2))
|
| 368 |
|
|
|
| 369 |
|
|
__altivec_unary_pred(vec_all_nan,
|
| 370 |
|
|
__builtin_altivec_vcmpeq_p (__CR6_EQ, a1, a1))
|
| 371 |
|
|
__altivec_unary_pred(vec_any_nan,
|
| 372 |
|
|
__builtin_altivec_vcmpeq_p (__CR6_LT_REV, a1, a1))
|
| 373 |
|
|
|
| 374 |
|
|
__altivec_unary_pred(vec_all_numeric,
|
| 375 |
|
|
__builtin_altivec_vcmpeq_p (__CR6_LT, a1, a1))
|
| 376 |
|
|
__altivec_unary_pred(vec_any_numeric,
|
| 377 |
|
|
__builtin_altivec_vcmpeq_p (__CR6_EQ_REV, a1, a1))
|
| 378 |
|
|
|
| 379 |
|
|
__altivec_scalar_pred(vec_all_eq,
|
| 380 |
|
|
__builtin_vec_vcmpeq_p (__CR6_LT, a1, a2))
|
| 381 |
|
|
__altivec_scalar_pred(vec_all_ne,
|
| 382 |
|
|
__builtin_vec_vcmpeq_p (__CR6_EQ, a1, a2))
|
| 383 |
|
|
__altivec_scalar_pred(vec_any_eq,
|
| 384 |
|
|
__builtin_vec_vcmpeq_p (__CR6_EQ_REV, a1, a2))
|
| 385 |
|
|
__altivec_scalar_pred(vec_any_ne,
|
| 386 |
|
|
__builtin_vec_vcmpeq_p (__CR6_LT_REV, a1, a2))
|
| 387 |
|
|
|
| 388 |
|
|
__altivec_scalar_pred(vec_all_gt,
|
| 389 |
|
|
__builtin_vec_vcmpgt_p (__CR6_LT, a1, a2))
|
| 390 |
|
|
__altivec_scalar_pred(vec_all_lt,
|
| 391 |
|
|
__builtin_vec_vcmpgt_p (__CR6_LT, a2, a1))
|
| 392 |
|
|
__altivec_scalar_pred(vec_any_gt,
|
| 393 |
|
|
__builtin_vec_vcmpgt_p (__CR6_EQ_REV, a1, a2))
|
| 394 |
|
|
__altivec_scalar_pred(vec_any_lt,
|
| 395 |
|
|
__builtin_vec_vcmpgt_p (__CR6_EQ_REV, a2, a1))
|
| 396 |
|
|
|
| 397 |
|
|
__altivec_scalar_pred(vec_all_ngt,
|
| 398 |
|
|
__builtin_altivec_vcmpgt_p (__CR6_EQ, a1, a2))
|
| 399 |
|
|
__altivec_scalar_pred(vec_all_nlt,
|
| 400 |
|
|
__builtin_altivec_vcmpgt_p (__CR6_EQ, a2, a1))
|
| 401 |
|
|
__altivec_scalar_pred(vec_any_ngt,
|
| 402 |
|
|
__builtin_altivec_vcmpgt_p (__CR6_LT_REV, a1, a2))
|
| 403 |
|
|
__altivec_scalar_pred(vec_any_nlt,
|
| 404 |
|
|
__builtin_altivec_vcmpgt_p (__CR6_LT_REV, a2, a1))
|
| 405 |
|
|
|
| 406 |
|
|
/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
|
| 407 |
|
|
while for integer types it is converted to __builtin_vec_vcmpgt_p,
|
| 408 |
|
|
with inverted args and condition code. */
|
| 409 |
|
|
__altivec_scalar_pred(vec_all_le,
|
| 410 |
|
|
__builtin_vec_vcmpge_p (__CR6_LT, a2, a1))
|
| 411 |
|
|
__altivec_scalar_pred(vec_all_ge,
|
| 412 |
|
|
__builtin_vec_vcmpge_p (__CR6_LT, a1, a2))
|
| 413 |
|
|
__altivec_scalar_pred(vec_any_le,
|
| 414 |
|
|
__builtin_vec_vcmpge_p (__CR6_EQ_REV, a2, a1))
|
| 415 |
|
|
__altivec_scalar_pred(vec_any_ge,
|
| 416 |
|
|
__builtin_vec_vcmpge_p (__CR6_EQ_REV, a1, a2))
|
| 417 |
|
|
|
| 418 |
|
|
__altivec_scalar_pred(vec_all_nge,
|
| 419 |
|
|
__builtin_altivec_vcmpge_p (__CR6_EQ, a1, a2))
|
| 420 |
|
|
__altivec_scalar_pred(vec_all_nle,
|
| 421 |
|
|
__builtin_altivec_vcmpge_p (__CR6_EQ, a2, a1))
|
| 422 |
|
|
__altivec_scalar_pred(vec_any_nge,
|
| 423 |
|
|
__builtin_altivec_vcmpge_p (__CR6_LT_REV, a1, a2))
|
| 424 |
|
|
__altivec_scalar_pred(vec_any_nle,
|
| 425 |
|
|
__builtin_altivec_vcmpge_p (__CR6_LT_REV, a2, a1))
|
| 426 |
|
|
|
| 427 |
|
|
#undef __altivec_scalar_pred
|
| 428 |
|
|
#undef __altivec_unary_pred
|
| 429 |
|
|
#undef __altivec_binary_pred
|
| 430 |
|
|
#else
|
| 431 |
|
|
#define vec_cmplt(a1, a2) __builtin_vec_cmpgt ((a2), (a1))
|
| 432 |
|
|
#define vec_cmple(a1, a2) __builtin_vec_cmpge ((a2), (a1))
|
| 433 |
|
|
|
| 434 |
|
|
#define vec_all_in(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ, (a1), (a2))
|
| 435 |
|
|
#define vec_any_out(a1, a2) __builtin_altivec_vcmpbfp_p (__CR6_EQ_REV, (a1), (a2))
|
| 436 |
|
|
|
| 437 |
|
|
#define vec_all_nan(a1) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a1))
|
| 438 |
|
|
#define vec_any_nan(a1) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a1))
|
| 439 |
|
|
|
| 440 |
|
|
#define vec_all_numeric(a1) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a1))
|
| 441 |
|
|
#define vec_any_numeric(a1) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a1))
|
| 442 |
|
|
|
| 443 |
|
|
#define vec_all_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT, (a1), (a2))
|
| 444 |
|
|
#define vec_all_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ, (a1), (a2))
|
| 445 |
|
|
#define vec_any_eq(a1, a2) __builtin_vec_vcmpeq_p (__CR6_EQ_REV, (a1), (a2))
|
| 446 |
|
|
#define vec_any_ne(a1, a2) __builtin_vec_vcmpeq_p (__CR6_LT_REV, (a1), (a2))
|
| 447 |
|
|
|
| 448 |
|
|
#define vec_all_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a1), (a2))
|
| 449 |
|
|
#define vec_all_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT, (a2), (a1))
|
| 450 |
|
|
#define vec_any_gt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a1), (a2))
|
| 451 |
|
|
#define vec_any_lt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ_REV, (a2), (a1))
|
| 452 |
|
|
|
| 453 |
|
|
#define vec_all_ngt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ, (a1), (a2))
|
| 454 |
|
|
#define vec_all_nlt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_EQ, (a2), (a1))
|
| 455 |
|
|
#define vec_any_ngt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT_REV, (a1), (a2))
|
| 456 |
|
|
#define vec_any_nlt(a1, a2) __builtin_vec_vcmpgt_p (__CR6_LT_REV, (a2), (a1))
|
| 457 |
|
|
|
| 458 |
|
|
/* __builtin_vec_vcmpge_p is vcmpgefp for floating-point vector types,
|
| 459 |
|
|
while for integer types it is converted to __builtin_vec_vcmpgt_p,
|
| 460 |
|
|
with inverted args and condition code. */
|
| 461 |
|
|
#define vec_all_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a2), (a1))
|
| 462 |
|
|
#define vec_all_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT, (a1), (a2))
|
| 463 |
|
|
#define vec_any_le(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a2), (a1))
|
| 464 |
|
|
#define vec_any_ge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ_REV, (a1), (a2))
|
| 465 |
|
|
|
| 466 |
|
|
#define vec_all_nge(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ, (a1), (a2))
|
| 467 |
|
|
#define vec_all_nle(a1, a2) __builtin_vec_vcmpge_p (__CR6_EQ, (a2), (a1))
|
| 468 |
|
|
#define vec_any_nge(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT_REV, (a1), (a2))
|
| 469 |
|
|
#define vec_any_nle(a1, a2) __builtin_vec_vcmpge_p (__CR6_LT_REV, (a2), (a1))
|
| 470 |
|
|
#endif
|
| 471 |
|
|
|
| 472 |
|
|
/* These do not accept vectors, so they do not have a __builtin_vec_*
|
| 473 |
|
|
counterpart. */
|
| 474 |
|
|
#define vec_dss(x) __builtin_altivec_dss((x))
|
| 475 |
|
|
#define vec_dssall() __builtin_altivec_dssall ()
|
| 476 |
|
|
#define vec_mfvscr() ((__vector unsigned short) __builtin_altivec_mfvscr ())
|
| 477 |
|
|
#define vec_splat_s8(x) __builtin_altivec_vspltisb ((x))
|
| 478 |
|
|
#define vec_splat_s16(x) __builtin_altivec_vspltish ((x))
|
| 479 |
|
|
#define vec_splat_s32(x) __builtin_altivec_vspltisw ((x))
|
| 480 |
|
|
#define vec_splat_u8(x) ((__vector unsigned char) vec_splat_s8 ((x)))
|
| 481 |
|
|
#define vec_splat_u16(x) ((__vector unsigned short) vec_splat_s16 ((x)))
|
| 482 |
|
|
#define vec_splat_u32(x) ((__vector unsigned int) vec_splat_s32 ((x)))
|
| 483 |
|
|
|
| 484 |
|
|
/* This also accepts a type for its parameter, so it is not enough
|
| 485 |
|
|
to #define vec_step to __builtin_vec_step. */
|
| 486 |
|
|
#define vec_step(x) __builtin_vec_step (* (__typeof__ (x) *) 0)
|
| 487 |
|
|
|
| 488 |
|
|
#endif /* _ALTIVEC_H */
|