| Index: gcc/gcc/doc/extend.texi
|
| diff --git a/gcc/gcc/doc/extend.texi b/gcc/gcc/doc/extend.texi
|
| index 02c2725a5dcb5321d12a91aaee08d78a7aeae864..78d90930f5968efbdb6937af9532e63d3aa84c81 100644
|
| --- a/gcc/gcc/doc/extend.texi
|
| +++ b/gcc/gcc/doc/extend.texi
|
| @@ -1,5 +1,5 @@
|
| @c Copyright (C) 1988, 1989, 1992, 1993, 1994, 1996, 1998, 1999, 2000, 2001,
|
| -@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
|
| +@c 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
|
| @c Free Software Foundation, Inc.
|
|
|
| @c This is part of the GCC manual.
|
| @@ -21,8 +21,8 @@ These extensions are available in C and Objective-C@. Most of them are
|
| also available in C++. @xref{C++ Extensions,,Extensions to the
|
| C++ Language}, for extensions that apply @emph{only} to C++.
|
|
|
| -Some features that are in ISO C99 but not C89 or C++ are also, as
|
| -extensions, accepted by GCC in C89 mode and in C++.
|
| +Some features that are in ISO C99 but not C90 or C++ are also, as
|
| +extensions, accepted by GCC in C90 mode and in C++.
|
|
|
| @menu
|
| * Statement Exprs:: Putting statements and declarations inside expressions.
|
| @@ -35,9 +35,11 @@ extensions, accepted by GCC in C89 mode and in C++.
|
| * Long Long:: Double-word integers---@code{long long int}.
|
| * Complex:: Data types for complex numbers.
|
| * Floating Types:: Additional Floating Types.
|
| +* Half-Precision:: Half-Precision Floating Point.
|
| * Decimal Float:: Decimal Floating Types.
|
| * Hex Floats:: Hexadecimal floating-point constants.
|
| * Fixed-Point:: Fixed-Point Types.
|
| +* Named Address Spaces::Named address spaces.
|
| * Zero Length:: Zero-length arrays.
|
| * Variable Length:: Arrays whose length is computed at run time.
|
| * Empty Structures:: Structures with no members.
|
| @@ -371,11 +373,12 @@ This is more friendly to code living in shared libraries, as it reduces
|
| the number of dynamic relocations that are needed, and by consequence,
|
| allows the data to be read-only.
|
|
|
| -The @code{&&foo} expressions for the same label might have different values
|
| -if the containing function is inlined or cloned. If a program relies on
|
| -them being always the same, @code{__attribute__((__noinline__))} should
|
| -be used to prevent inlining. If @code{&&foo} is used
|
| -in a static variable initializer, inlining is forbidden.
|
| +The @code{&&foo} expressions for the same label might have different
|
| +values if the containing function is inlined or cloned. If a program
|
| +relies on them being always the same,
|
| +@code{__attribute__((__noinline__,__noclone__))} should be used to
|
| +prevent inlining and cloning. If @code{&&foo} is used in a static
|
| +variable initializer, inlining and cloning is forbidden.
|
|
|
| @node Nested Functions
|
| @section Nested Functions
|
| @@ -450,10 +453,9 @@ does not refer to anything that has gone out of scope, you should be
|
| safe.
|
|
|
| GCC implements taking the address of a nested function using a technique
|
| -called @dfn{trampolines}. A paper describing them is available as
|
| -
|
| -@noindent
|
| -@uref{http://people.debian.org/~aaronl/Usenix88-lexic.pdf}.
|
| +called @dfn{trampolines}. This technique was described in
|
| +@cite{Lexical Closures for C++} (Thomas M. Breuel, USENIX
|
| +C++ Conference Proceedings, October 17-21, 1988).
|
|
|
| A nested function can jump to a label inherited from a containing
|
| function, provided the label was explicitly declared in the containing
|
| @@ -663,6 +665,10 @@ A @code{typeof}-construct can be used anywhere a typedef name could be
|
| used. For example, you can use it in a declaration, in a cast, or inside
|
| of @code{sizeof} or @code{typeof}.
|
|
|
| +The operand of @code{typeof} is evaluated for its side effects if and
|
| +only if it is an expression of variably modified type or the name of
|
| +such a type.
|
| +
|
| @code{typeof} is often useful in conjunction with the
|
| statements-within-expressions feature. Here is how the two together can
|
| be used to define a safe ``maximum'' macro that operates on any
|
| @@ -807,7 +813,7 @@ effects of recomputing it.
|
| @cindex @code{ULL} integer suffix
|
|
|
| ISO C99 supports data types for integers that are at least 64 bits wide,
|
| -and as an extension GCC supports them in C89 mode and in C++.
|
| +and as an extension GCC supports them in C90 mode and in C++.
|
| Simply write @code{long long int} for a signed integer, or
|
| @code{unsigned long long int} for an unsigned integer. To make an
|
| integer constant of type @code{long long int}, add the suffix @samp{LL}
|
| @@ -837,7 +843,7 @@ Likewise, if the function expects @code{long long int} and you pass
|
| @cindex @code{__complex__} keyword
|
|
|
| ISO C99 supports complex floating data types, and as an extension GCC
|
| -supports them in C89 mode and in C++, and supports complex integer data
|
| +supports them in C90 mode and in C++, and supports complex integer data
|
| types which are not part of ISO C99. You can declare complex types
|
| using the keyword @code{_Complex}. As an extension, the older GNU
|
| keyword @code{__complex__} is also supported.
|
| @@ -916,6 +922,56 @@ typedef _Complex float __attribute__((mode(XC))) _Complex80;
|
| Not all targets support additional floating point types. @code{__float80}
|
| and @code{__float128} types are supported on i386, x86_64 and ia64 targets.
|
|
|
| +@node Half-Precision
|
| +@section Half-Precision Floating Point
|
| +@cindex half-precision floating point
|
| +@cindex @code{__fp16} data type
|
| +
|
| +On ARM targets, GCC supports half-precision (16-bit) floating point via
|
| +the @code{__fp16} type. You must enable this type explicitly
|
| +with the @option{-mfp16-format} command-line option in order to use it.
|
| +
|
| +ARM supports two incompatible representations for half-precision
|
| +floating-point values. You must choose one of the representations and
|
| +use it consistently in your program.
|
| +
|
| +Specifying @option{-mfp16-format=ieee} selects the IEEE 754-2008 format.
|
| +This format can represent normalized values in the range of @math{2^{-14}} to 65504.
|
| +There are 11 bits of significand precision, approximately 3
|
| +decimal digits.
|
| +
|
| +Specifying @option{-mfp16-format=alternative} selects the ARM
|
| +alternative format. This representation is similar to the IEEE
|
| +format, but does not support infinities or NaNs. Instead, the range
|
| +of exponents is extended, so that this format can represent normalized
|
| +values in the range of @math{2^{-14}} to 131008.
|
| +
|
| +The @code{__fp16} type is a storage format only. For purposes
|
| +of arithmetic and other operations, @code{__fp16} values in C or C++
|
| +expressions are automatically promoted to @code{float}. In addition,
|
| +you cannot declare a function with a return value or parameters
|
| +of type @code{__fp16}.
|
| +
|
| +Note that conversions from @code{double} to @code{__fp16}
|
| +involve an intermediate conversion to @code{float}. Because
|
| +of rounding, this can sometimes produce a different result than a
|
| +direct conversion.
|
| +
|
| +ARM provides hardware support for conversions between
|
| +@code{__fp16} and @code{float} values
|
| +as an extension to VFP and NEON (Advanced SIMD). GCC generates
|
| +code using these hardware instructions if you compile with
|
| +options to select an FPU that provides them;
|
| +for example, @option{-mfpu=neon-fp16 -mfloat-abi=softfp},
|
| +in addition to the @option{-mfp16-format} option to select
|
| +a half-precision format.
|
| +
|
| +Language-level support for the @code{__fp16} data type is
|
| +independent of whether GCC generates code using hardware floating-point
|
| +instructions. In cases where hardware support is not specified, GCC
|
| +implements conversions between @code{__fp16} and @code{float} values
|
| +as library calls.
|
| +
|
| @node Decimal Float
|
| @section Decimal Floating Types
|
| @cindex decimal floating types
|
| @@ -953,10 +1009,6 @@ is incomplete:
|
|
|
| @itemize @bullet
|
| @item
|
| -Pragma @code{FLOAT_CONST_DECIMAL64} is not supported, nor is the @samp{d}
|
| -suffix for literal constants of type @code{double}.
|
| -
|
| -@item
|
| When the value of a decimal floating type cannot be represented in the
|
| integer type to which it is being converted, the result is undefined
|
| rather than the result value specified by the draft technical report.
|
| @@ -980,7 +1032,7 @@ are supported by the DWARF2 debug information format.
|
| ISO C99 supports floating-point numbers written not only in the usual
|
| decimal notation, such as @code{1.55e1}, but also numbers such as
|
| @code{0x1.fp3} written in hexadecimal format. As a GNU extension, GCC
|
| -supports this in C89 mode (except in some cases when strictly
|
| +supports this in C90 mode (except in some cases when strictly
|
| conforming) and in C++. In that format the
|
| @samp{0x} hex introducer and the @samp{p} or @samp{P} exponent field are
|
| mandatory. The exponent is a decimal number that indicates the power of
|
| @@ -1147,6 +1199,31 @@ Pragmas to control overflow and rounding behaviors are not implemented.
|
|
|
| Fixed-point types are supported by the DWARF2 debug information format.
|
|
|
| +@node Named Address Spaces
|
| +@section Named address spaces
|
| +@cindex named address spaces
|
| +
|
| +As an extension, the GNU C compiler supports named address spaces as
|
| +defined in the N1275 draft of ISO/IEC DTR 18037. Support for named
|
| +address spaces in GCC will evolve as the draft technical report changes.
|
| +Calling conventions for any target might also change. At present, only
|
| +the SPU target supports other address spaces. On the SPU target, for
|
| +example, variables may be declared as belonging to another address space
|
| +by qualifying the type with the @code{__ea} address space identifier:
|
| +
|
| +@smallexample
|
| +extern int __ea i;
|
| +@end smallexample
|
| +
|
| +When the variable @code{i} is accessed, the compiler will generate
|
| +special code to access this variable. It may use runtime library
|
| +support, or generate special machine instructions to access that address
|
| +space.
|
| +
|
| +The @code{__ea} identifier may be used exactly like any other C type
|
| +qualifier (e.g., @code{const} or @code{volatile}). See the N1275
|
| +document for more details.
|
| +
|
| @node Zero Length
|
| @section Arrays of Length Zero
|
| @cindex arrays of length zero
|
| @@ -1268,7 +1345,7 @@ member of type @code{char}.
|
| @cindex VLAs
|
|
|
| Variable-length automatic arrays are allowed in ISO C99, and as an
|
| -extension GCC accepts them in C89 mode and in C++. (However, GCC's
|
| +extension GCC accepts them in C90 mode and in C++. (However, GCC's
|
| implementation of variable-length arrays does not yet conform in detail
|
| to the ISO C99 standard.) These arrays are
|
| declared like any other automatic arrays, but with a length that is not
|
| @@ -1434,9 +1511,9 @@ In ISO C99, arrays that are not lvalues still decay to pointers, and
|
| may be subscripted, although they may not be modified or used after
|
| the next sequence point and the unary @samp{&} operator may not be
|
| applied to them. As an extension, GCC allows such arrays to be
|
| -subscripted in C89 mode, though otherwise they do not decay to
|
| +subscripted in C90 mode, though otherwise they do not decay to
|
| pointers outside C99 mode. For example,
|
| -this is valid in GNU C though not valid in C89:
|
| +this is valid in GNU C though not valid in C90:
|
|
|
| @smallexample
|
| @group
|
| @@ -1499,7 +1576,7 @@ ISO C99 supports compound literals. A compound literal looks like
|
| a cast containing an initializer. Its value is an object of the
|
| type specified in the cast, containing the elements specified in
|
| the initializer; it is an lvalue. As an extension, GCC supports
|
| -compound literals in C89 mode and in C++.
|
| +compound literals in C90 mode and in C++.
|
|
|
| Usually, the specified type is a structure. Assume that
|
| @code{struct foo} and @code{structure} are declared as shown:
|
| @@ -1569,13 +1646,13 @@ static int z[] = @{1, 0, 0@};
|
| @cindex case labels in initializers
|
| @cindex designated initializers
|
|
|
| -Standard C89 requires the elements of an initializer to appear in a fixed
|
| +Standard C90 requires the elements of an initializer to appear in a fixed
|
| order, the same as the order of the elements in the array or structure
|
| being initialized.
|
|
|
| In ISO C99 you can give the elements in any order, specifying the array
|
| indices or structure field names they apply to, and GNU C allows this as
|
| -an extension in C89 mode as well. This extension is not
|
| +an extension in C90 mode as well. This extension is not
|
| implemented in GNU C++.
|
|
|
| To specify an array index, write
|
| @@ -1792,7 +1869,7 @@ hack ((union foo) x);
|
|
|
| ISO C99 and ISO C++ allow declarations and code to be freely mixed
|
| within compound statements. As an extension, GCC also allows this in
|
| -C89 mode. For example, you could do:
|
| +C90 mode. For example, you could do:
|
|
|
| @smallexample
|
| int i;
|
| @@ -1832,19 +1909,20 @@ attributes when making a declaration. This keyword is followed by an
|
| attribute specification inside double parentheses. The following
|
| attributes are currently defined for functions on all targets:
|
| @code{aligned}, @code{alloc_size}, @code{noreturn},
|
| -@code{returns_twice}, @code{noinline}, @code{always_inline},
|
| -@code{flatten}, @code{pure}, @code{const}, @code{nothrow},
|
| -@code{sentinel}, @code{format}, @code{format_arg},
|
| +@code{returns_twice}, @code{noinline}, @code{noclone},
|
| +@code{always_inline}, @code{flatten}, @code{pure}, @code{const},
|
| +@code{nothrow}, @code{sentinel}, @code{format}, @code{format_arg},
|
| @code{no_instrument_function}, @code{section}, @code{constructor},
|
| @code{destructor}, @code{used}, @code{unused}, @code{deprecated},
|
| @code{weak}, @code{malloc}, @code{alias}, @code{warn_unused_result},
|
| @code{nonnull}, @code{gnu_inline}, @code{externally_visible},
|
| -@code{hot}, @code{cold}, @code{artificial}, @code{error}
|
| -and @code{warning}.
|
| -Several other attributes are defined for functions on particular
|
| -target systems. Other attributes, including @code{section} are
|
| -supported for variables declarations (@pxref{Variable Attributes}) and
|
| -for types (@pxref{Type Attributes}).
|
| +@code{hot}, @code{cold}, @code{artificial}, @code{error} and
|
| +@code{warning}. Several other attributes are defined for functions on
|
| +particular target systems. Other attributes, including @code{section}
|
| +are supported for variables declarations (@pxref{Variable Attributes})
|
| +and for types (@pxref{Type Attributes}).
|
| +
|
| +GCC plugins may provide their own attributes.
|
|
|
| You may also specify attributes with @samp{__} preceding and following
|
| each keyword. This allows you to use them in header files without
|
| @@ -1928,7 +2006,7 @@ if no optimization level was specified.
|
| @cindex @code{gnu_inline} function attribute
|
| This attribute should be used with a function which is also declared
|
| with the @code{inline} keyword. It directs GCC to treat the function
|
| -as if it were defined in gnu89 mode even when compiling in C99 or
|
| +as if it were defined in gnu90 mode even when compiling in C99 or
|
| gnu99 mode.
|
|
|
| If the function is declared @code{extern}, then this definition of the
|
| @@ -1970,6 +2048,12 @@ info format it will either mean marking the function as artificial
|
| or using the caller location for all instructions within the inlined
|
| body.
|
|
|
| +@item bank_switch
|
| +@cindex interrupt handler functions
|
| +When added to an interrupt handler with the M32C port, causes the
|
| +prologue and epilogue to use bank switching to preserve the registers
|
| +rather than saving them on the stack.
|
| +
|
| @item flatten
|
| @cindex @code{flatten} function attribute
|
| Generally, inlining into a function is limited. For a function marked with
|
| @@ -2064,6 +2148,7 @@ objects (@pxref{C++ Attributes}).
|
| These attributes are not currently implemented for Objective-C@.
|
|
|
| @item deprecated
|
| +@itemx deprecated (@var{msg})
|
| @cindex @code{deprecated} attribute.
|
| The @code{deprecated} attribute results in a warning if the function
|
| is used anywhere in the source file. This is useful when identifying
|
| @@ -2079,11 +2164,19 @@ int old_fn ();
|
| int (*fn_ptr)() = old_fn;
|
| @end smallexample
|
|
|
| -results in a warning on line 3 but not line 2.
|
| +results in a warning on line 3 but not line 2. The optional msg
|
| +argument, which must be a string, will be printed in the warning if
|
| +present.
|
|
|
| The @code{deprecated} attribute can also be used for variables and
|
| types (@pxref{Variable Attributes}, @pxref{Type Attributes}.)
|
|
|
| +@item disinterrupt
|
| +@cindex @code{disinterrupt} attribute
|
| +On MeP targets, this attribute causes the compiler to emit
|
| +instructions to disable interrupts for the duration of the given
|
| +function.
|
| +
|
| @item dllexport
|
| @cindex @code{__declspec(dllexport)}
|
| On Microsoft Windows targets and Symbian OS targets the
|
| @@ -2148,7 +2241,7 @@ On the SH Symbian OS target the @code{dllimport} attribute also has
|
| another affect---it can cause the vtable and run-time type information
|
| for a class to be exported. This happens when the class has a
|
| dllimport'ed constructor or a non-inline, non-pure virtual function
|
| -and, for either of those two conditions, the class also has a inline
|
| +and, for either of those two conditions, the class also has an inline
|
| constructor or destructor and has a key function that is defined in
|
| the current translation unit.
|
|
|
| @@ -2210,6 +2303,17 @@ At the end of a function, it will jump to a board-specific routine
|
| instead of using @code{rts}. The board-specific return routine simulates
|
| the @code{rtc}.
|
|
|
| +On MeP targets this causes the compiler to use a calling convention
|
| +which assumes the called function is too far away for the built-in
|
| +addressing modes.
|
| +
|
| +@item fast_interrupt
|
| +@cindex interrupt handler functions
|
| +Use this attribute on the M32C and RX ports to indicate that the specified
|
| +function is a fast interrupt handler. This is just like the
|
| +@code{interrupt} attribute, except that @code{freit} is used to return
|
| +instead of @code{reit}.
|
| +
|
| @item fastcall
|
| @cindex functions that pop the argument stack on the 386
|
| On the Intel 386, the @code{fastcall} attribute causes the compiler to
|
| @@ -2397,8 +2501,8 @@ This attribute is ignored for R8C target.
|
|
|
| @item interrupt
|
| @cindex interrupt handler functions
|
| -Use this attribute on the ARM, AVR, CRX, M32C, M32R/D, m68k,
|
| -and Xstormy16 ports to indicate that the specified function is an
|
| +Use this attribute on the ARM, AVR, CRX, M32C, M32R/D, m68k, MeP, MIPS,
|
| +RX and Xstormy16 ports to indicate that the specified function is an
|
| interrupt handler. The compiler will generate function entry and exit
|
| sequences suitable for use in an interrupt handler when this attribute
|
| is present.
|
| @@ -2420,6 +2524,42 @@ Permissible values for this parameter are: IRQ, FIQ, SWI, ABORT and UNDEF@.
|
| On ARMv7-M the interrupt type is ignored, and the attribute means the function
|
| may be called with a word aligned stack pointer.
|
|
|
| +On MIPS targets, you can use the following attributes to modify the behavior
|
| +of an interrupt handler:
|
| +@table @code
|
| +@item use_shadow_register_set
|
| +@cindex @code{use_shadow_register_set} attribute
|
| +Assume that the handler uses a shadow register set, instead of
|
| +the main general-purpose registers.
|
| +
|
| +@item keep_interrupts_masked
|
| +@cindex @code{keep_interrupts_masked} attribute
|
| +Keep interrupts masked for the whole function. Without this attribute,
|
| +GCC tries to reenable interrupts for as much of the function as it can.
|
| +
|
| +@item use_debug_exception_return
|
| +@cindex @code{use_debug_exception_return} attribute
|
| +Return using the @code{deret} instruction. Interrupt handlers that don't
|
| +have this attribute return using @code{eret} instead.
|
| +@end table
|
| +
|
| +You can use any combination of these attributes, as shown below:
|
| +@smallexample
|
| +void __attribute__ ((interrupt)) v0 ();
|
| +void __attribute__ ((interrupt, use_shadow_register_set)) v1 ();
|
| +void __attribute__ ((interrupt, keep_interrupts_masked)) v2 ();
|
| +void __attribute__ ((interrupt, use_debug_exception_return)) v3 ();
|
| +void __attribute__ ((interrupt, use_shadow_register_set,
|
| + keep_interrupts_masked)) v4 ();
|
| +void __attribute__ ((interrupt, use_shadow_register_set,
|
| + use_debug_exception_return)) v5 ();
|
| +void __attribute__ ((interrupt, keep_interrupts_masked,
|
| + use_debug_exception_return)) v6 ();
|
| +void __attribute__ ((interrupt, use_shadow_register_set,
|
| + keep_interrupts_masked,
|
| + use_debug_exception_return)) v7 ();
|
| +@end smallexample
|
| +
|
| @item interrupt_handler
|
| @cindex interrupt handler functions on the Blackfin, m68k, H8/300 and SH processors
|
| Use this attribute on the Blackfin, m68k, H8/300, H8/300H, H8S, and SH to
|
| @@ -2453,6 +2593,13 @@ SRAM@. The function will be put into a specific section named @code{.l1.text}.
|
| With @option{-mfdpic}, function calls with a such function as the callee
|
| or caller will use inlined PLT.
|
|
|
| +@item l2
|
| +@cindex @code{l2} function attribute
|
| +On the Blackfin, this attribute specifies a function to be placed into L2
|
| +SRAM. The function will be put into a specific section named
|
| +@code{.l1.text}. With @option{-mfdpic}, callers of such functions will use
|
| +an inlined PLT.
|
| +
|
| @item long_call/short_call
|
| @cindex indirect calls on ARM
|
| This attribute specifies how a particular function is called on
|
| @@ -2559,11 +2706,20 @@ attribute tells the compiler to use the Microsoft ABI, while the
|
| GNU/Linux and other systems. The default is to use the Microsoft ABI
|
| when targeting Windows. On all other systems, the default is the AMD ABI.
|
|
|
| -Note, This feature is currently sorried out for Windows targets trying to
|
| +Note, the @code{ms_abi} attribute for Windows targets currently requires
|
| +the @option{-maccumulate-outgoing-args} option.
|
| +
|
| +@item ms_hook_prologue
|
| +@cindex @code{ms_hook_prologue} attribute
|
| +
|
| +On 32 bit i[34567]86-*-* targets, you can use this function attribute to make
|
| +gcc generate the "hot-patching" function prologue used in Win32 API
|
| +functions in Microsoft Windows XP Service Pack 2 and newer. This requires
|
| +support for the swap suffix in the assembler. (GNU Binutils 2.19.51 or later)
|
|
|
| @item naked
|
| @cindex function without a prologue/epilogue code
|
| -Use this attribute on the ARM, AVR, IP2K and SPU ports to indicate that
|
| +Use this attribute on the ARM, AVR, IP2K, RX and SPU ports to indicate that
|
| the specified function does not need prologue/epilogue sequences generated by
|
| the compiler. It is up to the programmer to provide these sequences. The
|
| only statements that can be safely included in naked functions are
|
| @@ -2580,6 +2736,10 @@ use the normal calling convention based on @code{jsr} and @code{rts}.
|
| This attribute can be used to cancel the effect of the @option{-mlong-calls}
|
| option.
|
|
|
| +On MeP targets this attribute causes the compiler to assume the called
|
| +function is close enough to use the normal calling convention,
|
| +overriding the @code{-mtf} command line option.
|
| +
|
| @item nesting
|
| @cindex Allow nesting in an interrupt handler on the Blackfin processor.
|
| Use this attribute together with @code{interrupt_handler},
|
| @@ -2616,6 +2776,13 @@ asm ("");
|
| (@pxref{Extended Asm}) in the called function, to serve as a special
|
| side-effect.
|
|
|
| +@item noclone
|
| +@cindex @code{noclone} function attribute
|
| +This function attribute prevents a function from being considered for
|
| +cloning - a mechanism which produces specialized copies of functions
|
| +and which is (currently) performed by interprocedural constant
|
| +propagation.
|
| +
|
| @item nonnull (@var{arg-index}, @dots{})
|
| @cindex @code{nonnull} function attribute
|
| The @code{nonnull} attribute specifies that some function parameters should
|
| @@ -2721,6 +2888,28 @@ compiled with more aggressive optimization options that produce faster
|
| and larger code, while other functions can be called with less
|
| aggressive options.
|
|
|
| +@item pcs
|
| +@cindex @code{pcs} function attribute
|
| +
|
| +The @code{pcs} attribute can be used to control the calling convention
|
| +used for a function on ARM. The attribute takes an argument that specifies
|
| +the calling convention to use.
|
| +
|
| +When compiling using the AAPCS ABI (or a variant of that) then valid
|
| +values for the argument are @code{"aapcs"} and @code{"aapcs-vfp"}. In
|
| +order to use a variant other than @code{"aapcs"} then the compiler must
|
| +be permitted to use the appropriate co-processor registers (i.e., the
|
| +VFP registers must be available in order to use @code{"aapcs-vfp"}).
|
| +For example,
|
| +
|
| +@smallexample
|
| +/* Argument passed in r0, and result returned in r0+r1. */
|
| +double f2d (float) __attribute__((pcs("aapcs")));
|
| +@end smallexample
|
| +
|
| +Variadic functions always use the @code{"aapcs"} calling convention and
|
| +the compiler will reject attempts to specify an alternative.
|
| +
|
| @item pure
|
| @cindex @code{pure} function attribute
|
| Many functions have no effects except the return value and their
|
| @@ -3017,10 +3206,20 @@ Enable/disable the generation of the sse4.2 instructions.
|
| @cindex @code{target("sse4a")} attribute
|
| Enable/disable the generation of the SSE4A instructions.
|
|
|
| -@item sse5
|
| -@itemx no-sse5
|
| -@cindex @code{target("sse5")} attribute
|
| -Enable/disable the generation of the SSE5 instructions.
|
| +@item fma4
|
| +@itemx no-fma4
|
| +@cindex @code{target("fma4")} attribute
|
| +Enable/disable the generation of the FMA4 instructions.
|
| +
|
| +@item xop
|
| +@itemx no-xop
|
| +@cindex @code{target("xop")} attribute
|
| +Enable/disable the generation of the XOP instructions.
|
| +
|
| +@item lwp
|
| +@itemx no-lwp
|
| +@cindex @code{target("lwp")} attribute
|
| +Enable/disable the generation of the LWP instructions.
|
|
|
| @item ssse3
|
| @itemx no-ssse3
|
| @@ -3093,8 +3292,8 @@ options, or you can separate the option with a comma (@code{,}).
|
| On the 386, the inliner will 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. For example a function declared with
|
| -@code{target("sse5")} can inline a function with
|
| -@code{target("sse2")}, since @code{-msse5} implies @code{-msse2}.
|
| +@code{target("sse3")} can inline a function with
|
| +@code{target("sse2")}, since @code{-msse3} implies @code{-msse2}.
|
|
|
| The @code{target} attribute is not implemented in GCC versions earlier
|
| than 4.4, and at present only the 386 uses it.
|
| @@ -3234,6 +3433,13 @@ visibility of their template.
|
| If both the template and enclosing class have explicit visibility, the
|
| visibility from the template is used.
|
|
|
| +@item vliw
|
| +@cindex @code{vliw} attribute
|
| +On MeP, the @code{vliw} attribute tells the compiler to emit
|
| +instructions in VLIW mode instead of core mode. Note that this
|
| +attribute is not allowed unless a VLIW coprocessor has been configured
|
| +and enabled through command line options.
|
| +
|
| @item warn_unused_result
|
| @cindex @code{warn_unused_result} attribute
|
| The @code{warn_unused_result} attribute causes a warning to be emitted
|
| @@ -3400,11 +3606,13 @@ feature is intended for code generated by programs which contains labels
|
| that may be unused but which is compiled with @option{-Wall}. It would
|
| not normally be appropriate to use in it human-written code, though it
|
| could be useful in cases where the code that jumps to the label is
|
| -contained within an @code{#ifdef} conditional. GNU C++ does not permit
|
| -such placement of attribute lists, as it is permissible for a
|
| -declaration, which could begin with an attribute list, to be labelled in
|
| -C++. Declarations cannot be labelled in C90 or C99, so the ambiguity
|
| -does not arise there.
|
| +contained within an @code{#ifdef} conditional. GNU C++ only permits
|
| +attributes on labels if the attribute specifier is immediately
|
| +followed by a semicolon (i.e., the label applies to an empty
|
| +statement). If the semicolon is missing, C++ label attributes are
|
| +ambiguous, as it is permissible for a declaration, which could begin
|
| +with an attribute list, to be labelled in C++. Declarations cannot be
|
| +labelled in C90 or C99, so the ambiguity does not arise there.
|
|
|
| An attribute specifier list may appear as part of a @code{struct},
|
| @code{union} or @code{enum} specifier. It may go either immediately
|
| @@ -3630,7 +3838,7 @@ continue until the end of the line. Many other C implementations allow
|
| such comments, and they are included in the 1999 C standard. However,
|
| C++ style comments are not recognized if you specify an @option{-std}
|
| option specifying a version of ISO C before C99, or @option{-ansi}
|
| -(equivalent to @option{-std=c89}).
|
| +(equivalent to @option{-std=c90}).
|
|
|
| @node Dollar Signs
|
| @section Dollar Signs in Identifier Names
|
| @@ -3808,6 +4016,7 @@ These attributes override the default chosen by the
|
| @option{-fno-common} and @option{-fcommon} flags respectively.
|
|
|
| @item deprecated
|
| +@itemx deprecated (@var{msg})
|
| @cindex @code{deprecated} attribute
|
| The @code{deprecated} attribute results in a warning if the variable
|
| is used anywhere in the source file. This is useful when identifying
|
| @@ -3823,7 +4032,9 @@ extern int old_var;
|
| int new_fn () @{ return old_var; @}
|
| @end smallexample
|
|
|
| -results in a warning on line 3 but not line 2.
|
| +results in a warning on line 3 but not line 2. The optional msg
|
| +argument, which must be a string, will be printed in the warning if
|
| +present.
|
|
|
| The @code{deprecated} attribute can also be used for functions and
|
| types (@pxref{Function Attributes}, @pxref{Type Attributes}.)
|
| @@ -4025,8 +4236,8 @@ Three attributes are currently defined for the Blackfin.
|
|
|
| @table @code
|
| @item l1_data
|
| -@item l1_data_A
|
| -@item l1_data_B
|
| +@itemx l1_data_A
|
| +@itemx l1_data_B
|
| @cindex @code{l1_data} variable attribute
|
| @cindex @code{l1_data_A} variable attribute
|
| @cindex @code{l1_data_B} variable attribute
|
| @@ -4035,6 +4246,12 @@ Variables with @code{l1_data} attribute will be put into the specific section
|
| named @code{.l1.data}. Those with @code{l1_data_A} attribute will be put into
|
| the specific section named @code{.l1.data.A}. Those with @code{l1_data_B}
|
| attribute will be put into the specific section named @code{.l1.data.B}.
|
| +
|
| +@item l2
|
| +@cindex @code{l2} variable attribute
|
| +Use this attribute on the Blackfin to place the variable into L2 SRAM.
|
| +Variables with @code{l2} attribute will be put into the specific section
|
| +named @code{.l2.data}.
|
| @end table
|
|
|
| @subsection M32R/D Variable Attributes
|
| @@ -4056,6 +4273,64 @@ Medium and large model objects may live anywhere in the 32-bit address space
|
| addresses).
|
| @end table
|
|
|
| +@anchor{MeP Variable Attributes}
|
| +@subsection MeP Variable Attributes
|
| +
|
| +The MeP target has a number of addressing modes and busses. The
|
| +@code{near} space spans the standard memory space's first 16 megabytes
|
| +(24 bits). The @code{far} space spans the entire 32-bit memory space.
|
| +The @code{based} space is a 128 byte region in the memory space which
|
| +is addressed relative to the @code{$tp} register. The @code{tiny}
|
| +space is a 65536 byte region relative to the @code{$gp} register. In
|
| +addition to these memory regions, the MeP target has a separate 16-bit
|
| +control bus which is specified with @code{cb} attributes.
|
| +
|
| +@table @code
|
| +
|
| +@item based
|
| +Any variable with the @code{based} attribute will be assigned to the
|
| +@code{.based} section, and will be accessed with relative to the
|
| +@code{$tp} register.
|
| +
|
| +@item tiny
|
| +Likewise, the @code{tiny} attribute assigned variables to the
|
| +@code{.tiny} section, relative to the @code{$gp} register.
|
| +
|
| +@item near
|
| +Variables with the @code{near} attribute are assumed to have addresses
|
| +that fit in a 24-bit addressing mode. This is the default for large
|
| +variables (@code{-mtiny=4} is the default) but this attribute can
|
| +override @code{-mtiny=} for small variables, or override @code{-ml}.
|
| +
|
| +@item far
|
| +Variables with the @code{far} attribute are addressed using a full
|
| +32-bit address. Since this covers the entire memory space, this
|
| +allows modules to make no assumptions about where variables might be
|
| +stored.
|
| +
|
| +@item io
|
| +@itemx io (@var{addr})
|
| +Variables with the @code{io} attribute are used to address
|
| +memory-mapped peripherals. If an address is specified, the variable
|
| +is assigned that address, else it is not assigned an address (it is
|
| +assumed some other module will assign an address). Example:
|
| +
|
| +@example
|
| +int timer_count __attribute__((io(0x123)));
|
| +@end example
|
| +
|
| +@item cb
|
| +@itemx cb (@var{addr})
|
| +Variables with the @code{cb} attribute are used to access the control
|
| +bus, using special instructions. @code{addr} indicates the control bus
|
| +address. Example:
|
| +
|
| +@example
|
| +int cpu_clock __attribute__((cb(0x123)));
|
| +@end example
|
| +
|
| +@end table
|
| +
|
| @anchor{i386 Variable Attributes}
|
| @subsection i386 Variable Attributes
|
|
|
| @@ -4381,7 +4656,7 @@ struct __attribute__ ((__packed__)) my_packed_struct
|
| @};
|
| @end smallexample
|
|
|
| -You may only specify this attribute on the definition of a @code{enum},
|
| +You may only specify this attribute on the definition of an @code{enum},
|
| @code{struct} or @code{union}, not on a @code{typedef} which does not
|
| also define the enumerated type, structure or union.
|
|
|
| @@ -4453,6 +4728,7 @@ not referenced, but contain constructors and destructors that have
|
| nontrivial bookkeeping functions.
|
|
|
| @item deprecated
|
| +@itemx deprecated (@var{msg})
|
| The @code{deprecated} attribute results in a warning if the type
|
| is used anywhere in the source file. This is useful when identifying
|
| types that are expected to be removed in a future version of a program.
|
| @@ -4475,7 +4751,9 @@ T3 z __attribute__ ((deprecated));
|
| results in a warning on line 2 and 3 but not lines 4, 5, or 6. No
|
| warning is issued for line 4 because T2 is not explicitly
|
| deprecated. Line 5 has no warning because T3 is explicitly
|
| -deprecated. Similarly for line 6.
|
| +deprecated. Similarly for line 6. The optional msg
|
| +argument, which must be a string, will be printed in the warning if
|
| +present.
|
|
|
| The @code{deprecated} attribute can also be used for functions and
|
| variables (@pxref{Function Attributes}, @pxref{Variable Attributes}.)
|
| @@ -4555,6 +4833,14 @@ virtual table for @code{C} is not exported. (You can use
|
| @code{__attribute__} instead of @code{__declspec} if you prefer, but
|
| most Symbian OS code uses @code{__declspec}.)
|
|
|
| +@anchor{MeP Type Attributes}
|
| +@subsection MeP Type Attributes
|
| +
|
| +Many of the MeP variable attributes may be applied to types as well.
|
| +Specifically, the @code{based}, @code{tiny}, @code{near}, and
|
| +@code{far} attributes may be applied to either. The @code{io} and
|
| +@code{cb} attributes may not be applied to types.
|
| +
|
| @anchor{i386 Type Attributes}
|
| @subsection i386 Type Attributes
|
|
|
| @@ -4653,7 +4939,7 @@ inc (int *a)
|
| @}
|
| @end smallexample
|
|
|
| -If you are writing a header file to be included in ISO C89 programs, write
|
| +If you are writing a header file to be included in ISO C90 programs, write
|
| @code{__inline__} instead of @code{inline}. @xref{Alternate Keywords}.
|
|
|
| The three types of inlining behave similarly in two important cases:
|
| @@ -4716,7 +5002,7 @@ the @samp{always_inline} attribute for the function, like this:
|
| inline void foo (const char) __attribute__((always_inline));
|
| @end smallexample
|
|
|
| -The remainder of this section is specific to GNU C89 inlining.
|
| +The remainder of this section is specific to GNU C90 inlining.
|
|
|
| @cindex non-static inline function
|
| When an inline function is not @code{static}, then the compiler must assume
|
| @@ -5013,7 +5299,7 @@ and most Unix assemblers do.
|
| Speaking of labels, jumps from one @code{asm} to another are not
|
| supported. The compiler's optimizers do not know about these jumps, and
|
| therefore they cannot take account of them when deciding how to
|
| -optimize.
|
| +optimize. @xref{Extended asm with goto}.
|
|
|
| @cindex macros containing @code{asm}
|
| Usually the most convenient way to use these @code{asm} instructions is to
|
| @@ -5112,6 +5398,94 @@ For reasons similar to those described above, it is not possible to give
|
| an assembler instruction access to the condition code left by previous
|
| instructions.
|
|
|
| +@anchor{Extended asm with goto}
|
| +As of GCC version 4.5, @code{asm goto} may be used to have the assembly
|
| +jump to one or more C labels. In this form, a fifth section after the
|
| +clobber list contains a list of all C labels to which the assembly may jump.
|
| +Each label operand is implicitly self-named. The @code{asm} is also assumed
|
| +to fall through to the next statement.
|
| +
|
| +This form of @code{asm} is restricted to not have outputs. This is due
|
| +to a internal restriction in the compiler that control transfer instructions
|
| +cannot have outputs. This restriction on @code{asm goto} may be lifted
|
| +in some future version of the compiler. In the mean time, @code{asm goto}
|
| +may include a memory clobber, and so leave outputs in memory.
|
| +
|
| +@smallexample
|
| +int frob(int x)
|
| +@{
|
| + int y;
|
| + asm goto ("frob %%r5, %1; jc %l[error]; mov (%2), %%r5"
|
| + : : "r"(x), "r"(&y) : "r5", "memory" : error);
|
| + return y;
|
| + error:
|
| + return -1;
|
| +@}
|
| +@end smallexample
|
| +
|
| +In this (inefficient) example, the @code{frob} instruction sets the
|
| +carry bit to indicate an error. The @code{jc} instruction detects
|
| +this and branches to the @code{error} label. Finally, the output
|
| +of the @code{frob} instruction (@code{%r5}) is stored into the memory
|
| +for variable @code{y}, which is later read by the @code{return} statement.
|
| +
|
| +@smallexample
|
| +void doit(void)
|
| +@{
|
| + int i = 0;
|
| + asm goto ("mfsr %%r1, 123; jmp %%r1;"
|
| + ".pushsection doit_table;"
|
| + ".long %l0, %l1, %l2, %l3;"
|
| + ".popsection"
|
| + : : : "r1" : label1, label2, label3, label4);
|
| + __builtin_unreachable ();
|
| +
|
| + label1:
|
| + f1();
|
| + return;
|
| + label2:
|
| + f2();
|
| + return;
|
| + label3:
|
| + i = 1;
|
| + label4:
|
| + f3(i);
|
| +@}
|
| +@end smallexample
|
| +
|
| +In this (also inefficient) example, the @code{mfsr} instruction reads
|
| +an address from some out-of-band machine register, and the following
|
| +@code{jmp} instruction branches to that address. The address read by
|
| +the @code{mfsr} instruction is assumed to have been previously set via
|
| +some application-specific mechanism to be one of the four values stored
|
| +in the @code{doit_table} section. Finally, the @code{asm} is followed
|
| +by a call to @code{__builtin_unreachable} to indicate that the @code{asm}
|
| +does not in fact fall through.
|
| +
|
| +@smallexample
|
| +#define TRACE1(NUM) \
|
| + do @{ \
|
| + asm goto ("0: nop;" \
|
| + ".pushsection trace_table;" \
|
| + ".long 0b, %l0;" \
|
| + ".popsection" \
|
| + : : : : trace#NUM); \
|
| + if (0) @{ trace#NUM: trace(); @} \
|
| + @} while (0)
|
| +#define TRACE TRACE1(__COUNTER__)
|
| +@end smallexample
|
| +
|
| +In this example (which in fact inspired the @code{asm goto} feature)
|
| +we want on rare occasions to call the @code{trace} function; on other
|
| +occasions we'd like to keep the overhead to the absolute minimum.
|
| +The normal code path consists of a single @code{nop} instruction.
|
| +However, we record the address of this @code{nop} together with the
|
| +address of a label that calls the @code{trace} function. This allows
|
| +the @code{nop} instruction to be patched at runtime to be an
|
| +unconditional branch to the stored label. It is assumed that an
|
| +optimizing compiler will move the labeled block out of line, to
|
| +optimize the fall through path from the @code{asm}.
|
| +
|
| If you are writing a header file that should be includable in ISO C
|
| programs, write @code{__asm__} instead of @code{asm}. @xref{Alternate
|
| Keywords}.
|
| @@ -5632,10 +6006,27 @@ of the stack has been reached, this function will return @code{0} or a
|
| random value. In addition, @code{__builtin_frame_address} may be used
|
| to determine if the top of the stack has been reached.
|
|
|
| +Additional post-processing of the returned value may be needed, see
|
| +@code{__builtin_extract_return_address}.
|
| +
|
| This function should only be used with a nonzero argument for debugging
|
| purposes.
|
| @end deftypefn
|
|
|
| +@deftypefn {Built-in Function} {void *} __builtin_extract_return_address (void *@var{addr})
|
| +The address as returned by @code{__builtin_return_address} may have to be fed
|
| +through this function to get the actual encoded address. For example, on the
|
| +31-bit S/390 platform the highest bit has to be masked out, or on SPARC
|
| +platforms an offset has to be added for the true next instruction to be
|
| +executed.
|
| +
|
| +If no fixup is needed, this function simply passes through @var{addr}.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} {void *} __builtin_frob_return_address (void *@var{addr})
|
| +This function does the reverse of @code{__builtin_extract_return_address}.
|
| +@end deftypefn
|
| +
|
| @deftypefn {Built-in Function} {void *} __builtin_frame_address (unsigned int @var{level})
|
| This function is similar to @code{__builtin_return_address}, but it
|
| returns the address of the function frame rather than the return address
|
| @@ -5666,7 +6057,7 @@ purposes.
|
|
|
| On some targets, the instruction set contains SIMD vector instructions that
|
| operate on multiple values contained in one large register at the same time.
|
| -For example, on the i386 the MMX, 3Dnow! and SSE extensions can be used
|
| +For example, on the i386 the MMX, 3DNow!@: and SSE extensions can be used
|
| this way.
|
|
|
| The first step in using these extensions is to provide the necessary data
|
| @@ -5700,7 +6091,7 @@ produce code that uses 4 @code{SIs}.
|
|
|
| The types defined in this manner can be used with a subset of normal C
|
| operations. Currently, GCC will allow using the following operators
|
| -on these types: @code{+, -, *, /, unary minus, ^, |, &, ~}@.
|
| +on these types: @code{+, -, *, /, unary minus, ^, |, &, ~, %}@.
|
|
|
| The operations behave like C++ @code{valarrays}. Addition is defined as
|
| the addition of the corresponding elements of the operands. For
|
| @@ -6454,7 +6845,7 @@ be emitted.
|
|
|
| @opindex ansi
|
| @opindex std
|
| -Outside strict ISO C mode (@option{-ansi}, @option{-std=c89} or
|
| +Outside strict ISO C mode (@option{-ansi}, @option{-std=c90} or
|
| @option{-std=c99}), the functions
|
| @code{_exit}, @code{alloca}, @code{bcmp}, @code{bzero},
|
| @code{dcgettext}, @code{dgettext}, @code{dremf}, @code{dreml},
|
| @@ -6477,7 +6868,7 @@ Outside strict ISO C mode (@option{-ansi}, @option{-std=c89} or
|
| @code{yn}
|
| may be handled as built-in functions.
|
| All these functions have corresponding versions
|
| -prefixed with @code{__builtin_}, which may be used even in strict C89
|
| +prefixed with @code{__builtin_}, which may be used even in strict C90
|
| mode.
|
|
|
| The ISO C99 functions
|
| @@ -6521,7 +6912,7 @@ The ISO C99 functions
|
| @code{tgamma}, @code{truncf}, @code{truncl}, @code{trunc},
|
| @code{vfscanf}, @code{vscanf}, @code{vsnprintf} and @code{vsscanf}
|
| are handled as built-in functions
|
| -except in strict ISO C90 mode (@option{-ansi} or @option{-std=c89}).
|
| +except in strict ISO C90 mode (@option{-ansi} or @option{-std=c90}).
|
|
|
| There are also built-in versions of the ISO C99 functions
|
| @code{acosf}, @code{acosl}, @code{asinf}, @code{asinl}, @code{atan2f},
|
| @@ -6543,7 +6934,7 @@ The ISO C94 functions
|
| @code{iswspace}, @code{iswupper}, @code{iswxdigit}, @code{towlower} and
|
| @code{towupper}
|
| are handled as built-in functions
|
| -except in strict ISO C90 mode (@option{-ansi} or @option{-std=c89}).
|
| +except in strict ISO C90 mode (@option{-ansi} or @option{-std=c90}).
|
|
|
| The ISO C90 functions
|
| @code{abort}, @code{abs}, @code{acos}, @code{asin}, @code{atan2},
|
| @@ -6634,9 +7025,8 @@ depending on the arguments' types. For example:
|
|
|
| You can use the built-in function @code{__builtin_choose_expr} to
|
| evaluate code depending on the value of a constant expression. This
|
| -built-in function returns @var{exp1} if @var{const_exp}, which is a
|
| -constant expression that must be able to be determined at compile time,
|
| -is nonzero. Otherwise it returns 0.
|
| +built-in function returns @var{exp1} if @var{const_exp}, which is an
|
| +integer constant expression, is nonzero. Otherwise it returns 0.
|
|
|
| This built-in function is analogous to the @samp{? :} operator in C,
|
| except that the expression returned has its type unaltered by promotion
|
| @@ -6715,7 +7105,11 @@ static const int table[] = @{
|
|
|
| @noindent
|
| This is an acceptable initializer even if @var{EXPRESSION} is not a
|
| -constant expression. GCC must be more conservative about evaluating the
|
| +constant expression, including the case where
|
| +@code{__builtin_constant_p} returns 1 because @var{EXPRESSION} can be
|
| +folded to a constant but @var{EXPRESSION} contains operands that would
|
| +not otherwise be permitted in a static initializer (for example,
|
| +@code{0 && foo ()}). GCC must be more conservative about evaluating the
|
| built-in in this case, because it has no opportunity to perform
|
| optimization.
|
|
|
| @@ -6764,6 +7158,61 @@ intentionally executing an illegal instruction) or by calling
|
| you should not rely on any particular implementation.
|
| @end deftypefn
|
|
|
| +@deftypefn {Built-in Function} void __builtin_unreachable (void)
|
| +If control flow reaches the point of the @code{__builtin_unreachable},
|
| +the program is undefined. It is useful in situations where the
|
| +compiler cannot deduce the unreachability of the code.
|
| +
|
| +One such case is immediately following an @code{asm} statement that
|
| +will either never terminate, or one that transfers control elsewhere
|
| +and never returns. In this example, without the
|
| +@code{__builtin_unreachable}, GCC would issue a warning that control
|
| +reaches the end of a non-void function. It would also generate code
|
| +to return after the @code{asm}.
|
| +
|
| +@smallexample
|
| +int f (int c, int v)
|
| +@{
|
| + if (c)
|
| + @{
|
| + return v;
|
| + @}
|
| + else
|
| + @{
|
| + asm("jmp error_handler");
|
| + __builtin_unreachable ();
|
| + @}
|
| +@}
|
| +@end smallexample
|
| +
|
| +Because the @code{asm} statement unconditionally transfers control out
|
| +of the function, control will never reach the end of the function
|
| +body. The @code{__builtin_unreachable} is in fact unreachable and
|
| +communicates this fact to the compiler.
|
| +
|
| +Another use for @code{__builtin_unreachable} is following a call a
|
| +function that never returns but that is not declared
|
| +@code{__attribute__((noreturn))}, as in this example:
|
| +
|
| +@smallexample
|
| +void function_that_never_returns (void);
|
| +
|
| +int g (int c)
|
| +@{
|
| + if (c)
|
| + @{
|
| + return 1;
|
| + @}
|
| + else
|
| + @{
|
| + function_that_never_returns ();
|
| + __builtin_unreachable ();
|
| + @}
|
| +@}
|
| +@end smallexample
|
| +
|
| +@end deftypefn
|
| +
|
| @deftypefn {Built-in Function} void __builtin___clear_cache (char *@var{begin}, char *@var{end})
|
| This function is used to flush the processor's instruction cache for
|
| the region of memory between @var{begin} inclusive and @var{end}
|
| @@ -7050,7 +7499,8 @@ instructions, but allow the compiler to schedule those calls.
|
| * MIPS Loongson Built-in Functions::
|
| * Other MIPS Built-in Functions::
|
| * picoChip Built-in Functions::
|
| -* PowerPC AltiVec Built-in Functions::
|
| +* PowerPC AltiVec/VSX Built-in Functions::
|
| +* RX Built-in Functions::
|
| * SPARC VIS Built-in Functions::
|
| * SPU Built-in Functions::
|
| @end menu
|
| @@ -7752,7 +8202,7 @@ The following machine modes are available for use with MMX built-in functions
|
| vector of eight 8-bit integers. Some of the built-in functions operate on
|
| MMX registers as a whole 64-bit entity, these use @code{V1DI} as their mode.
|
|
|
| -If 3Dnow extensions are enabled, @code{V2SF} is used as a mode for a vector
|
| +If 3DNow!@: extensions are enabled, @code{V2SF} is used as a mode for a vector
|
| of two 32-bit floating point values.
|
|
|
| If SSE extensions are enabled, @code{V4SF} is used for a vector of four 32-bit
|
| @@ -7779,6 +8229,11 @@ The following floating point built-in functions are made available in the
|
| @table @code
|
| @item __float128 __builtin_infq (void)
|
| Similar to @code{__builtin_inf}, except the return type is @code{__float128}.
|
| +@findex __builtin_infq
|
| +
|
| +@item __float128 __builtin_huge_valq (void)
|
| +Similar to @code{__builtin_huge_val}, except the return type is @code{__float128}.
|
| +@findex __builtin_huge_valq
|
| @end table
|
|
|
| The following built-in functions are made available by @option{-mmmx}.
|
| @@ -8487,75 +8942,139 @@ v2di __builtin_ia32_insertq (v2di, v2di)
|
| v2di __builtin_ia32_insertqi (v2di, v2di, const unsigned int, const unsigned int)
|
| @end smallexample
|
|
|
| -The following built-in functions are available when @option{-msse5} is used.
|
| +The following built-in functions are available when @option{-mxop} is used.
|
| +@smallexample
|
| +v2df __builtin_ia32_vfrczpd (v2df)
|
| +v4sf __builtin_ia32_vfrczps (v4sf)
|
| +v2df __builtin_ia32_vfrczsd (v2df, v2df)
|
| +v4sf __builtin_ia32_vfrczss (v4sf, v4sf)
|
| +v4df __builtin_ia32_vfrczpd256 (v4df)
|
| +v8sf __builtin_ia32_vfrczps256 (v8sf)
|
| +v2di __builtin_ia32_vpcmov (v2di, v2di, v2di)
|
| +v2di __builtin_ia32_vpcmov_v2di (v2di, v2di, v2di)
|
| +v4si __builtin_ia32_vpcmov_v4si (v4si, v4si, v4si)
|
| +v8hi __builtin_ia32_vpcmov_v8hi (v8hi, v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpcmov_v16qi (v16qi, v16qi, v16qi)
|
| +v2df __builtin_ia32_vpcmov_v2df (v2df, v2df, v2df)
|
| +v4sf __builtin_ia32_vpcmov_v4sf (v4sf, v4sf, v4sf)
|
| +v4di __builtin_ia32_vpcmov_v4di256 (v4di, v4di, v4di)
|
| +v8si __builtin_ia32_vpcmov_v8si256 (v8si, v8si, v8si)
|
| +v16hi __builtin_ia32_vpcmov_v16hi256 (v16hi, v16hi, v16hi)
|
| +v32qi __builtin_ia32_vpcmov_v32qi256 (v32qi, v32qi, v32qi)
|
| +v4df __builtin_ia32_vpcmov_v4df256 (v4df, v4df, v4df)
|
| +v8sf __builtin_ia32_vpcmov_v8sf256 (v8sf, v8sf, v8sf)
|
| +v16qi __builtin_ia32_vpcomeqb (v16qi, v16qi)
|
| +v8hi __builtin_ia32_vpcomeqw (v8hi, v8hi)
|
| +v4si __builtin_ia32_vpcomeqd (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomeqq (v2di, v2di)
|
| +v16qi __builtin_ia32_vpcomequb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomequd (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomequq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpcomequw (v8hi, v8hi)
|
| +v8hi __builtin_ia32_vpcomeqw (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpcomfalseb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomfalsed (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomfalseq (v2di, v2di)
|
| +v16qi __builtin_ia32_vpcomfalseub (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomfalseud (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomfalseuq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpcomfalseuw (v8hi, v8hi)
|
| +v8hi __builtin_ia32_vpcomfalsew (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpcomgeb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomged (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomgeq (v2di, v2di)
|
| +v16qi __builtin_ia32_vpcomgeub (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomgeud (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomgeuq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpcomgeuw (v8hi, v8hi)
|
| +v8hi __builtin_ia32_vpcomgew (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpcomgtb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomgtd (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomgtq (v2di, v2di)
|
| +v16qi __builtin_ia32_vpcomgtub (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomgtud (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomgtuq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpcomgtuw (v8hi, v8hi)
|
| +v8hi __builtin_ia32_vpcomgtw (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpcomleb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomled (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomleq (v2di, v2di)
|
| +v16qi __builtin_ia32_vpcomleub (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomleud (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomleuq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpcomleuw (v8hi, v8hi)
|
| +v8hi __builtin_ia32_vpcomlew (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpcomltb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomltd (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomltq (v2di, v2di)
|
| +v16qi __builtin_ia32_vpcomltub (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomltud (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomltuq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpcomltuw (v8hi, v8hi)
|
| +v8hi __builtin_ia32_vpcomltw (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpcomneb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomned (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomneq (v2di, v2di)
|
| +v16qi __builtin_ia32_vpcomneub (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomneud (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomneuq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpcomneuw (v8hi, v8hi)
|
| +v8hi __builtin_ia32_vpcomnew (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpcomtrueb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomtrued (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomtrueq (v2di, v2di)
|
| +v16qi __builtin_ia32_vpcomtrueub (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpcomtrueud (v4si, v4si)
|
| +v2di __builtin_ia32_vpcomtrueuq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpcomtrueuw (v8hi, v8hi)
|
| +v8hi __builtin_ia32_vpcomtruew (v8hi, v8hi)
|
| +v4si __builtin_ia32_vphaddbd (v16qi)
|
| +v2di __builtin_ia32_vphaddbq (v16qi)
|
| +v8hi __builtin_ia32_vphaddbw (v16qi)
|
| +v2di __builtin_ia32_vphadddq (v4si)
|
| +v4si __builtin_ia32_vphaddubd (v16qi)
|
| +v2di __builtin_ia32_vphaddubq (v16qi)
|
| +v8hi __builtin_ia32_vphaddubw (v16qi)
|
| +v2di __builtin_ia32_vphaddudq (v4si)
|
| +v4si __builtin_ia32_vphadduwd (v8hi)
|
| +v2di __builtin_ia32_vphadduwq (v8hi)
|
| +v4si __builtin_ia32_vphaddwd (v8hi)
|
| +v2di __builtin_ia32_vphaddwq (v8hi)
|
| +v8hi __builtin_ia32_vphsubbw (v16qi)
|
| +v2di __builtin_ia32_vphsubdq (v4si)
|
| +v4si __builtin_ia32_vphsubwd (v8hi)
|
| +v4si __builtin_ia32_vpmacsdd (v4si, v4si, v4si)
|
| +v2di __builtin_ia32_vpmacsdqh (v4si, v4si, v2di)
|
| +v2di __builtin_ia32_vpmacsdql (v4si, v4si, v2di)
|
| +v4si __builtin_ia32_vpmacssdd (v4si, v4si, v4si)
|
| +v2di __builtin_ia32_vpmacssdqh (v4si, v4si, v2di)
|
| +v2di __builtin_ia32_vpmacssdql (v4si, v4si, v2di)
|
| +v4si __builtin_ia32_vpmacsswd (v8hi, v8hi, v4si)
|
| +v8hi __builtin_ia32_vpmacssww (v8hi, v8hi, v8hi)
|
| +v4si __builtin_ia32_vpmacswd (v8hi, v8hi, v4si)
|
| +v8hi __builtin_ia32_vpmacsww (v8hi, v8hi, v8hi)
|
| +v4si __builtin_ia32_vpmadcsswd (v8hi, v8hi, v4si)
|
| +v4si __builtin_ia32_vpmadcswd (v8hi, v8hi, v4si)
|
| +v16qi __builtin_ia32_vpperm (v16qi, v16qi, v16qi)
|
| +v16qi __builtin_ia32_vprotb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vprotd (v4si, v4si)
|
| +v2di __builtin_ia32_vprotq (v2di, v2di)
|
| +v8hi __builtin_ia32_vprotw (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpshab (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpshad (v4si, v4si)
|
| +v2di __builtin_ia32_vpshaq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpshaw (v8hi, v8hi)
|
| +v16qi __builtin_ia32_vpshlb (v16qi, v16qi)
|
| +v4si __builtin_ia32_vpshld (v4si, v4si)
|
| +v2di __builtin_ia32_vpshlq (v2di, v2di)
|
| +v8hi __builtin_ia32_vpshlw (v8hi, v8hi)
|
| +@end smallexample
|
| +
|
| +The following built-in functions are available when @option{-mfma4} is used.
|
| All of them generate the machine instruction that is part of the name
|
| with MMX registers.
|
|
|
| @smallexample
|
| -v2df __builtin_ia32_comeqpd (v2df, v2df)
|
| -v2df __builtin_ia32_comeqps (v2df, v2df)
|
| -v4sf __builtin_ia32_comeqsd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comeqss (v4sf, v4sf)
|
| -v2df __builtin_ia32_comfalsepd (v2df, v2df)
|
| -v2df __builtin_ia32_comfalseps (v2df, v2df)
|
| -v4sf __builtin_ia32_comfalsesd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comfalsess (v4sf, v4sf)
|
| -v2df __builtin_ia32_comgepd (v2df, v2df)
|
| -v2df __builtin_ia32_comgeps (v2df, v2df)
|
| -v4sf __builtin_ia32_comgesd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comgess (v4sf, v4sf)
|
| -v2df __builtin_ia32_comgtpd (v2df, v2df)
|
| -v2df __builtin_ia32_comgtps (v2df, v2df)
|
| -v4sf __builtin_ia32_comgtsd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comgtss (v4sf, v4sf)
|
| -v2df __builtin_ia32_comlepd (v2df, v2df)
|
| -v2df __builtin_ia32_comleps (v2df, v2df)
|
| -v4sf __builtin_ia32_comlesd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comless (v4sf, v4sf)
|
| -v2df __builtin_ia32_comltpd (v2df, v2df)
|
| -v2df __builtin_ia32_comltps (v2df, v2df)
|
| -v4sf __builtin_ia32_comltsd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comltss (v4sf, v4sf)
|
| -v2df __builtin_ia32_comnepd (v2df, v2df)
|
| -v2df __builtin_ia32_comneps (v2df, v2df)
|
| -v4sf __builtin_ia32_comnesd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comness (v4sf, v4sf)
|
| -v2df __builtin_ia32_comordpd (v2df, v2df)
|
| -v2df __builtin_ia32_comordps (v2df, v2df)
|
| -v4sf __builtin_ia32_comordsd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comordss (v4sf, v4sf)
|
| -v2df __builtin_ia32_comtruepd (v2df, v2df)
|
| -v2df __builtin_ia32_comtrueps (v2df, v2df)
|
| -v4sf __builtin_ia32_comtruesd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comtruess (v4sf, v4sf)
|
| -v2df __builtin_ia32_comueqpd (v2df, v2df)
|
| -v2df __builtin_ia32_comueqps (v2df, v2df)
|
| -v4sf __builtin_ia32_comueqsd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comueqss (v4sf, v4sf)
|
| -v2df __builtin_ia32_comugepd (v2df, v2df)
|
| -v2df __builtin_ia32_comugeps (v2df, v2df)
|
| -v4sf __builtin_ia32_comugesd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comugess (v4sf, v4sf)
|
| -v2df __builtin_ia32_comugtpd (v2df, v2df)
|
| -v2df __builtin_ia32_comugtps (v2df, v2df)
|
| -v4sf __builtin_ia32_comugtsd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comugtss (v4sf, v4sf)
|
| -v2df __builtin_ia32_comulepd (v2df, v2df)
|
| -v2df __builtin_ia32_comuleps (v2df, v2df)
|
| -v4sf __builtin_ia32_comulesd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comuless (v4sf, v4sf)
|
| -v2df __builtin_ia32_comultpd (v2df, v2df)
|
| -v2df __builtin_ia32_comultps (v2df, v2df)
|
| -v4sf __builtin_ia32_comultsd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comultss (v4sf, v4sf)
|
| -v2df __builtin_ia32_comunepd (v2df, v2df)
|
| -v2df __builtin_ia32_comuneps (v2df, v2df)
|
| -v4sf __builtin_ia32_comunesd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comuness (v4sf, v4sf)
|
| -v2df __builtin_ia32_comunordpd (v2df, v2df)
|
| -v2df __builtin_ia32_comunordps (v2df, v2df)
|
| -v4sf __builtin_ia32_comunordsd (v4sf, v4sf)
|
| -v4sf __builtin_ia32_comunordss (v4sf, v4sf)
|
| v2df __builtin_ia32_fmaddpd (v2df, v2df, v2df)
|
| v4sf __builtin_ia32_fmaddps (v4sf, v4sf, v4sf)
|
| v2df __builtin_ia32_fmaddsd (v2df, v2df, v2df)
|
| @@ -8572,136 +9091,40 @@ v2df __builtin_ia32_fnmsubpd (v2df, v2df, v2df)
|
| v4sf __builtin_ia32_fnmsubps (v4sf, v4sf, v4sf)
|
| v2df __builtin_ia32_fnmsubsd (v2df, v2df, v2df)
|
| v4sf __builtin_ia32_fnmsubss (v4sf, v4sf, v4sf)
|
| -v2df __builtin_ia32_frczpd (v2df)
|
| -v4sf __builtin_ia32_frczps (v4sf)
|
| -v2df __builtin_ia32_frczsd (v2df, v2df)
|
| -v4sf __builtin_ia32_frczss (v4sf, v4sf)
|
| -v2di __builtin_ia32_pcmov (v2di, v2di, v2di)
|
| -v2di __builtin_ia32_pcmov_v2di (v2di, v2di, v2di)
|
| -v4si __builtin_ia32_pcmov_v4si (v4si, v4si, v4si)
|
| -v8hi __builtin_ia32_pcmov_v8hi (v8hi, v8hi, v8hi)
|
| -v16qi __builtin_ia32_pcmov_v16qi (v16qi, v16qi, v16qi)
|
| -v2df __builtin_ia32_pcmov_v2df (v2df, v2df, v2df)
|
| -v4sf __builtin_ia32_pcmov_v4sf (v4sf, v4sf, v4sf)
|
| -v16qi __builtin_ia32_pcomeqb (v16qi, v16qi)
|
| -v8hi __builtin_ia32_pcomeqw (v8hi, v8hi)
|
| -v4si __builtin_ia32_pcomeqd (v4si, v4si)
|
| -v2di __builtin_ia32_pcomeqq (v2di, v2di)
|
| -v16qi __builtin_ia32_pcomequb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomequd (v4si, v4si)
|
| -v2di __builtin_ia32_pcomequq (v2di, v2di)
|
| -v8hi __builtin_ia32_pcomequw (v8hi, v8hi)
|
| -v8hi __builtin_ia32_pcomeqw (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pcomfalseb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomfalsed (v4si, v4si)
|
| -v2di __builtin_ia32_pcomfalseq (v2di, v2di)
|
| -v16qi __builtin_ia32_pcomfalseub (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomfalseud (v4si, v4si)
|
| -v2di __builtin_ia32_pcomfalseuq (v2di, v2di)
|
| -v8hi __builtin_ia32_pcomfalseuw (v8hi, v8hi)
|
| -v8hi __builtin_ia32_pcomfalsew (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pcomgeb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomged (v4si, v4si)
|
| -v2di __builtin_ia32_pcomgeq (v2di, v2di)
|
| -v16qi __builtin_ia32_pcomgeub (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomgeud (v4si, v4si)
|
| -v2di __builtin_ia32_pcomgeuq (v2di, v2di)
|
| -v8hi __builtin_ia32_pcomgeuw (v8hi, v8hi)
|
| -v8hi __builtin_ia32_pcomgew (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pcomgtb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomgtd (v4si, v4si)
|
| -v2di __builtin_ia32_pcomgtq (v2di, v2di)
|
| -v16qi __builtin_ia32_pcomgtub (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomgtud (v4si, v4si)
|
| -v2di __builtin_ia32_pcomgtuq (v2di, v2di)
|
| -v8hi __builtin_ia32_pcomgtuw (v8hi, v8hi)
|
| -v8hi __builtin_ia32_pcomgtw (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pcomleb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomled (v4si, v4si)
|
| -v2di __builtin_ia32_pcomleq (v2di, v2di)
|
| -v16qi __builtin_ia32_pcomleub (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomleud (v4si, v4si)
|
| -v2di __builtin_ia32_pcomleuq (v2di, v2di)
|
| -v8hi __builtin_ia32_pcomleuw (v8hi, v8hi)
|
| -v8hi __builtin_ia32_pcomlew (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pcomltb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomltd (v4si, v4si)
|
| -v2di __builtin_ia32_pcomltq (v2di, v2di)
|
| -v16qi __builtin_ia32_pcomltub (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomltud (v4si, v4si)
|
| -v2di __builtin_ia32_pcomltuq (v2di, v2di)
|
| -v8hi __builtin_ia32_pcomltuw (v8hi, v8hi)
|
| -v8hi __builtin_ia32_pcomltw (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pcomneb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomned (v4si, v4si)
|
| -v2di __builtin_ia32_pcomneq (v2di, v2di)
|
| -v16qi __builtin_ia32_pcomneub (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomneud (v4si, v4si)
|
| -v2di __builtin_ia32_pcomneuq (v2di, v2di)
|
| -v8hi __builtin_ia32_pcomneuw (v8hi, v8hi)
|
| -v8hi __builtin_ia32_pcomnew (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pcomtrueb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomtrued (v4si, v4si)
|
| -v2di __builtin_ia32_pcomtrueq (v2di, v2di)
|
| -v16qi __builtin_ia32_pcomtrueub (v16qi, v16qi)
|
| -v4si __builtin_ia32_pcomtrueud (v4si, v4si)
|
| -v2di __builtin_ia32_pcomtrueuq (v2di, v2di)
|
| -v8hi __builtin_ia32_pcomtrueuw (v8hi, v8hi)
|
| -v8hi __builtin_ia32_pcomtruew (v8hi, v8hi)
|
| -v4df __builtin_ia32_permpd (v2df, v2df, v16qi)
|
| -v4sf __builtin_ia32_permps (v4sf, v4sf, v16qi)
|
| -v4si __builtin_ia32_phaddbd (v16qi)
|
| -v2di __builtin_ia32_phaddbq (v16qi)
|
| -v8hi __builtin_ia32_phaddbw (v16qi)
|
| -v2di __builtin_ia32_phadddq (v4si)
|
| -v4si __builtin_ia32_phaddubd (v16qi)
|
| -v2di __builtin_ia32_phaddubq (v16qi)
|
| -v8hi __builtin_ia32_phaddubw (v16qi)
|
| -v2di __builtin_ia32_phaddudq (v4si)
|
| -v4si __builtin_ia32_phadduwd (v8hi)
|
| -v2di __builtin_ia32_phadduwq (v8hi)
|
| -v4si __builtin_ia32_phaddwd (v8hi)
|
| -v2di __builtin_ia32_phaddwq (v8hi)
|
| -v8hi __builtin_ia32_phsubbw (v16qi)
|
| -v2di __builtin_ia32_phsubdq (v4si)
|
| -v4si __builtin_ia32_phsubwd (v8hi)
|
| -v4si __builtin_ia32_pmacsdd (v4si, v4si, v4si)
|
| -v2di __builtin_ia32_pmacsdqh (v4si, v4si, v2di)
|
| -v2di __builtin_ia32_pmacsdql (v4si, v4si, v2di)
|
| -v4si __builtin_ia32_pmacssdd (v4si, v4si, v4si)
|
| -v2di __builtin_ia32_pmacssdqh (v4si, v4si, v2di)
|
| -v2di __builtin_ia32_pmacssdql (v4si, v4si, v2di)
|
| -v4si __builtin_ia32_pmacsswd (v8hi, v8hi, v4si)
|
| -v8hi __builtin_ia32_pmacssww (v8hi, v8hi, v8hi)
|
| -v4si __builtin_ia32_pmacswd (v8hi, v8hi, v4si)
|
| -v8hi __builtin_ia32_pmacsww (v8hi, v8hi, v8hi)
|
| -v4si __builtin_ia32_pmadcsswd (v8hi, v8hi, v4si)
|
| -v4si __builtin_ia32_pmadcswd (v8hi, v8hi, v4si)
|
| -v16qi __builtin_ia32_pperm (v16qi, v16qi, v16qi)
|
| -v16qi __builtin_ia32_protb (v16qi, v16qi)
|
| -v4si __builtin_ia32_protd (v4si, v4si)
|
| -v2di __builtin_ia32_protq (v2di, v2di)
|
| -v8hi __builtin_ia32_protw (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pshab (v16qi, v16qi)
|
| -v4si __builtin_ia32_pshad (v4si, v4si)
|
| -v2di __builtin_ia32_pshaq (v2di, v2di)
|
| -v8hi __builtin_ia32_pshaw (v8hi, v8hi)
|
| -v16qi __builtin_ia32_pshlb (v16qi, v16qi)
|
| -v4si __builtin_ia32_pshld (v4si, v4si)
|
| -v2di __builtin_ia32_pshlq (v2di, v2di)
|
| -v8hi __builtin_ia32_pshlw (v8hi, v8hi)
|
| -@end smallexample
|
| -
|
| -The following builtin-in functions are available when @option{-msse5}
|
| -is used. The second argument must be an integer constant and generate
|
| -the machine instruction that is part of the name with the @samp{_imm}
|
| -suffix removed.
|
| -
|
| -@smallexample
|
| -v16qi __builtin_ia32_protb_imm (v16qi, int)
|
| -v4si __builtin_ia32_protd_imm (v4si, int)
|
| -v2di __builtin_ia32_protq_imm (v2di, int)
|
| -v8hi __builtin_ia32_protw_imm (v8hi, int)
|
| +v2df __builtin_ia32_fmaddsubpd (v2df, v2df, v2df)
|
| +v4sf __builtin_ia32_fmaddsubps (v4sf, v4sf, v4sf)
|
| +v2df __builtin_ia32_fmsubaddpd (v2df, v2df, v2df)
|
| +v4sf __builtin_ia32_fmsubaddps (v4sf, v4sf, v4sf)
|
| +v4df __builtin_ia32_fmaddpd256 (v4df, v4df, v4df)
|
| +v8sf __builtin_ia32_fmaddps256 (v8sf, v8sf, v8sf)
|
| +v4df __builtin_ia32_fmsubpd256 (v4df, v4df, v4df)
|
| +v8sf __builtin_ia32_fmsubps256 (v8sf, v8sf, v8sf)
|
| +v4df __builtin_ia32_fnmaddpd256 (v4df, v4df, v4df)
|
| +v8sf __builtin_ia32_fnmaddps256 (v8sf, v8sf, v8sf)
|
| +v4df __builtin_ia32_fnmsubpd256 (v4df, v4df, v4df)
|
| +v8sf __builtin_ia32_fnmsubps256 (v8sf, v8sf, v8sf)
|
| +v4df __builtin_ia32_fmaddsubpd256 (v4df, v4df, v4df)
|
| +v8sf __builtin_ia32_fmaddsubps256 (v8sf, v8sf, v8sf)
|
| +v4df __builtin_ia32_fmsubaddpd256 (v4df, v4df, v4df)
|
| +v8sf __builtin_ia32_fmsubaddps256 (v8sf, v8sf, v8sf)
|
| +
|
| +@end smallexample
|
| +
|
| +The following built-in functions are available when @option{-mlwp} is used.
|
| +
|
| +@smallexample
|
| +void __builtin_ia32_llwpcb16 (void *);
|
| +void __builtin_ia32_llwpcb32 (void *);
|
| +void __builtin_ia32_llwpcb64 (void *);
|
| +void * __builtin_ia32_llwpcb16 (void);
|
| +void * __builtin_ia32_llwpcb32 (void);
|
| +void * __builtin_ia32_llwpcb64 (void);
|
| +void __builtin_ia32_lwpval16 (unsigned short, unsigned int, unsigned short)
|
| +void __builtin_ia32_lwpval32 (unsigned int, unsigned int, unsigned int)
|
| +void __builtin_ia32_lwpval64 (unsigned __int64, unsigned int, unsigned int)
|
| +unsigned char __builtin_ia32_lwpins16 (unsigned short, unsigned int, unsigned short)
|
| +unsigned char __builtin_ia32_lwpins32 (unsigned int, unsigned int, unsigned int)
|
| +unsigned char __builtin_ia32_lwpins64 (unsigned __int64, unsigned int, unsigned int)
|
| @end smallexample
|
|
|
| The following built-in functions are available when @option{-m3dnow} is used.
|
| @@ -9503,7 +9926,7 @@ storing the value 32767 if the result overflows.
|
|
|
| @item int __builtin_subs (int @var{x}, int @var{y})
|
| Saturating subtraction. Return the result of subtracting @var{y} from
|
| -@var{x}, storing the value -32768 if the result overflows.
|
| +@var{x}, storing the value @minus{}32768 if the result overflows.
|
|
|
| @item void __builtin_halt (void)
|
| Halt. The processor will stop execution. This built-in is useful for
|
| @@ -9523,7 +9946,7 @@ GCC defines the preprocessor macro @code{___GCC_HAVE_BUILTIN_MIPS_CACHE}
|
| when this function is available.
|
| @end table
|
|
|
| -@node PowerPC AltiVec Built-in Functions
|
| +@node PowerPC AltiVec/VSX Built-in Functions
|
| @subsection PowerPC AltiVec Built-in Functions
|
|
|
| GCC provides an interface for the PowerPC family of processors to access
|
| @@ -9549,6 +9972,19 @@ vector bool int
|
| vector float
|
| @end smallexample
|
|
|
| +If @option{-mvsx} is used the following additional vector types are
|
| +implemented.
|
| +
|
| +@smallexample
|
| +vector unsigned long
|
| +vector signed long
|
| +vector double
|
| +@end smallexample
|
| +
|
| +The long types are only implemented for 64-bit code generation, and
|
| +the long type is only used in the floating point/integer conversion
|
| +instructions.
|
| +
|
| GCC's implementation of the high-level language interface available from
|
| C and C++ code differs from Motorola's documentation in several ways.
|
|
|
| @@ -9814,6 +10250,8 @@ vector signed char vec_vavgsb (vector signed char, vector signed char);
|
| vector unsigned char vec_vavgub (vector unsigned char,
|
| vector unsigned char);
|
|
|
| +vector float vec_copysign (vector float);
|
| +
|
| vector float vec_ceil (vector float);
|
|
|
| vector signed int vec_cmpb (vector float, vector float);
|
| @@ -11416,6 +11854,207 @@ int vec_any_numeric (vector float);
|
| int vec_any_out (vector float, vector float);
|
| @end smallexample
|
|
|
| +If the vector/scalar (VSX) instruction set is available, the following
|
| +additional functions are available:
|
| +
|
| +@smallexample
|
| +vector double vec_abs (vector double);
|
| +vector double vec_add (vector double, vector double);
|
| +vector double vec_and (vector double, vector double);
|
| +vector double vec_and (vector double, vector bool long);
|
| +vector double vec_and (vector bool long, vector double);
|
| +vector double vec_andc (vector double, vector double);
|
| +vector double vec_andc (vector double, vector bool long);
|
| +vector double vec_andc (vector bool long, vector double);
|
| +vector double vec_ceil (vector double);
|
| +vector bool long vec_cmpeq (vector double, vector double);
|
| +vector bool long vec_cmpge (vector double, vector double);
|
| +vector bool long vec_cmpgt (vector double, vector double);
|
| +vector bool long vec_cmple (vector double, vector double);
|
| +vector bool long vec_cmplt (vector double, vector double);
|
| +vector float vec_div (vector float, vector float);
|
| +vector double vec_div (vector double, vector double);
|
| +vector double vec_floor (vector double);
|
| +vector double vec_madd (vector double, vector double, vector double);
|
| +vector double vec_max (vector double, vector double);
|
| +vector double vec_min (vector double, vector double);
|
| +vector float vec_msub (vector float, vector float, vector float);
|
| +vector double vec_msub (vector double, vector double, vector double);
|
| +vector float vec_mul (vector float, vector float);
|
| +vector double vec_mul (vector double, vector double);
|
| +vector float vec_nearbyint (vector float);
|
| +vector double vec_nearbyint (vector double);
|
| +vector float vec_nmadd (vector float, vector float, vector float);
|
| +vector double vec_nmadd (vector double, vector double, vector double);
|
| +vector double vec_nmsub (vector double, vector double, vector double);
|
| +vector double vec_nor (vector double, vector double);
|
| +vector double vec_or (vector double, vector double);
|
| +vector double vec_or (vector double, vector bool long);
|
| +vector double vec_or (vector bool long, vector double);
|
| +vector double vec_perm (vector double,
|
| + vector double,
|
| + vector unsigned char);
|
| +vector float vec_rint (vector float);
|
| +vector double vec_rint (vector double);
|
| +vector double vec_sel (vector double, vector double, vector bool long);
|
| +vector double vec_sel (vector double, vector double, vector unsigned long);
|
| +vector double vec_sub (vector double, vector double);
|
| +vector float vec_sqrt (vector float);
|
| +vector double vec_sqrt (vector double);
|
| +vector double vec_trunc (vector double);
|
| +vector double vec_xor (vector double, vector double);
|
| +vector double vec_xor (vector double, vector bool long);
|
| +vector double vec_xor (vector bool long, vector double);
|
| +int vec_all_eq (vector double, vector double);
|
| +int vec_all_ge (vector double, vector double);
|
| +int vec_all_gt (vector double, vector double);
|
| +int vec_all_le (vector double, vector double);
|
| +int vec_all_lt (vector double, vector double);
|
| +int vec_all_nan (vector double);
|
| +int vec_all_ne (vector double, vector double);
|
| +int vec_all_nge (vector double, vector double);
|
| +int vec_all_ngt (vector double, vector double);
|
| +int vec_all_nle (vector double, vector double);
|
| +int vec_all_nlt (vector double, vector double);
|
| +int vec_all_numeric (vector double);
|
| +int vec_any_eq (vector double, vector double);
|
| +int vec_any_ge (vector double, vector double);
|
| +int vec_any_gt (vector double, vector double);
|
| +int vec_any_le (vector double, vector double);
|
| +int vec_any_lt (vector double, vector double);
|
| +int vec_any_nan (vector double);
|
| +int vec_any_ne (vector double, vector double);
|
| +int vec_any_nge (vector double, vector double);
|
| +int vec_any_ngt (vector double, vector double);
|
| +int vec_any_nle (vector double, vector double);
|
| +int vec_any_nlt (vector double, vector double);
|
| +int vec_any_numeric (vector double);
|
| +@end smallexample
|
| +
|
| +GCC provides a few other builtins on Powerpc to access certain instructions:
|
| +@smallexample
|
| +float __builtin_recipdivf (float, float);
|
| +float __builtin_rsqrtf (float);
|
| +double __builtin_recipdiv (double, double);
|
| +long __builtin_bpermd (long, long);
|
| +int __builtin_bswap16 (int);
|
| +@end smallexample
|
| +
|
| +@node RX Built-in Functions
|
| +@subsection RX Built-in Functions
|
| +GCC supports some of the RX instructions which cannot be expressed in
|
| +the C programming language via the use of built-in functions. The
|
| +following functions are supported:
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_brk (void)
|
| +Generates the @code{brk} machine instruction.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_clrpsw (int)
|
| +Generates the @code{clrpsw} machine instruction to clear the specified
|
| +bit in the processor status word.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_int (int)
|
| +Generates the @code{int} machine instruction to generate an interrupt
|
| +with the specified value.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_machi (int, int)
|
| +Generates the @code{machi} machine instruction to add the result of
|
| +multiplying the top 16-bits of the two arguments into the
|
| +accumulator.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_maclo (int, int)
|
| +Generates the @code{maclo} machine instruction to add the result of
|
| +multiplying the bottom 16-bits of the two arguments into the
|
| +accumulator.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_mulhi (int, int)
|
| +Generates the @code{mulhi} machine instruction to place the result of
|
| +multiplying the top 16-bits of the two arguments into the
|
| +accumulator.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_mullo (int, int)
|
| +Generates the @code{mullo} machine instruction to place the result of
|
| +multiplying the bottom 16-bits of the two arguments into the
|
| +accumulator.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} int __builtin_rx_mvfachi (void)
|
| +Generates the @code{mvfachi} machine instruction to read the top
|
| +32-bits of the accumulator.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} int __builtin_rx_mvfacmi (void)
|
| +Generates the @code{mvfacmi} machine instruction to read the middle
|
| +32-bits of the accumulator.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} int __builtin_rx_mvfc (int)
|
| +Generates the @code{mvfc} machine instruction which reads the control
|
| +register specified in its argument and returns its value.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_mvtachi (int)
|
| +Generates the @code{mvtachi} machine instruction to set the top
|
| +32-bits of the accumulator.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_mvtaclo (int)
|
| +Generates the @code{mvtaclo} machine instruction to set the bottom
|
| +32-bits of the accumulator.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_mvtc (int reg, int val)
|
| +Generates the @code{mvtc} machine instruction which sets control
|
| +register number @code{reg} to @code{val}.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_mvtipl (int)
|
| +Generates the @code{mvtipl} machine instruction set the interrupt
|
| +priority level.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_racw (int)
|
| +Generates the @code{racw} machine instruction to round the accumulator
|
| +according to the specified mode.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} int __builtin_rx_revw (int)
|
| +Generates the @code{revw} machine instruction which swaps the bytes in
|
| +the argument so that bits 0--7 now occupy bits 8--15 and vice versa,
|
| +and also bits 16--23 occupy bits 24--31 and vice versa.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_rmpa (void)
|
| +Generates the @code{rmpa} machine instruction which initiates a
|
| +repeated multiply and accumulate sequence.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_round (float)
|
| +Generates the @code{round} machine instruction which returns the
|
| +floating point argument rounded according to the current rounding mode
|
| +set in the floating point status word register.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} int __builtin_rx_sat (int)
|
| +Generates the @code{sat} machine instruction which returns the
|
| +saturated value of the argument.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_setpsw (int)
|
| +Generates the @code{setpsw} machine instruction to set the specified
|
| +bit in the processor status word.
|
| +@end deftypefn
|
| +
|
| +@deftypefn {Built-in Function} void __builtin_rx_wait (void)
|
| +Generates the @code{wait} machine instruction.
|
| +@end deftypefn
|
| +
|
| @node SPARC VIS Built-in Functions
|
| @subsection SPARC VIS Built-in Functions
|
|
|
| @@ -11543,6 +12182,7 @@ for further explanation.
|
| @menu
|
| * ARM Pragmas::
|
| * M32C Pragmas::
|
| +* MeP Pragmas::
|
| * RS/6000 and PowerPC Pragmas::
|
| * Darwin Pragmas::
|
| * Solaris Pragmas::
|
| @@ -11593,6 +12233,77 @@ as it may allow you to reduce the number of memregs used.
|
|
|
| @end table
|
|
|
| +@node MeP Pragmas
|
| +@subsection MeP Pragmas
|
| +
|
| +@table @code
|
| +
|
| +@item custom io_volatile (on|off)
|
| +@cindex pragma, custom io_volatile
|
| +Overrides the command line option @code{-mio-volatile} for the current
|
| +file. Note that for compatibility with future GCC releases, this
|
| +option should only be used once before any @code{io} variables in each
|
| +file.
|
| +
|
| +@item GCC coprocessor available @var{registers}
|
| +@cindex pragma, coprocessor available
|
| +Specifies which coprocessor registers are available to the register
|
| +allocator. @var{registers} may be a single register, register range
|
| +separated by ellipses, or comma-separated list of those. Example:
|
| +
|
| +@example
|
| +#pragma GCC coprocessor available $c0...$c10, $c28
|
| +@end example
|
| +
|
| +@item GCC coprocessor call_saved @var{registers}
|
| +@cindex pragma, coprocessor call_saved
|
| +Specifies which coprocessor registers are to be saved and restored by
|
| +any function using them. @var{registers} may be a single register,
|
| +register range separated by ellipses, or comma-separated list of
|
| +those. Example:
|
| +
|
| +@example
|
| +#pragma GCC coprocessor call_saved $c4...$c6, $c31
|
| +@end example
|
| +
|
| +@item GCC coprocessor subclass '(A|B|C|D)' = @var{registers}
|
| +@cindex pragma, coprocessor subclass
|
| +Creates and defines a register class. These register classes can be
|
| +used by inline @code{asm} constructs. @var{registers} may be a single
|
| +register, register range separated by ellipses, or comma-separated
|
| +list of those. Example:
|
| +
|
| +@example
|
| +#pragma GCC coprocessor subclass 'B' = $c2, $c4, $c6
|
| +
|
| +asm ("cpfoo %0" : "=B" (x));
|
| +@end example
|
| +
|
| +@item GCC disinterrupt @var{name} , @var{name} @dots{}
|
| +@cindex pragma, disinterrupt
|
| +For the named functions, the compiler adds code to disable interrupts
|
| +for the duration of those functions. Any functions so named, which
|
| +are not encountered in the source, cause a warning that the pragma was
|
| +not used. Examples:
|
| +
|
| +@example
|
| +#pragma disinterrupt foo
|
| +#pragma disinterrupt bar, grill
|
| +int foo () @{ @dots{} @}
|
| +@end example
|
| +
|
| +@item GCC call @var{name} , @var{name} @dots{}
|
| +@cindex pragma, call
|
| +For the named functions, the compiler always uses a register-indirect
|
| +call model when calling the named functions. Examples:
|
| +
|
| +@example
|
| +extern int foo ();
|
| +#pragma call foo
|
| +@end example
|
| +
|
| +@end table
|
| +
|
| @node RS/6000 and PowerPC Pragmas
|
| @subsection RS/6000 and PowerPC Pragmas
|
|
|
| @@ -11689,9 +12400,9 @@ adding a call to the @code{.init} section.
|
|
|
| For compatibility with the Solaris and Tru64 UNIX system headers, GCC
|
| supports two @code{#pragma} directives which change the name used in
|
| -assembly for a given declaration. These pragmas are only available on
|
| -platforms whose system headers need them. To get this effect on all
|
| -platforms supported by GCC, use the asm labels extension (@pxref{Asm
|
| +assembly for a given declaration. @code{#pragma extern_prefix} is only
|
| +available on platforms whose system headers need it. To get this effect
|
| +on all platforms supported by GCC, use the asm labels extension (@pxref{Asm
|
| Labels}).
|
|
|
| @table @code
|
| @@ -11700,8 +12411,7 @@ Labels}).
|
|
|
| This pragma gives the C function @var{oldname} the assembly symbol
|
| @var{newname}. The preprocessor macro @code{__PRAGMA_REDEFINE_EXTNAME}
|
| -will be defined if this pragma is available (currently only on
|
| -Solaris).
|
| +will be defined if this pragma is available (currently on all platforms).
|
|
|
| @item extern_prefix @var{string}
|
| @cindex pragma, extern_prefix
|
|
|