PowerPC Function Attributes - Using the GNU Compiler Collection (GCC)
Description: Using the GNU Compiler Collection (GCC)

Next: RL78 Function Attributes, Previous: Nvidia PTX Function Attributes, Up: Function Attributes

#### 6.31.23 PowerPC Function Attributes

These function attributes are supported by the PowerPC back end:

`longcall`
`shortcall`
  The `longcall` attribute indicates that the function might be far away from the call site and require a different (more expensive) calling sequence. The `shortcall` attribute indicates that the function is always close enough for the shorter calling sequence to be used. These attributes override both the `-mlongcall` switch and the `#pragma longcall` setting.

  See RS/6000 and PowerPC Options, for more information on whether long calls are necessary.

`target (`options`)`
  As discussed in Common Function Attributes, this attribute allows specification of target-specific compilation options.

  On the PowerPC, the following options are allowed:

  ‘`altivec`’
  ‘`no-altivec`’
    Generate code that uses (does not use) AltiVec instructions. In 32-bit code, you cannot enable AltiVec instructions unless `-mabi=altivec` is used on the command line.
  ‘`cmpb`’
  ‘`no-cmpb`’
    Generate code that uses (does not use) the compare bytes instruction implemented on the POWER6 processor and other processors that support the PowerPC V2.05 architecture.
  ‘`dlmzb`’
  ‘`no-dlmzb`’
    Generate code that uses (does not use) the string-search ‘`dlmzb`’ instruction on the IBM 405, 440, 464 and 476 processors. This instruction is generated by default when targeting those processors.
  ‘`fprnd`’
  ‘`no-fprnd`’
    Generate code that uses (does not use) the FP round to integer instructions implemented on the POWER5+ processor and other processors that support the PowerPC V2.03 architecture.
  ‘`hard-dfp`’
  ‘`no-hard-dfp`’
    Generate code that uses (does not use) the decimal floating-point instructions implemented on some POWER processors.
  ‘`isel`’
  ‘`no-isel`’
    Generate code that uses (does not use) ISEL instruction.
  ‘`mfcrf`’
  ‘`no-mfcrf`’
    Generate code that uses (does not use) the move from condition register field instruction implemented on the POWER4 processor and other processors that support the PowerPC V2.01 architecture.
  ‘`mfpgpr`’
  ‘`no-mfpgpr`’
    Generate code that uses (does not use) the FP move to/from general purpose register instructions implemented on the POWER6X processor and other processors that support the extended PowerPC V2.05 architecture.
  ‘`mulhw`’
  ‘`no-mulhw`’
    Generate code that uses (does not use) the half-word multiply and multiply-accumulate instructions on the IBM 405, 440, 464 and 476 processors. These instructions are generated by default when targeting those processors.
  ‘`multiple`’
  ‘`no-multiple`’
    Generate code that uses (does not use) the load multiple word instructions and the store multiple word instructions.
  ‘`update`’
  ‘`no-update`’
    Generate code that uses (does not use) the load or store instructions that update the base register to the address of the calculated memory location.
  ‘`popcntb`’
  ‘`no-popcntb`’
    Generate code that uses (does not use) the popcount and double-precision FP reciprocal estimate instruction implemented on the POWER5 processor and other processors that support the PowerPC V2.02 architecture.
  ‘`popcntd`’
  ‘`no-popcntd`’
    Generate code that uses (does not use) the popcount instruction implemented on the POWER7 processor and other processors that support the PowerPC V2.06 architecture.
  ‘`powerpc-gfxopt`’
  ‘`no-powerpc-gfxopt`’
    Generate code that uses (does not use) the optional PowerPC architecture instructions in the Graphics group, including floating-point select.
  ‘`powerpc-gpopt`’
  ‘`no-powerpc-gpopt`’
    Generate code that uses (does not use) the optional PowerPC architecture instructions in the General Purpose group, including floating-point square root.
  ‘`recip-precision`’
  ‘`no-recip-precision`’
    Assume (do not assume) that the reciprocal estimate instructions provide higher-precision estimates than is mandated by the PowerPC ABI.
  ‘`string`’
  ‘`no-string`’
    Generate code that uses (does not use) the load string instructions and the store string word instructions to save multiple registers and do small block moves.
  ‘`vsx`’
  ‘`no-vsx`’
    Generate code that uses (does not use) vector/scalar (VSX) instructions, and also enable the use of built-in functions that allow more direct access to the VSX instruction set. In 32-bit code, you cannot enable VSX or AltiVec instructions unless `-mabi=altivec` is used on the command line.
  ‘`friz`’
  ‘`no-friz`’
    Generate (do not generate) the `friz` instruction when the `-funsafe-math-optimizations` option is used to optimize rounding a floating-point value to 64-bit integer and back to floating point. The `friz` instruction does not return the same value if the floating-point number is too large to fit in an integer.
  ‘`avoid-indexed-addresses`’
  ‘`no-avoid-indexed-addresses`’
    Generate code that tries to avoid (not avoid) the use of indexed load or store instructions.
  ‘`paired`’
  ‘`no-paired`’
    Generate code that uses (does not use) the generation of PAIRED simd instructions.
  ‘`longcall`’
  ‘`no-longcall`’
    Generate code that assumes (does not assume) that all calls are far away so that a longer more expensive calling sequence is required.
  ‘`cpu=CPU`’
    Specify the architecture to generate code for when compiling the function. If you select the `target("cpu=power7")` attribute when generating 32-bit code, VSX and AltiVec instructions are not generated unless you use the `-mabi=altivec` option on the command line.
  ‘`tune=TUNE`’
    Specify the architecture to tune for when compiling the function. If you do not specify the `target("tune=`TUNE`")` attribute and you do specify the `target("cpu=`CPU`")` attribute, compilation tunes for the CPU architecture, and not the default tuning specified on the command line.

  On the PowerPC, the inliner does not inline a function that has different target options than the caller, unless the callee has a subset of the target options of the caller.