6.59.19 PowerPC Built-in Functions
The following built-in functions are always available and can be used to check the PowerPC target platform type:
- Built-in Function: void __builtin_cpu_init (void)
This function is a
nop
on the PowerPC platform and is included solely to maintain API compatibility with the x86 builtins.
- Built-in Function: int __builtin_cpu_is (const char *cpuname)
-
This function returns a value of
1
if the run-time CPU is of type cpuname and returns0
otherwise. The following CPU names can be detected:- ‘power9’
IBM POWER9 Server CPU.
- ‘power8’
IBM POWER8 Server CPU.
- ‘power7’
IBM POWER7 Server CPU.
- ‘power6x’
IBM POWER6 Server CPU (RAW mode).
- ‘power6’
IBM POWER6 Server CPU (Architected mode).
- ‘power5+’
IBM POWER5+ Server CPU.
- ‘power5’
IBM POWER5 Server CPU.
- ‘ppc970’
IBM 970 Server CPU (ie, Apple G5).
- ‘power4’
IBM POWER4 Server CPU.
- ‘ppca2’
IBM A2 64-bit Embedded CPU
- ‘ppc476’
IBM PowerPC 476FP 32-bit Embedded CPU.
- ‘ppc464’
IBM PowerPC 464 32-bit Embedded CPU.
- ‘ppc440’
PowerPC 440 32-bit Embedded CPU.
- ‘ppc405’
PowerPC 405 32-bit Embedded CPU.
- ‘ppc-cell-be’
IBM PowerPC Cell Broadband Engine Architecture CPU.
Here is an example:
if (__builtin_cpu_is ("power8")) { do_power8 (); // POWER8 specific implementation. } else { do_generic (); // Generic implementation. }
- Built-in Function: int __builtin_cpu_supports (const char *feature)
-
This function returns a value of
1
if the run-time CPU supports the HWCAP feature feature and returns0
otherwise. The following features can be detected:- ‘4xxmac’
4xx CPU has a Multiply Accumulator.
- ‘altivec’
CPU has a SIMD/Vector Unit.
- ‘arch_2_05’
CPU supports ISA 2.05 (eg, POWER6)
- ‘arch_2_06’
CPU supports ISA 2.06 (eg, POWER7)
- ‘arch_2_07’
CPU supports ISA 2.07 (eg, POWER8)
- ‘arch_3_00’
CPU supports ISA 3.00 (eg, POWER9)
- ‘archpmu’
CPU supports the set of compatible performance monitoring events.
- ‘booke’
CPU supports the Embedded ISA category.
- ‘cellbe’
CPU has a CELL broadband engine.
- ‘dfp’
CPU has a decimal floating point unit.
- ‘dscr’
CPU supports the data stream control register.
- ‘ebb’
CPU supports event base branching.
- ‘efpdouble’
CPU has a SPE double precision floating point unit.
- ‘efpsingle’
CPU has a SPE single precision floating point unit.
- ‘fpu’
CPU has a floating point unit.
- ‘htm’
CPU has hardware transaction memory instructions.
- ‘htm-nosc’
Kernel aborts hardware transactions when a syscall is made.
- ‘ic_snoop’
CPU supports icache snooping capabilities.
- ‘ieee128’
CPU supports 128-bit IEEE binary floating point instructions.
- ‘isel’
CPU supports the integer select instruction.
- ‘mmu’
CPU has a memory management unit.
- ‘notb’
CPU does not have a timebase (eg, 601 and 403gx).
- ‘pa6t’
CPU supports the PA Semi 6T CORE ISA.
- ‘power4’
CPU supports ISA 2.00 (eg, POWER4)
- ‘power5’
CPU supports ISA 2.02 (eg, POWER5)
- ‘power5+’
CPU supports ISA 2.03 (eg, POWER5+)
- ‘power6x’
CPU supports ISA 2.05 (eg, POWER6) extended opcodes mffgpr and mftgpr.
- ‘ppc32’
CPU supports 32-bit mode execution.
- ‘ppc601’
CPU supports the old POWER ISA (eg, 601)
- ‘ppc64’
CPU supports 64-bit mode execution.
- ‘ppcle’
CPU supports a little-endian mode that uses address swizzling.
- ‘smt’
CPU support simultaneous multi-threading.
- ‘spe’
CPU has a signal processing extension unit.
- ‘tar’
CPU supports the target address register.
- ‘true_le’
CPU supports true little-endian mode.
- ‘ucache’
CPU has unified I/D cache.
- ‘vcrypto’
CPU supports the vector cryptography instructions.
- ‘vsx’
CPU supports the vector-scalar extension.
Here is an example:
if (__builtin_cpu_supports ("fpu")) { asm("fadd %0,%1,%2" : "=d"(dst) : "d"(src1), "d"(src2)); } else { dst = __fadd (src1, src2); // Software FP addition function. }
These built-in functions are available for the PowerPC family of processors:
float __builtin_recipdivf (float, float); float __builtin_rsqrtf (float); double __builtin_recipdiv (double, double); double __builtin_rsqrt (double); uint64_t __builtin_ppc_get_timebase (); unsigned long __builtin_ppc_mftb (); double __builtin_unpack_longdouble (long double, int); long double __builtin_pack_longdouble (double, double);
The vec_rsqrt
, __builtin_rsqrt
, and __builtin_rsqrtf
functions generate multiple instructions to implement the reciprocal sqrt functionality using reciprocal sqrt estimate instructions.
The __builtin_recipdiv
, and __builtin_recipdivf
functions generate multiple instructions to implement division using the reciprocal estimate instructions.
The __builtin_ppc_get_timebase
and __builtin_ppc_mftb
functions generate instructions to read the Time Base Register. The __builtin_ppc_get_timebase
function may generate multiple instructions and always returns the 64 bits of the Time Base Register. The __builtin_ppc_mftb
function always generates one instruction and returns the Time Base Register value as an unsigned long, throwing away the most significant word on 32-bit environments.
Additional built-in functions are available for the 64-bit PowerPC family of processors, for efficient use of 128-bit floating point (__float128
) values.
The following floating-point built-in functions are available with -mfloat128
and Altivec support. All of them implement the function that is part of the name.
__float128 __builtin_fabsq (__float128) __float128 __builtin_copysignq (__float128, __float128)
The following built-in functions are available with -mfloat128
and Altivec support.
__float128 __builtin_infq (void)
-
Similar to
__builtin_inf
, except the return type is__float128
. __float128 __builtin_huge_valq (void)
-
Similar to
__builtin_huge_val
, except the return type is__float128
. __float128 __builtin_nanq (void)
-
Similar to
__builtin_nan
, except the return type is__float128
. __float128 __builtin_nansq (void)
Similar to
__builtin_nans
, except the return type is__float128
.
The following built-in functions are available for the PowerPC family of processors, starting with ISA 2.06 or later (-mcpu=power7 or -mpopcntd):
long __builtin_bpermd (long, long); int __builtin_divwe (int, int); int __builtin_divweo (int, int); unsigned int __builtin_divweu (unsigned int, unsigned int); unsigned int __builtin_divweuo (unsigned int, unsigned int); long __builtin_divde (long, long); long __builtin_divdeo (long, long); unsigned long __builtin_divdeu (unsigned long, unsigned long); unsigned long __builtin_divdeuo (unsigned long, unsigned long); unsigned int cdtbcd (unsigned int); unsigned int cbcdtd (unsigned int); unsigned int addg6s (unsigned int, unsigned int);
The __builtin_divde
, __builtin_divdeo
, __builtin_divdeu
, __builtin_divdeou
functions require a 64-bit environment support ISA 2.06 or later.
The following built-in functions are available for the PowerPC family of processors, starting with ISA 3.0 or later (-mcpu=power9):
long long __builtin_darn (void); long long __builtin_darn_raw (void); int __builtin_darn_32 (void); int __builtin_dfp_dtstsfi_lt (unsigned int comparison, _Decimal64 value); int __builtin_dfp_dtstsfi_lt (unsigned int comparison, _Decimal128 value); int __builtin_dfp_dtstsfi_lt_dd (unsigned int comparison, _Decimal64 value); int __builtin_dfp_dtstsfi_lt_td (unsigned int comparison, _Decimal128 value); int __builtin_dfp_dtstsfi_gt (unsigned int comparison, _Decimal64 value); int __builtin_dfp_dtstsfi_gt (unsigned int comparison, _Decimal128 value); int __builtin_dfp_dtstsfi_gt_dd (unsigned int comparison, _Decimal64 value); int __builtin_dfp_dtstsfi_gt_td (unsigned int comparison, _Decimal128 value); int __builtin_dfp_dtstsfi_eq (unsigned int comparison, _Decimal64 value); int __builtin_dfp_dtstsfi_eq (unsigned int comparison, _Decimal128 value); int __builtin_dfp_dtstsfi_eq_dd (unsigned int comparison, _Decimal64 value); int __builtin_dfp_dtstsfi_eq_td (unsigned int comparison, _Decimal128 value); int __builtin_dfp_dtstsfi_ov (unsigned int comparison, _Decimal64 value); int __builtin_dfp_dtstsfi_ov (unsigned int comparison, _Decimal128 value); int __builtin_dfp_dtstsfi_ov_dd (unsigned int comparison, _Decimal64 value); int __builtin_dfp_dtstsfi_ov_td (unsigned int comparison, _Decimal128 value);
The __builtin_darn
and __builtin_darn_raw
functions require a 64-bit environment supporting ISA 3.0 or later. The __builtin_darn
function provides a 64-bit conditioned random number. The __builtin_darn_raw
function provides a 64-bit raw random number. The __builtin_darn_32
function provides a 32-bit random number.
The __builtin_dfp_dtstsfi_lt
function returns a non-zero value if and only if the number of signficant digits of its value
argument is less than its comparison
argument. The __builtin_dfp_dtstsfi_lt_dd
and __builtin_dfp_dtstsfi_lt_td
functions behave similarly, but require that the type of the value
argument be __Decimal64
and __Decimal128
respectively.
The __builtin_dfp_dtstsfi_gt
function returns a non-zero value if and only if the number of signficant digits of its value
argument is greater than its comparison
argument. The __builtin_dfp_dtstsfi_gt_dd
and __builtin_dfp_dtstsfi_gt_td
functions behave similarly, but require that the type of the value
argument be __Decimal64
and __Decimal128
respectively.
The __builtin_dfp_dtstsfi_eq
function returns a non-zero value if and only if the number of signficant digits of its value
argument equals its comparison
argument. The __builtin_dfp_dtstsfi_eq_dd
and __builtin_dfp_dtstsfi_eq_td
functions behave similarly, but require that the type of the value
argument be __Decimal64
and __Decimal128
respectively.
The __builtin_dfp_dtstsfi_ov
function returns a non-zero value if and only if its value
argument has an undefined number of significant digits, such as when value
is an encoding of NaN
. The __builtin_dfp_dtstsfi_ov_dd
and __builtin_dfp_dtstsfi_ov_td
functions behave similarly, but require that the type of the value
argument be __Decimal64
and __Decimal128
respectively.
The following built-in functions are available for the PowerPC family of processors when hardware decimal floating point (-mhard-dfp) is available:
long long __builtin_dxex (_Decimal64); long long __builtin_dxexq (_Decimal128); _Decimal64 __builtin_ddedpd (int, _Decimal64); _Decimal128 __builtin_ddedpdq (int, _Decimal128); _Decimal64 __builtin_denbcd (int, _Decimal64); _Decimal128 __builtin_denbcdq (int, _Decimal128); _Decimal64 __builtin_diex (long long, _Decimal64); _Decimal128 _builtin_diexq (long long, _Decimal128); _Decimal64 __builtin_dscli (_Decimal64, int); _Decimal128 __builtin_dscliq (_Decimal128, int); _Decimal64 __builtin_dscri (_Decimal64, int); _Decimal128 __builtin_dscriq (_Decimal128, int); unsigned long long __builtin_unpack_dec128 (_Decimal128, int); _Decimal128 __builtin_pack_dec128 (unsigned long long, unsigned long long);
The following built-in functions are available for the PowerPC family of processors when the Vector Scalar (vsx) instruction set is available:
unsigned long long __builtin_unpack_vector_int128 (vector __int128_t, int); vector __int128_t __builtin_pack_vector_int128 (unsigned long long, unsigned long long);
Next: PowerPC AltiVec/VSX Built-in Functions, Previous: picoChip Built-in Functions, Up: Target Builtins [Contents][Index]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-6.4.0/gcc/PowerPC-Built_002din-Functions.html