Using the GNU Compiler Collection (GCC): PowerPC Built-in Functions

Next: PowerPC AltiVec/VSX Built-in Functions, Previous: picoChip Built-in Functions, Up: Target Builtins [Contents][Index]

#### 6.59.20 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: 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 returns `0` otherwise

  The `__builtin_cpu_is` function requires GLIBC 2.23 or newer which exports the hardware capability bits. GCC defines the macro `__BUILTIN_CPU_SUPPORTS__` if the `__builtin_cpu_supports` built-in function is fully supported.

  If GCC was configured to use a GLIBC before 2.23, the built-in function `__builtin_cpu_is` always returns a 0 and the compiler issues a warning.

  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:

      #ifdef __BUILTIN_CPU_SUPPORTS__
        if (__builtin_cpu_is ("power8"))
          {
             do_power8 (); // POWER8 specific implementation.
          }
        else
      #endif
          {
             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 returns `0` otherwise.

  The `__builtin_cpu_supports` function requires GLIBC 2.23 or newer which exports the hardware capability bits. GCC defines the macro `__BUILTIN_CPU_SUPPORTS__` if the `__builtin_cpu_supports` built-in function is fully supported.

  If GCC was configured to use a GLIBC before 2.23, the built-in function `__builtin_cpu_suports` always returns a 0 and the compiler issues a warning.

  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:

      #ifdef __BUILTIN_CPU_SUPPORTS__
        if (__builtin_cpu_supports ("fpu"))
          {
             asm("fadd %0,%1,%2" : "=d"(dst) : "d"(src1), "d"(src2));
          }
        else
      #endif
          {
             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]