diff options
Diffstat (limited to 'gcc-4.9/gcc/doc/gcc.info')
-rw-r--r-- | gcc-4.9/gcc/doc/gcc.info | 56908 |
1 files changed, 56908 insertions, 0 deletions
diff --git a/gcc-4.9/gcc/doc/gcc.info b/gcc-4.9/gcc/doc/gcc.info new file mode 100644 index 000000000..29f054977 --- /dev/null +++ b/gcc-4.9/gcc/doc/gcc.info @@ -0,0 +1,56908 @@ +This is gcc.info, produced by makeinfo version 5.1 from gcc.texi. + +Copyright (C) 1988-2014 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with the +Invariant Sections being "Funding Free Software", the Front-Cover Texts +being (a) (see below), and with the Back-Cover Texts being (b) (see +below). A copy of the license is included in the section entitled "GNU +Free Documentation License". + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU software. +Copies published by the Free Software Foundation raise funds for GNU +development. +INFO-DIR-SECTION Software development +START-INFO-DIR-ENTRY +* gcc: (gcc). The GNU Compiler Collection. +* g++: (gcc). The GNU C++ compiler. +* gcov: (gcc) Gcov. 'gcov'--a test coverage program. +END-INFO-DIR-ENTRY + + This file documents the use of the GNU compilers. + + Copyright (C) 1988-2014 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this document +under the terms of the GNU Free Documentation License, Version 1.3 or +any later version published by the Free Software Foundation; with the +Invariant Sections being "Funding Free Software", the Front-Cover Texts +being (a) (see below), and with the Back-Cover Texts being (b) (see +below). A copy of the license is included in the section entitled "GNU +Free Documentation License". + + (a) The FSF's Front-Cover Text is: + + A GNU Manual + + (b) The FSF's Back-Cover Text is: + + You have freedom to copy and modify this GNU Manual, like GNU software. +Copies published by the Free Software Foundation raise funds for GNU +development. + + +File: gcc.info, Node: Top, Next: G++ and GCC, Up: (DIR) + +Introduction +************ + +This manual documents how to use the GNU compilers, as well as their +features and incompatibilities, and how to report bugs. It corresponds +to the compilers (GCC) version 4.9.0. The internals of the GNU +compilers, including how to port them to new targets and some +information about how to write front ends for new languages, are +documented in a separate manual. *Note Introduction: (gccint)Top. + +* Menu: + +* G++ and GCC:: You can compile C or C++ programs. +* Standards:: Language standards supported by GCC. +* Invoking GCC:: Command options supported by 'gcc'. +* C Implementation:: How GCC implements the ISO C specification. +* C++ Implementation:: How GCC implements the ISO C++ specification. +* C Extensions:: GNU extensions to the C language family. +* C++ Extensions:: GNU extensions to the C++ language. +* Objective-C:: GNU Objective-C runtime features. +* Compatibility:: Binary Compatibility +* Gcov:: 'gcov'--a test coverage program. +* Trouble:: If you have trouble using GCC. +* Bugs:: How, why and where to report bugs. +* Service:: How To Get Help with GCC +* Contributing:: How to contribute to testing and developing GCC. + +* Funding:: How to help assure funding for free software. +* GNU Project:: The GNU Project and GNU/Linux. + +* Copying:: GNU General Public License says + how you can copy and share GCC. +* GNU Free Documentation License:: How you can copy and share this manual. +* Contributors:: People who have contributed to GCC. + +* Option Index:: Index to command line options. +* Keyword Index:: Index of concepts and symbol names. + + +File: gcc.info, Node: G++ and GCC, Next: Standards, Up: Top + +1 Programming Languages Supported by GCC +**************************************** + +GCC stands for "GNU Compiler Collection". GCC is an integrated +distribution of compilers for several major programming languages. +These languages currently include C, C++, Objective-C, Objective-C++, +Java, Fortran, Ada, and Go. + + The abbreviation "GCC" has multiple meanings in common use. The +current official meaning is "GNU Compiler Collection", which refers +generically to the complete suite of tools. The name historically stood +for "GNU C Compiler", and this usage is still common when the emphasis +is on compiling C programs. Finally, the name is also used when +speaking of the "language-independent" component of GCC: code shared +among the compilers for all supported languages. + + The language-independent component of GCC includes the majority of the +optimizers, as well as the "back ends" that generate machine code for +various processors. + + The part of a compiler that is specific to a particular language is +called the "front end". In addition to the front ends that are +integrated components of GCC, there are several other front ends that +are maintained separately. These support languages such as Pascal, +Mercury, and COBOL. To use these, they must be built together with GCC +proper. + + Most of the compilers for languages other than C have their own names. +The C++ compiler is G++, the Ada compiler is GNAT, and so on. When we +talk about compiling one of those languages, we might refer to that +compiler by its own name, or as GCC. Either is correct. + + Historically, compilers for many languages, including C++ and Fortran, +have been implemented as "preprocessors" which emit another high level +language such as C. None of the compilers included in GCC are +implemented this way; they all generate machine code directly. This +sort of preprocessor should not be confused with the "C preprocessor", +which is an integral feature of the C, C++, Objective-C and +Objective-C++ languages. + + +File: gcc.info, Node: Standards, Next: Invoking GCC, Prev: G++ and GCC, Up: Top + +2 Language Standards Supported by GCC +************************************* + +For each language compiled by GCC for which there is a standard, GCC +attempts to follow one or more versions of that standard, possibly with +some exceptions, and possibly with some extensions. + +2.1 C language +============== + +GCC supports three versions of the C standard, although support for the +most recent version is not yet complete. + + The original ANSI C standard (X3.159-1989) was ratified in 1989 and +published in 1990. This standard was ratified as an ISO standard +(ISO/IEC 9899:1990) later in 1990. There were no technical differences +between these publications, although the sections of the ANSI standard +were renumbered and became clauses in the ISO standard. This standard, +in both its forms, is commonly known as "C89", or occasionally as "C90", +from the dates of ratification. The ANSI standard, but not the ISO +standard, also came with a Rationale document. To select this standard +in GCC, use one of the options '-ansi', '-std=c90' or +'-std=iso9899:1990'; to obtain all the diagnostics required by the +standard, you should also specify '-pedantic' (or '-pedantic-errors' if +you want them to be errors rather than warnings). *Note Options +Controlling C Dialect: C Dialect Options. + + Errors in the 1990 ISO C standard were corrected in two Technical +Corrigenda published in 1994 and 1996. GCC does not support the +uncorrected version. + + An amendment to the 1990 standard was published in 1995. This +amendment added digraphs and '__STDC_VERSION__' to the language, but +otherwise concerned the library. This amendment is commonly known as +"AMD1"; the amended standard is sometimes known as "C94" or "C95". To +select this standard in GCC, use the option '-std=iso9899:199409' (with, +as for other standard versions, '-pedantic' to receive all required +diagnostics). + + A new edition of the ISO C standard was published in 1999 as ISO/IEC +9899:1999, and is commonly known as "C99". GCC has substantially +complete support for this standard version; see +<http://gcc.gnu.org/c99status.html> for details. To select this +standard, use '-std=c99' or '-std=iso9899:1999'. (While in development, +drafts of this standard version were referred to as "C9X".) + + Errors in the 1999 ISO C standard were corrected in three Technical +Corrigenda published in 2001, 2004 and 2007. GCC does not support the +uncorrected version. + + A fourth version of the C standard, known as "C11", was published in +2011 as ISO/IEC 9899:2011. GCC has substantially complete support for +this standard, enabled with '-std=c11' or '-std=iso9899:2011'. (While +in development, drafts of this standard version were referred to as +"C1X".) + + By default, GCC provides some extensions to the C language that on rare +occasions conflict with the C standard. *Note Extensions to the C +Language Family: C Extensions. Use of the '-std' options listed above +will disable these extensions where they conflict with the C standard +version selected. You may also select an extended version of the C +language explicitly with '-std=gnu90' (for C90 with GNU extensions), +'-std=gnu99' (for C99 with GNU extensions) or '-std=gnu11' (for C11 with +GNU extensions). The default, if no C language dialect options are +given, is '-std=gnu90'; this is intended to change to '-std=gnu11' in +some future release. Some features that are part of the C99 standard +are accepted as extensions in C90 mode, and some features that are part +of the C11 standard are accepted as extensions in C90 and C99 modes. + + The ISO C standard defines (in clause 4) two classes of conforming +implementation. A "conforming hosted implementation" supports the whole +standard including all the library facilities; a "conforming +freestanding implementation" is only required to provide certain library +facilities: those in '<float.h>', '<limits.h>', '<stdarg.h>', and +'<stddef.h>'; since AMD1, also those in '<iso646.h>'; since C99, also +those in '<stdbool.h>' and '<stdint.h>'; and since C11, also those in +'<stdalign.h>' and '<stdnoreturn.h>'. In addition, complex types, added +in C99, are not required for freestanding implementations. The standard +also defines two environments for programs, a "freestanding +environment", required of all implementations and which may not have +library facilities beyond those required of freestanding +implementations, where the handling of program startup and termination +are implementation-defined, and a "hosted environment", which is not +required, in which all the library facilities are provided and startup +is through a function 'int main (void)' or 'int main (int, char *[])'. +An OS kernel would be a freestanding environment; a program using the +facilities of an operating system would normally be in a hosted +implementation. + + GCC aims towards being usable as a conforming freestanding +implementation, or as the compiler for a conforming hosted +implementation. By default, it will act as the compiler for a hosted +implementation, defining '__STDC_HOSTED__' as '1' and presuming that +when the names of ISO C functions are used, they have the semantics +defined in the standard. To make it act as a conforming freestanding +implementation for a freestanding environment, use the option +'-ffreestanding'; it will then define '__STDC_HOSTED__' to '0' and not +make assumptions about the meanings of function names from the standard +library, with exceptions noted below. To build an OS kernel, you may +well still need to make your own arrangements for linking and startup. +*Note Options Controlling C Dialect: C Dialect Options. + + GCC does not provide the library facilities required only of hosted +implementations, nor yet all the facilities required by C99 of +freestanding implementations on all platforms; to use the facilities of +a hosted environment, you will need to find them elsewhere (for example, +in the GNU C library). *Note Standard Libraries: Standard Libraries. + + Most of the compiler support routines used by GCC are present in +'libgcc', but there are a few exceptions. GCC requires the freestanding +environment provide 'memcpy', 'memmove', 'memset' and 'memcmp'. +Finally, if '__builtin_trap' is used, and the target does not implement +the 'trap' pattern, then GCC will emit a call to 'abort'. + + For references to Technical Corrigenda, Rationale documents and +information concerning the history of C that is available online, see +<http://gcc.gnu.org/readings.html> + +2.2 C++ language +================ + +GCC supports the original ISO C++ standard (1998) and contains +experimental support for the second ISO C++ standard (2011). + + The original ISO C++ standard was published as the ISO standard +(ISO/IEC 14882:1998) and amended by a Technical Corrigenda published in +2003 (ISO/IEC 14882:2003). These standards are referred to as C++98 and +C++03, respectively. GCC implements the majority of C++98 ('export' is +a notable exception) and most of the changes in C++03. To select this +standard in GCC, use one of the options '-ansi', '-std=c++98', or +'-std=c++03'; to obtain all the diagnostics required by the standard, +you should also specify '-pedantic' (or '-pedantic-errors' if you want +them to be errors rather than warnings). + + A revised ISO C++ standard was published in 2011 as ISO/IEC 14882:2011, +and is referred to as C++11; before its publication it was commonly +referred to as C++0x. C++11 contains several changes to the C++ +language, most of which have been implemented in an experimental C++11 +mode in GCC. For information regarding the C++11 features available in +the experimental C++11 mode, see +<http://gcc.gnu.org/projects/cxx0x.html>. To select this standard in +GCC, use the option '-std=c++11'; to obtain all the diagnostics required +by the standard, you should also specify '-pedantic' (or +'-pedantic-errors' if you want them to be errors rather than warnings). + + More information about the C++ standards is available on the ISO C++ +committee's web site at <http://www.open-std.org/jtc1/sc22/wg21/>. + + By default, GCC provides some extensions to the C++ language; *Note +Options Controlling C++ Dialect: C++ Dialect Options. Use of the '-std' +option listed above will disable these extensions. You may also select +an extended version of the C++ language explicitly with '-std=gnu++98' +(for C++98 with GNU extensions) or '-std=gnu++11' (for C++11 with GNU +extensions). The default, if no C++ language dialect options are given, +is '-std=gnu++98'. + +2.3 Objective-C and Objective-C++ languages +=========================================== + +GCC supports "traditional" Objective-C (also known as "Objective-C 1.0") +and contains support for the Objective-C exception and synchronization +syntax. It has also support for a number of "Objective-C 2.0" language +extensions, including properties, fast enumeration (only for +Objective-C), method attributes and the @optional and @required keywords +in protocols. GCC supports Objective-C++ and features available in +Objective-C are also available in Objective-C++. + + GCC by default uses the GNU Objective-C runtime library, which is part +of GCC and is not the same as the Apple/NeXT Objective-C runtime library +used on Apple systems. There are a number of differences documented in +this manual. The options '-fgnu-runtime' and '-fnext-runtime' allow you +to switch between producing output that works with the GNU Objective-C +runtime library and output that works with the Apple/NeXT Objective-C +runtime library. + + There is no formal written standard for Objective-C or Objective-C++. +The authoritative manual on traditional Objective-C (1.0) is +"Object-Oriented Programming and the Objective-C Language", available at +a number of web sites: + * <http://www.gnustep.org/resources/documentation/ObjectivCBook.pdf> + is the original NeXTstep document; + * <http://objc.toodarkpark.net> is the same document in another + format; + * + <http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/> + has an updated version but make sure you search for "Object + Oriented Programming and the Objective-C Programming Language 1.0", + not documentation on the newer "Objective-C 2.0" language + + The Objective-C exception and synchronization syntax (that is, the +keywords @try, @throw, @catch, @finally and @synchronized) is supported +by GCC and is enabled with the option '-fobjc-exceptions'. The syntax +is briefly documented in this manual and in the Objective-C 2.0 manuals +from Apple. + + The Objective-C 2.0 language extensions and features are automatically +enabled; they include properties (via the @property, @synthesize and +@dynamic keywords), fast enumeration (not available in Objective-C++), +attributes for methods (such as deprecated, noreturn, sentinel, format), +the unused attribute for method arguments, the @package keyword for +instance variables and the @optional and @required keywords in +protocols. You can disable all these Objective-C 2.0 language +extensions with the option '-fobjc-std=objc1', which causes the compiler +to recognize the same Objective-C language syntax recognized by GCC 4.0, +and to produce an error if one of the new features is used. + + GCC has currently no support for non-fragile instance variables. + + The authoritative manual on Objective-C 2.0 is available from Apple: + * + <http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/> + + For more information concerning the history of Objective-C that is +available online, see <http://gcc.gnu.org/readings.html> + +2.4 Go language +=============== + +As of the GCC 4.7.1 release, GCC supports the Go 1 language standard, +described at <http://golang.org/doc/go1.html>. + +2.5 References for other languages +================================== + +*Note GNAT Reference Manual: (gnat_rm)Top, for information on standard +conformance and compatibility of the Ada compiler. + + *Note Standards: (gfortran)Standards, for details of standards +supported by GNU Fortran. + + *Note Compatibility with the Java Platform: (gcj)Compatibility, for +details of compatibility between 'gcj' and the Java Platform. + + +File: gcc.info, Node: Invoking GCC, Next: C Implementation, Prev: Standards, Up: Top + +3 GCC Command Options +********************* + +When you invoke GCC, it normally does preprocessing, compilation, +assembly and linking. The "overall options" allow you to stop this +process at an intermediate stage. For example, the '-c' option says not +to run the linker. Then the output consists of object files output by +the assembler. + + Other options are passed on to one stage of processing. Some options +control the preprocessor and others the compiler itself. Yet other +options control the assembler and linker; most of these are not +documented here, since you rarely need to use any of them. + + Most of the command-line options that you can use with GCC are useful +for C programs; when an option is only useful with another language +(usually C++), the explanation says so explicitly. If the description +for a particular option does not mention a source language, you can use +that option with all supported languages. + + *Note Compiling C++ Programs: Invoking G++, for a summary of special +options for compiling C++ programs. + + The 'gcc' program accepts options and file names as operands. Many +options have multi-letter names; therefore multiple single-letter +options may _not_ be grouped: '-dv' is very different from '-d -v'. + + You can mix options and other arguments. For the most part, the order +you use doesn't matter. Order does matter when you use several options +of the same kind; for example, if you specify '-L' more than once, the +directories are searched in the order specified. Also, the placement of +the '-l' option is significant. + + Many options have long names starting with '-f' or with '-W'--for +example, '-fmove-loop-invariants', '-Wformat' and so on. Most of these +have both positive and negative forms; the negative form of '-ffoo' is +'-fno-foo'. This manual documents only one of these two forms, +whichever one is not the default. + + *Note Option Index::, for an index to GCC's options. + +* Menu: + +* Option Summary:: Brief list of all options, without explanations. +* Overall Options:: Controlling the kind of output: + an executable, object files, assembler files, + or preprocessed source. +* Invoking G++:: Compiling C++ programs. +* C Dialect Options:: Controlling the variant of C language compiled. +* C++ Dialect Options:: Variations on C++. +* Objective-C and Objective-C++ Dialect Options:: Variations on Objective-C + and Objective-C++. +* Language Independent Options:: Controlling how diagnostics should be + formatted. +* Warning Options:: How picky should the compiler be? +* Debugging Options:: Symbol tables, measurements, and debugging dumps. +* Optimize Options:: How much optimization? +* Preprocessor Options:: Controlling header files and macro definitions. + Also, getting dependency information for Make. +* Assembler Options:: Passing options to the assembler. +* Link Options:: Specifying libraries and so on. +* Directory Options:: Where to find header files and libraries. + Where to find the compiler executable files. +* Spec Files:: How to pass switches to sub-processes. +* Target Options:: Running a cross-compiler, or an old version of GCC. +* Submodel Options:: Specifying minor hardware or convention variations, + such as 68010 vs 68020. +* Code Gen Options:: Specifying conventions for function calls, data layout + and register usage. +* Environment Variables:: Env vars that affect GCC. +* Precompiled Headers:: Compiling a header once, and using it many times. + + +File: gcc.info, Node: Option Summary, Next: Overall Options, Up: Invoking GCC + +3.1 Option Summary +================== + +Here is a summary of all the options, grouped by type. Explanations are +in the following sections. + +_Overall Options_ + *Note Options Controlling the Kind of Output: Overall Options. + -c -S -E -o FILE -no-canonical-prefixes + -pipe -pass-exit-codes + -x LANGUAGE -v -### --help[=CLASS[,...]] --target-help + --version -wrapper @FILE -fplugin=FILE -fplugin-arg-NAME=ARG + -fdump-ada-spec[-slim] -fada-spec-parent=UNIT -fdump-go-spec=FILE + +_C Language Options_ + *Note Options Controlling C Dialect: C Dialect Options. + -ansi -std=STANDARD -fgnu89-inline + -aux-info FILENAME -fallow-parameterless-variadic-functions + -fno-asm -fno-builtin -fno-builtin-FUNCTION + -fhosted -ffreestanding -fopenmp -fopenmp-simd -fms-extensions + -fplan9-extensions -trigraphs -traditional -traditional-cpp + -fallow-single-precision -fcond-mismatch -flax-vector-conversions + -fsigned-bitfields -fsigned-char + -funsigned-bitfields -funsigned-char + +_C++ Language Options_ + *Note Options Controlling C++ Dialect: C++ Dialect Options. + -fabi-version=N -fno-access-control -fcheck-new + -fconstexpr-depth=N -ffriend-injection + -fno-elide-constructors + -fno-enforce-eh-specs + -ffor-scope -fno-for-scope -fno-gnu-keywords + -fno-implicit-templates + -fno-implicit-inline-templates + -fno-implement-inlines -fms-extensions + -fno-nonansi-builtins -fnothrow-opt -fno-operator-names + -fno-optional-diags -fpermissive + -fno-pretty-templates + -frepo -fno-rtti -fstats -ftemplate-backtrace-limit=N + -ftemplate-depth=N + -fno-threadsafe-statics -fuse-cxa-atexit -fno-weak -nostdinc++ + -fvisibility-inlines-hidden + -fvtable-verify=STD|PREINIT|NONE + -fvtv-counts -fvtv-debug + -fvisibility-ms-compat + -fext-numeric-literals + -Wabi -Wconversion-null -Wctor-dtor-privacy + -Wdelete-non-virtual-dtor -Wliteral-suffix -Wnarrowing + -Wnoexcept -Wnon-virtual-dtor -Wreorder + -Weffc++ -Wstrict-null-sentinel + -Wno-non-template-friend -Wold-style-cast + -Woverloaded-virtual -Wno-pmf-conversions + -Wsign-promo + +_Objective-C and Objective-C++ Language Options_ + *Note Options Controlling Objective-C and Objective-C++ Dialects: + Objective-C and Objective-C++ Dialect Options. + -fconstant-string-class=CLASS-NAME + -fgnu-runtime -fnext-runtime + -fno-nil-receivers + -fobjc-abi-version=N + -fobjc-call-cxx-cdtors + -fobjc-direct-dispatch + -fobjc-exceptions + -fobjc-gc + -fobjc-nilcheck + -fobjc-std=objc1 + -freplace-objc-classes + -fzero-link + -gen-decls + -Wassign-intercept + -Wno-protocol -Wselector + -Wstrict-selector-match + -Wundeclared-selector + +_Language Independent Options_ + *Note Options to Control Diagnostic Messages Formatting: Language + Independent Options. + -fmessage-length=N + -fdiagnostics-show-location=[once|every-line] + -fdiagnostics-color=[auto|never|always] + -fno-diagnostics-show-option -fno-diagnostics-show-caret + +_Warning Options_ + *Note Options to Request or Suppress Warnings: Warning Options. + -fsyntax-only -fmax-errors=N -Wpedantic + -pedantic-errors + -w -Wextra -Wall -Waddress -Waggregate-return + -Waggressive-loop-optimizations -Warray-bounds + -Wno-attributes -Wno-builtin-macro-redefined + -Wc++-compat -Wc++11-compat -Wcast-align -Wcast-qual + -Wchar-subscripts -Wclobbered -Wcomment -Wconditionally-supported + -Wconversion -Wcoverage-mismatch -Wdate-time -Wdelete-incomplete -Wno-cpp + -Wno-deprecated -Wno-deprecated-declarations -Wdisabled-optimization + -Wno-div-by-zero -Wdouble-promotion -Wempty-body -Wenum-compare + -Wno-endif-labels -Werror -Werror=* + -Wfatal-errors -Wfloat-equal -Wformat -Wformat=2 + -Wno-format-contains-nul -Wno-format-extra-args -Wformat-nonliteral + -Wformat-security -Wformat-y2k + -Wframe-larger-than=LEN -Wno-free-nonheap-object -Wjump-misses-init + -Wignored-qualifiers + -Wimplicit -Wimplicit-function-declaration -Wimplicit-int + -Winit-self -Winline -Wmaybe-uninitialized + -Wno-int-to-pointer-cast -Wno-invalid-offsetof + -Winvalid-pch -Wlarger-than=LEN -Wunsafe-loop-optimizations + -Wlogical-op -Wlong-long + -Wmain -Wmaybe-uninitialized -Wmissing-braces -Wmissing-field-initializers + -Wmissing-include-dirs + -Wno-multichar -Wnonnull -Wno-overflow -Wopenmp-simd + -Woverlength-strings -Wpacked -Wpacked-bitfield-compat -Wpadded + -Wparentheses -Wpedantic-ms-format -Wno-pedantic-ms-format + -Wpointer-arith -Wno-pointer-to-int-cast + -Wredundant-decls -Wno-return-local-addr + -Wreturn-type -Wsequence-point -Wshadow + -Wsign-compare -Wsign-conversion -Wfloat-conversion + -Wsizeof-pointer-memaccess + -Wstack-protector -Wstack-usage=LEN -Wstrict-aliasing + -Wstrict-aliasing=n -Wstrict-overflow -Wstrict-overflow=N + -Wsuggest-attribute=[pure|const|noreturn|format] + -Wmissing-format-attribute + -Wswitch -Wswitch-default -Wswitch-enum -Wsync-nand + -Wsystem-headers -Wtrampolines -Wtrigraphs -Wtype-limits -Wundef + -Wuninitialized -Wunknown-pragmas -Wno-pragmas + -Wunsuffixed-float-constants -Wunused -Wunused-function + -Wunused-label -Wunused-local-typedefs -Wunused-parameter + -Wno-unused-result -Wunused-value -Wunused-variable + -Wunused-but-set-parameter -Wunused-but-set-variable + -Wuseless-cast -Wvariadic-macros -Wvector-operation-performance + -Wvla -Wvolatile-register-var -Wwrite-strings -Wzero-as-null-pointer-constant + +_C and Objective-C-only Warning Options_ + -Wbad-function-cast -Wmissing-declarations + -Wmissing-parameter-type -Wmissing-prototypes -Wnested-externs + -Wold-style-declaration -Wold-style-definition + -Wstrict-prototypes -Wtraditional -Wtraditional-conversion + -Wdeclaration-after-statement -Wpointer-sign + +_Debugging Options_ + *Note Options for Debugging Your Program or GCC: Debugging Options. + -dLETTERS -dumpspecs -dumpmachine -dumpversion + -fsanitize=STYLE + -fdbg-cnt-list -fdbg-cnt=COUNTER-VALUE-LIST + -fdisable-ipa-PASS_NAME + -fdisable-rtl-PASS_NAME + -fdisable-rtl-PASS-NAME=RANGE-LIST + -fdisable-tree-PASS_NAME + -fdisable-tree-PASS-NAME=RANGE-LIST + -fdump-noaddr -fdump-unnumbered -fdump-unnumbered-links + -fdump-translation-unit[-N] + -fdump-class-hierarchy[-N] + -fdump-ipa-all -fdump-ipa-cgraph -fdump-ipa-inline + -fdump-passes + -fdump-statistics + -fdump-tree-all + -fdump-tree-original[-N] + -fdump-tree-optimized[-N] + -fdump-tree-cfg -fdump-tree-alias + -fdump-tree-ch + -fdump-tree-ssa[-N] -fdump-tree-pre[-N] + -fdump-tree-ccp[-N] -fdump-tree-dce[-N] + -fdump-tree-gimple[-raw] + -fdump-tree-dom[-N] + -fdump-tree-dse[-N] + -fdump-tree-phiprop[-N] + -fdump-tree-phiopt[-N] + -fdump-tree-forwprop[-N] + -fdump-tree-copyrename[-N] + -fdump-tree-nrv -fdump-tree-vect + -fdump-tree-sink + -fdump-tree-sra[-N] + -fdump-tree-forwprop[-N] + -fdump-tree-fre[-N] + -fdump-tree-vtable-verify + -fdump-tree-vrp[-N] + -fdump-tree-storeccp[-N] + -fdump-final-insns=FILE + -fcompare-debug[=OPTS] -fcompare-debug-second + -feliminate-dwarf2-dups -fno-eliminate-unused-debug-types + -feliminate-unused-debug-symbols -femit-class-debug-always + -fenable-KIND-PASS + -fenable-KIND-PASS=RANGE-LIST + -fdebug-types-section -fmem-report-wpa + -fmem-report -fpre-ipa-mem-report -fpost-ipa-mem-report -fprofile-arcs + -fopt-info + -fopt-info-OPTIONS[=FILE] + -frandom-seed=STRING -fsched-verbose=N + -fsel-sched-verbose -fsel-sched-dump-cfg -fsel-sched-pipelining-verbose + -fstack-usage -ftest-coverage -ftime-report -fvar-tracking + -fvar-tracking-assignments -fvar-tracking-assignments-toggle + -g -gLEVEL -gtoggle -gcoff -gdwarf-VERSION + -ggdb -grecord-gcc-switches -gno-record-gcc-switches + -gstabs -gstabs+ -gstrict-dwarf -gno-strict-dwarf + -gvms -gxcoff -gxcoff+ + -fno-merge-debug-strings -fno-dwarf2-cfi-asm + -fdebug-prefix-map=OLD=NEW + -femit-struct-debug-baseonly -femit-struct-debug-reduced + -femit-struct-debug-detailed[=SPEC-LIST] + -p -pg -print-file-name=LIBRARY -print-libgcc-file-name + -print-multi-directory -print-multi-lib -print-multi-os-directory + -print-prog-name=PROGRAM -print-search-dirs -Q + -print-sysroot -print-sysroot-headers-suffix + -save-temps -save-temps=cwd -save-temps=obj -time[=FILE] + +_Optimization Options_ + *Note Options that Control Optimization: Optimize Options. + -faggressive-loop-optimizations -falign-functions[=N] + -falign-jumps[=N] + -falign-labels[=N] -falign-loops[=N] + -fassociative-math -fauto-inc-dec -fbranch-probabilities + -fbranch-target-load-optimize -fbranch-target-load-optimize2 + -fbtr-bb-exclusive -fcaller-saves + -fcheck-data-deps -fcombine-stack-adjustments -fconserve-stack + -fcompare-elim -fcprop-registers -fcrossjumping + -fcse-follow-jumps -fcse-skip-blocks -fcx-fortran-rules + -fcx-limited-range + -fdata-sections -fdce -fdelayed-branch + -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fdse + -fearly-inlining -fipa-sra -fexpensive-optimizations -ffat-lto-objects + -ffast-math -ffinite-math-only -ffloat-store -fexcess-precision=STYLE + -fforward-propagate -ffp-contract=STYLE -ffunction-sections + -fgcse -fgcse-after-reload -fgcse-las -fgcse-lm -fgraphite-identity + -fgcse-sm -fhoist-adjacent-loads -fif-conversion + -fif-conversion2 -findirect-inlining + -finline-functions -finline-functions-called-once -finline-limit=N + -finline-small-functions -fipa-cp -fipa-cp-clone + -fipa-pta -fipa-profile -fipa-pure-const -fipa-reference + -fira-algorithm=ALGORITHM + -fira-region=REGION -fira-hoist-pressure + -fira-loop-pressure -fno-ira-share-save-slots + -fno-ira-share-spill-slots -fira-verbose=N + -fisolate-erroneous-paths-dereference -fisolate-erroneous-paths-attribute + -fivopts -fkeep-inline-functions -fkeep-static-consts -flive-range-shrinkage + -floop-block -floop-interchange -floop-strip-mine -floop-nest-optimize + -floop-parallelize-all -flto -flto-compression-level + -flto-partition=ALG -flto-report -flto-report-wpa -fmerge-all-constants + -fmerge-constants -fmodulo-sched -fmodulo-sched-allow-regmoves + -fmove-loop-invariants -fno-branch-count-reg + -fno-defer-pop -fno-function-cse -fno-guess-branch-probability + -fno-inline -fno-math-errno -fno-peephole -fno-peephole2 + -fno-sched-interblock -fno-sched-spec -fno-signed-zeros + -fno-toplevel-reorder -fno-trapping-math -fno-zero-initialized-in-bss + -fomit-frame-pointer -foptimize-sibling-calls + -fpartial-inlining -fpeel-loops -fpredictive-commoning + -fprefetch-loop-arrays -fprofile-report + -fprofile-correction -fprofile-dir=PATH -fprofile-generate + -fprofile-generate=PATH + -fprofile-use -fprofile-use=PATH -fprofile-values -fprofile-reorder-functions + -freciprocal-math -free -frename-registers -freorder-blocks + -freorder-blocks-and-partition -freorder-functions + -frerun-cse-after-loop -freschedule-modulo-scheduled-loops + -frounding-math -fsched2-use-superblocks -fsched-pressure + -fsched-spec-load -fsched-spec-load-dangerous + -fsched-stalled-insns-dep[=N] -fsched-stalled-insns[=N] + -fsched-group-heuristic -fsched-critical-path-heuristic + -fsched-spec-insn-heuristic -fsched-rank-heuristic + -fsched-last-insn-heuristic -fsched-dep-count-heuristic + -fschedule-insns -fschedule-insns2 -fsection-anchors + -fselective-scheduling -fselective-scheduling2 + -fsel-sched-pipelining -fsel-sched-pipelining-outer-loops + -fshrink-wrap -fsignaling-nans -fsingle-precision-constant + -fsplit-ivs-in-unroller -fsplit-wide-types -fstack-protector + -fstack-protector-all -fstack-protector-strong -fstrict-aliasing + -fstrict-overflow -fthread-jumps -ftracer -ftree-bit-ccp + -ftree-builtin-call-dce -ftree-ccp -ftree-ch + -ftree-coalesce-inline-vars -ftree-coalesce-vars -ftree-copy-prop + -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse + -ftree-forwprop -ftree-fre -ftree-loop-if-convert + -ftree-loop-if-convert-stores -ftree-loop-im + -ftree-phiprop -ftree-loop-distribution -ftree-loop-distribute-patterns + -ftree-loop-ivcanon -ftree-loop-linear -ftree-loop-optimize + -ftree-loop-vectorize + -ftree-parallelize-loops=N -ftree-pre -ftree-partial-pre -ftree-pta + -ftree-reassoc -ftree-sink -ftree-slsr -ftree-sra + -ftree-switch-conversion -ftree-tail-merge -ftree-ter + -ftree-vectorize -ftree-vrp + -funit-at-a-time -funroll-all-loops -funroll-loops + -funsafe-loop-optimizations -funsafe-math-optimizations -funswitch-loops + -fvariable-expansion-in-unroller -fvect-cost-model -fvpt -fweb + -fwhole-program -fwpa -fuse-ld=LINKER -fuse-linker-plugin + --param NAME=VALUE + -O -O0 -O1 -O2 -O3 -Os -Ofast -Og + +_Preprocessor Options_ + *Note Options Controlling the Preprocessor: Preprocessor Options. + -AQUESTION=ANSWER + -A-QUESTION[=ANSWER] + -C -dD -dI -dM -dN + -DMACRO[=DEFN] -E -H + -idirafter DIR + -include FILE -imacros FILE + -iprefix FILE -iwithprefix DIR + -iwithprefixbefore DIR -isystem DIR + -imultilib DIR -isysroot DIR + -M -MM -MF -MG -MP -MQ -MT -nostdinc + -P -fdebug-cpp -ftrack-macro-expansion -fworking-directory + -remap -trigraphs -undef -UMACRO + -Wp,OPTION -Xpreprocessor OPTION -no-integrated-cpp + +_Assembler Option_ + *Note Passing Options to the Assembler: Assembler Options. + -Wa,OPTION -Xassembler OPTION + +_Linker Options_ + *Note Options for Linking: Link Options. + OBJECT-FILE-NAME -lLIBRARY + -nostartfiles -nodefaultlibs -nostdlib -pie -rdynamic + -s -static -static-libgcc -static-libstdc++ + -static-libasan -static-libtsan -static-liblsan -static-libubsan + -shared -shared-libgcc -symbolic + -T SCRIPT -Wl,OPTION -Xlinker OPTION + -u SYMBOL + +_Directory Options_ + *Note Options for Directory Search: Directory Options. + -BPREFIX -IDIR -iplugindir=DIR + -iquoteDIR -LDIR -specs=FILE -I- + --sysroot=DIR --no-sysroot-suffix + +_Machine Dependent Options_ + *Note Hardware Models and Configurations: Submodel Options. + + _AArch64 Options_ + -mabi=NAME -mbig-endian -mlittle-endian + -mgeneral-regs-only + -mcmodel=tiny -mcmodel=small -mcmodel=large + -mstrict-align + -momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer + -mtls-dialect=desc -mtls-dialect=traditional + -march=NAME -mcpu=NAME -mtune=NAME + + _Adapteva Epiphany Options_ + -mhalf-reg-file -mprefer-short-insn-regs + -mbranch-cost=NUM -mcmove -mnops=NUM -msoft-cmpsf + -msplit-lohi -mpost-inc -mpost-modify -mstack-offset=NUM + -mround-nearest -mlong-calls -mshort-calls -msmall16 + -mfp-mode=MODE -mvect-double -max-vect-align=NUM + -msplit-vecmove-early -m1reg-REG + + _ARC Options_ + -mbarrel-shifter + -mcpu=CPU -mA6 -mARC600 -mA7 -mARC700 + -mdpfp -mdpfp-compact -mdpfp-fast -mno-dpfp-lrsr + -mea -mno-mpy -mmul32x16 -mmul64 + -mnorm -mspfp -mspfp-compact -mspfp-fast -msimd -msoft-float -mswap + -mcrc -mdsp-packa -mdvbf -mlock -mmac-d16 -mmac-24 -mrtsc -mswape + -mtelephony -mxy -misize -mannotate-align -marclinux -marclinux_prof + -mepilogue-cfi -mlong-calls -mmedium-calls -msdata + -mucb-mcount -mvolatile-cache + -malign-call -mauto-modify-reg -mbbit-peephole -mno-brcc + -mcase-vector-pcrel -mcompact-casesi -mno-cond-exec -mearly-cbranchsi + -mexpand-adddi -mindexed-loads -mlra -mlra-priority-none + -mlra-priority-compact mlra-priority-noncompact -mno-millicode + -mmixed-code -mq-class -mRcq -mRcw -msize-level=LEVEL + -mtune=CPU -mmultcost=NUM -munalign-prob-threshold=PROBABILITY + + _ARM Options_ + -mapcs-frame -mno-apcs-frame + -mabi=NAME + -mapcs-stack-check -mno-apcs-stack-check + -mapcs-float -mno-apcs-float + -mapcs-reentrant -mno-apcs-reentrant + -msched-prolog -mno-sched-prolog + -mlittle-endian -mbig-endian -mwords-little-endian + -mfloat-abi=NAME + -mfp16-format=NAME + -mthumb-interwork -mno-thumb-interwork + -mcpu=NAME -march=NAME -mfpu=NAME + -mstructure-size-boundary=N + -mabort-on-noreturn + -mlong-calls -mno-long-calls + -msingle-pic-base -mno-single-pic-base + -mpic-register=REG + -mnop-fun-dllimport + -mpoke-function-name + -mthumb -marm + -mtpcs-frame -mtpcs-leaf-frame + -mcaller-super-interworking -mcallee-super-interworking + -mtp=NAME -mtls-dialect=DIALECT + -mword-relocations + -mfix-cortex-m3-ldrd + -munaligned-access + -mneon-for-64bits + -mslow-flash-data + -mrestrict-it + + _AVR Options_ + -mmcu=MCU -maccumulate-args -mbranch-cost=COST + -mcall-prologues -mint8 -mno-interrupts -mrelax + -mstrict-X -mtiny-stack -Waddr-space-convert + + _Blackfin Options_ + -mcpu=CPU[-SIREVISION] + -msim -momit-leaf-frame-pointer -mno-omit-leaf-frame-pointer + -mspecld-anomaly -mno-specld-anomaly -mcsync-anomaly -mno-csync-anomaly + -mlow-64k -mno-low64k -mstack-check-l1 -mid-shared-library + -mno-id-shared-library -mshared-library-id=N + -mleaf-id-shared-library -mno-leaf-id-shared-library + -msep-data -mno-sep-data -mlong-calls -mno-long-calls + -mfast-fp -minline-plt -mmulticore -mcorea -mcoreb -msdram + -micplb + + _C6X Options_ + -mbig-endian -mlittle-endian -march=CPU + -msim -msdata=SDATA-TYPE + + _CRIS Options_ + -mcpu=CPU -march=CPU -mtune=CPU + -mmax-stack-frame=N -melinux-stacksize=N + -metrax4 -metrax100 -mpdebug -mcc-init -mno-side-effects + -mstack-align -mdata-align -mconst-align + -m32-bit -m16-bit -m8-bit -mno-prologue-epilogue -mno-gotplt + -melf -maout -melinux -mlinux -sim -sim2 + -mmul-bug-workaround -mno-mul-bug-workaround + + _CR16 Options_ + -mmac + -mcr16cplus -mcr16c + -msim -mint32 -mbit-ops + -mdata-model=MODEL + + _Darwin Options_ + -all_load -allowable_client -arch -arch_errors_fatal + -arch_only -bind_at_load -bundle -bundle_loader + -client_name -compatibility_version -current_version + -dead_strip + -dependency-file -dylib_file -dylinker_install_name + -dynamic -dynamiclib -exported_symbols_list + -filelist -flat_namespace -force_cpusubtype_ALL + -force_flat_namespace -headerpad_max_install_names + -iframework + -image_base -init -install_name -keep_private_externs + -multi_module -multiply_defined -multiply_defined_unused + -noall_load -no_dead_strip_inits_and_terms + -nofixprebinding -nomultidefs -noprebind -noseglinkedit + -pagezero_size -prebind -prebind_all_twolevel_modules + -private_bundle -read_only_relocs -sectalign + -sectobjectsymbols -whyload -seg1addr + -sectcreate -sectobjectsymbols -sectorder + -segaddr -segs_read_only_addr -segs_read_write_addr + -seg_addr_table -seg_addr_table_filename -seglinkedit + -segprot -segs_read_only_addr -segs_read_write_addr + -single_module -static -sub_library -sub_umbrella + -twolevel_namespace -umbrella -undefined + -unexported_symbols_list -weak_reference_mismatches + -whatsloaded -F -gused -gfull -mmacosx-version-min=VERSION + -mkernel -mone-byte-bool + + _DEC Alpha Options_ + -mno-fp-regs -msoft-float + -mieee -mieee-with-inexact -mieee-conformant + -mfp-trap-mode=MODE -mfp-rounding-mode=MODE + -mtrap-precision=MODE -mbuild-constants + -mcpu=CPU-TYPE -mtune=CPU-TYPE + -mbwx -mmax -mfix -mcix + -mfloat-vax -mfloat-ieee + -mexplicit-relocs -msmall-data -mlarge-data + -msmall-text -mlarge-text + -mmemory-latency=TIME + + _FR30 Options_ + -msmall-model -mno-lsim + + _FRV Options_ + -mgpr-32 -mgpr-64 -mfpr-32 -mfpr-64 + -mhard-float -msoft-float + -malloc-cc -mfixed-cc -mdword -mno-dword + -mdouble -mno-double + -mmedia -mno-media -mmuladd -mno-muladd + -mfdpic -minline-plt -mgprel-ro -multilib-library-pic + -mlinked-fp -mlong-calls -malign-labels + -mlibrary-pic -macc-4 -macc-8 + -mpack -mno-pack -mno-eflags -mcond-move -mno-cond-move + -moptimize-membar -mno-optimize-membar + -mscc -mno-scc -mcond-exec -mno-cond-exec + -mvliw-branch -mno-vliw-branch + -mmulti-cond-exec -mno-multi-cond-exec -mnested-cond-exec + -mno-nested-cond-exec -mtomcat-stats + -mTLS -mtls + -mcpu=CPU + + _GNU/Linux Options_ + -mglibc -muclibc -mbionic -mandroid + -tno-android-cc -tno-android-ld + + _H8/300 Options_ + -mrelax -mh -ms -mn -mexr -mno-exr -mint32 -malign-300 + + _HPPA Options_ + -march=ARCHITECTURE-TYPE + -mdisable-fpregs -mdisable-indexing + -mfast-indirect-calls -mgas -mgnu-ld -mhp-ld + -mfixed-range=REGISTER-RANGE + -mjump-in-delay -mlinker-opt -mlong-calls + -mlong-load-store -mno-disable-fpregs + -mno-disable-indexing -mno-fast-indirect-calls -mno-gas + -mno-jump-in-delay -mno-long-load-store + -mno-portable-runtime -mno-soft-float + -mno-space-regs -msoft-float -mpa-risc-1-0 + -mpa-risc-1-1 -mpa-risc-2-0 -mportable-runtime + -mschedule=CPU-TYPE -mspace-regs -msio -mwsio + -munix=UNIX-STD -nolibdld -static -threads + + _i386 and x86-64 Options_ + -mtune=CPU-TYPE -march=CPU-TYPE + -mtune-ctrl=FEATURE-LIST -mdump-tune-features -mno-default + -mfpmath=UNIT + -masm=DIALECT -mno-fancy-math-387 + -mno-fp-ret-in-387 -msoft-float + -mno-wide-multiply -mrtd -malign-double + -mpreferred-stack-boundary=NUM + -mincoming-stack-boundary=NUM + -mcld -mcx16 -msahf -mmovbe -mcrc32 + -mrecip -mrecip=OPT + -mvzeroupper -mprefer-avx128 + -mmmx -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -msse4 -mavx + -mavx2 -mavx512f -mavx512pf -mavx512er -mavx512cd -msha + -maes -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma -mprefetchwt1 + -msse4a -m3dnow -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop -mlzcnt + -mbmi2 -mfxsr -mxsave -mxsaveopt -mrtm -mlwp -mthreads + -mno-align-stringops -minline-all-stringops + -minline-stringops-dynamically -mstringop-strategy=ALG + -mmemcpy-strategy=STRATEGY -mmemset-strategy=STRATEGY + -mpush-args -maccumulate-outgoing-args -m128bit-long-double + -m96bit-long-double -mlong-double-64 -mlong-double-80 -mlong-double-128 + -mregparm=NUM -msseregparm + -mveclibabi=TYPE -mvect8-ret-in-mem + -mpc32 -mpc64 -mpc80 -mstackrealign + -momit-leaf-frame-pointer -mno-red-zone -mno-tls-direct-seg-refs + -mcmodel=CODE-MODEL -mabi=NAME -maddress-mode=MODE + -m32 -m64 -mx32 -m16 -mlarge-data-threshold=NUM + -msse2avx -mfentry -m8bit-idiv + -mavx256-split-unaligned-load -mavx256-split-unaligned-store + -mstack-protector-guard=GUARD + + _i386 and x86-64 Windows Options_ + -mconsole -mcygwin -mno-cygwin -mdll + -mnop-fun-dllimport -mthread + -municode -mwin32 -mwindows -fno-set-stack-executable + + _IA-64 Options_ + -mbig-endian -mlittle-endian -mgnu-as -mgnu-ld -mno-pic + -mvolatile-asm-stop -mregister-names -msdata -mno-sdata + -mconstant-gp -mauto-pic -mfused-madd + -minline-float-divide-min-latency + -minline-float-divide-max-throughput + -mno-inline-float-divide + -minline-int-divide-min-latency + -minline-int-divide-max-throughput + -mno-inline-int-divide + -minline-sqrt-min-latency -minline-sqrt-max-throughput + -mno-inline-sqrt + -mdwarf2-asm -mearly-stop-bits + -mfixed-range=REGISTER-RANGE -mtls-size=TLS-SIZE + -mtune=CPU-TYPE -milp32 -mlp64 + -msched-br-data-spec -msched-ar-data-spec -msched-control-spec + -msched-br-in-data-spec -msched-ar-in-data-spec -msched-in-control-spec + -msched-spec-ldc -msched-spec-control-ldc + -msched-prefer-non-data-spec-insns -msched-prefer-non-control-spec-insns + -msched-stop-bits-after-every-cycle -msched-count-spec-in-critical-path + -msel-sched-dont-check-control-spec -msched-fp-mem-deps-zero-cost + -msched-max-memory-insns-hard-limit -msched-max-memory-insns=MAX-INSNS + + _LM32 Options_ + -mbarrel-shift-enabled -mdivide-enabled -mmultiply-enabled + -msign-extend-enabled -muser-enabled + + _M32R/D Options_ + -m32r2 -m32rx -m32r + -mdebug + -malign-loops -mno-align-loops + -missue-rate=NUMBER + -mbranch-cost=NUMBER + -mmodel=CODE-SIZE-MODEL-TYPE + -msdata=SDATA-TYPE + -mno-flush-func -mflush-func=NAME + -mno-flush-trap -mflush-trap=NUMBER + -G NUM + + _M32C Options_ + -mcpu=CPU -msim -memregs=NUMBER + + _M680x0 Options_ + -march=ARCH -mcpu=CPU -mtune=TUNE + -m68000 -m68020 -m68020-40 -m68020-60 -m68030 -m68040 + -m68060 -mcpu32 -m5200 -m5206e -m528x -m5307 -m5407 + -mcfv4e -mbitfield -mno-bitfield -mc68000 -mc68020 + -mnobitfield -mrtd -mno-rtd -mdiv -mno-div -mshort + -mno-short -mhard-float -m68881 -msoft-float -mpcrel + -malign-int -mstrict-align -msep-data -mno-sep-data + -mshared-library-id=n -mid-shared-library -mno-id-shared-library + -mxgot -mno-xgot + + _MCore Options_ + -mhardlit -mno-hardlit -mdiv -mno-div -mrelax-immediates + -mno-relax-immediates -mwide-bitfields -mno-wide-bitfields + -m4byte-functions -mno-4byte-functions -mcallgraph-data + -mno-callgraph-data -mslow-bytes -mno-slow-bytes -mno-lsim + -mlittle-endian -mbig-endian -m210 -m340 -mstack-increment + + _MeP Options_ + -mabsdiff -mall-opts -maverage -mbased=N -mbitops + -mc=N -mclip -mconfig=NAME -mcop -mcop32 -mcop64 -mivc2 + -mdc -mdiv -meb -mel -mio-volatile -ml -mleadz -mm -mminmax + -mmult -mno-opts -mrepeat -ms -msatur -msdram -msim -msimnovec -mtf + -mtiny=N + + _MicroBlaze Options_ + -msoft-float -mhard-float -msmall-divides -mcpu=CPU + -mmemcpy -mxl-soft-mul -mxl-soft-div -mxl-barrel-shift + -mxl-pattern-compare -mxl-stack-check -mxl-gp-opt -mno-clearbss + -mxl-multiply-high -mxl-float-convert -mxl-float-sqrt + -mbig-endian -mlittle-endian -mxl-reorder -mxl-mode-APP-MODEL + + _MIPS Options_ + -EL -EB -march=ARCH -mtune=ARCH + -mips1 -mips2 -mips3 -mips4 -mips32 -mips32r2 + -mips64 -mips64r2 + -mips16 -mno-mips16 -mflip-mips16 + -minterlink-compressed -mno-interlink-compressed + -minterlink-mips16 -mno-interlink-mips16 + -mabi=ABI -mabicalls -mno-abicalls + -mshared -mno-shared -mplt -mno-plt -mxgot -mno-xgot + -mgp32 -mgp64 -mfp32 -mfp64 -mhard-float -msoft-float + -mno-float -msingle-float -mdouble-float + -mabs=MODE -mnan=ENCODING + -mdsp -mno-dsp -mdspr2 -mno-dspr2 + -mmcu -mmno-mcu + -meva -mno-eva + -mvirt -mno-virt + -mmicromips -mno-micromips + -mfpu=FPU-TYPE + -msmartmips -mno-smartmips + -mpaired-single -mno-paired-single -mdmx -mno-mdmx + -mips3d -mno-mips3d -mmt -mno-mt -mllsc -mno-llsc + -mlong64 -mlong32 -msym32 -mno-sym32 + -GNUM -mlocal-sdata -mno-local-sdata + -mextern-sdata -mno-extern-sdata -mgpopt -mno-gopt + -membedded-data -mno-embedded-data + -muninit-const-in-rodata -mno-uninit-const-in-rodata + -mcode-readable=SETTING + -msplit-addresses -mno-split-addresses + -mexplicit-relocs -mno-explicit-relocs + -mcheck-zero-division -mno-check-zero-division + -mdivide-traps -mdivide-breaks + -mmemcpy -mno-memcpy -mlong-calls -mno-long-calls + -mmad -mno-mad -mimadd -mno-imadd -mfused-madd -mno-fused-madd -nocpp + -mfix-24k -mno-fix-24k + -mfix-r4000 -mno-fix-r4000 -mfix-r4400 -mno-fix-r4400 + -mfix-r10000 -mno-fix-r10000 -mfix-rm7000 -mno-fix-rm7000 + -mfix-vr4120 -mno-fix-vr4120 + -mfix-vr4130 -mno-fix-vr4130 -mfix-sb1 -mno-fix-sb1 + -mflush-func=FUNC -mno-flush-func + -mbranch-cost=NUM -mbranch-likely -mno-branch-likely + -mfp-exceptions -mno-fp-exceptions + -mvr4130-align -mno-vr4130-align -msynci -mno-synci + -mrelax-pic-calls -mno-relax-pic-calls -mmcount-ra-address + + _MMIX Options_ + -mlibfuncs -mno-libfuncs -mepsilon -mno-epsilon -mabi=gnu + -mabi=mmixware -mzero-extend -mknuthdiv -mtoplevel-symbols + -melf -mbranch-predict -mno-branch-predict -mbase-addresses + -mno-base-addresses -msingle-exit -mno-single-exit + + _MN10300 Options_ + -mmult-bug -mno-mult-bug + -mno-am33 -mam33 -mam33-2 -mam34 + -mtune=CPU-TYPE + -mreturn-pointer-on-d0 + -mno-crt0 -mrelax -mliw -msetlb + + _Moxie Options_ + -meb -mel -mno-crt0 + + _MSP430 Options_ + -msim -masm-hex -mmcu= -mcpu= -mlarge -msmall -mrelax + + _NDS32 Options_ + -mbig-endian -mlittle-endian + -mreduced-regs -mfull-regs + -mcmov -mno-cmov + -mperf-ext -mno-perf-ext + -mv3push -mno-v3push + -m16bit -mno-16bit + -mgp-direct -mno-gp-direct + -misr-vector-size=NUM + -mcache-block-size=NUM + -march=ARCH + -mforce-fp-as-gp -mforbid-fp-as-gp + -mex9 -mctor-dtor -mrelax + + _Nios II Options_ + -G NUM -mgpopt -mno-gpopt -mel -meb + -mno-bypass-cache -mbypass-cache + -mno-cache-volatile -mcache-volatile + -mno-fast-sw-div -mfast-sw-div + -mhw-mul -mno-hw-mul -mhw-mulx -mno-hw-mulx -mno-hw-div -mhw-div + -mcustom-INSN=N -mno-custom-INSN + -mcustom-fpu-cfg=NAME + -mhal -msmallc -msys-crt0=NAME -msys-lib=NAME + + _PDP-11 Options_ + -mfpu -msoft-float -mac0 -mno-ac0 -m40 -m45 -m10 + -mbcopy -mbcopy-builtin -mint32 -mno-int16 + -mint16 -mno-int32 -mfloat32 -mno-float64 + -mfloat64 -mno-float32 -mabshi -mno-abshi + -mbranch-expensive -mbranch-cheap + -munix-asm -mdec-asm + + _picoChip Options_ + -mae=AE_TYPE -mvliw-lookahead=N + -msymbol-as-address -mno-inefficient-warnings + + _PowerPC Options_ See RS/6000 and PowerPC Options. + + _RL78 Options_ + -msim -mmul=none -mmul=g13 -mmul=rl78 + + _RS/6000 and PowerPC Options_ + -mcpu=CPU-TYPE + -mtune=CPU-TYPE + -mcmodel=CODE-MODEL + -mpowerpc64 + -maltivec -mno-altivec + -mpowerpc-gpopt -mno-powerpc-gpopt + -mpowerpc-gfxopt -mno-powerpc-gfxopt + -mmfcrf -mno-mfcrf -mpopcntb -mno-popcntb -mpopcntd -mno-popcntd + -mfprnd -mno-fprnd + -mcmpb -mno-cmpb -mmfpgpr -mno-mfpgpr -mhard-dfp -mno-hard-dfp + -mfull-toc -mminimal-toc -mno-fp-in-toc -mno-sum-in-toc + -m64 -m32 -mxl-compat -mno-xl-compat -mpe + -malign-power -malign-natural + -msoft-float -mhard-float -mmultiple -mno-multiple + -msingle-float -mdouble-float -msimple-fpu + -mstring -mno-string -mupdate -mno-update + -mavoid-indexed-addresses -mno-avoid-indexed-addresses + -mfused-madd -mno-fused-madd -mbit-align -mno-bit-align + -mstrict-align -mno-strict-align -mrelocatable + -mno-relocatable -mrelocatable-lib -mno-relocatable-lib + -mtoc -mno-toc -mlittle -mlittle-endian -mbig -mbig-endian + -mdynamic-no-pic -maltivec -mswdiv -msingle-pic-base + -mprioritize-restricted-insns=PRIORITY + -msched-costly-dep=DEPENDENCE_TYPE + -minsert-sched-nops=SCHEME + -mcall-sysv -mcall-netbsd + -maix-struct-return -msvr4-struct-return + -mabi=ABI-TYPE -msecure-plt -mbss-plt + -mblock-move-inline-limit=NUM + -misel -mno-isel + -misel=yes -misel=no + -mspe -mno-spe + -mspe=yes -mspe=no + -mpaired + -mgen-cell-microcode -mwarn-cell-microcode + -mvrsave -mno-vrsave + -mmulhw -mno-mulhw + -mdlmzb -mno-dlmzb + -mfloat-gprs=yes -mfloat-gprs=no -mfloat-gprs=single -mfloat-gprs=double + -mprototype -mno-prototype + -msim -mmvme -mads -myellowknife -memb -msdata + -msdata=OPT -mvxworks -G NUM -pthread + -mrecip -mrecip=OPT -mno-recip -mrecip-precision + -mno-recip-precision + -mveclibabi=TYPE -mfriz -mno-friz + -mpointers-to-nested-functions -mno-pointers-to-nested-functions + -msave-toc-indirect -mno-save-toc-indirect + -mpower8-fusion -mno-mpower8-fusion -mpower8-vector -mno-power8-vector + -mcrypto -mno-crypto -mdirect-move -mno-direct-move + -mquad-memory -mno-quad-memory + -mquad-memory-atomic -mno-quad-memory-atomic + -mcompat-align-parm -mno-compat-align-parm + + _RX Options_ + -m64bit-doubles -m32bit-doubles -fpu -nofpu + -mcpu= + -mbig-endian-data -mlittle-endian-data + -msmall-data + -msim -mno-sim + -mas100-syntax -mno-as100-syntax + -mrelax + -mmax-constant-size= + -mint-register= + -mpid + -mno-warn-multiple-fast-interrupts + -msave-acc-in-interrupts + + _S/390 and zSeries Options_ + -mtune=CPU-TYPE -march=CPU-TYPE + -mhard-float -msoft-float -mhard-dfp -mno-hard-dfp + -mlong-double-64 -mlong-double-128 + -mbackchain -mno-backchain -mpacked-stack -mno-packed-stack + -msmall-exec -mno-small-exec -mmvcle -mno-mvcle + -m64 -m31 -mdebug -mno-debug -mesa -mzarch + -mtpf-trace -mno-tpf-trace -mfused-madd -mno-fused-madd + -mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard + -mhotpatch[=HALFWORDS] -mno-hotpatch + + _Score Options_ + -meb -mel + -mnhwloop + -muls + -mmac + -mscore5 -mscore5u -mscore7 -mscore7d + + _SH Options_ + -m1 -m2 -m2e + -m2a-nofpu -m2a-single-only -m2a-single -m2a + -m3 -m3e + -m4-nofpu -m4-single-only -m4-single -m4 + -m4a-nofpu -m4a-single-only -m4a-single -m4a -m4al + -m5-64media -m5-64media-nofpu + -m5-32media -m5-32media-nofpu + -m5-compact -m5-compact-nofpu + -mb -ml -mdalign -mrelax + -mbigtable -mfmovd -mhitachi -mrenesas -mno-renesas -mnomacsave + -mieee -mno-ieee -mbitops -misize -minline-ic_invalidate -mpadstruct + -mspace -mprefergot -musermode -multcost=NUMBER -mdiv=STRATEGY + -mdivsi3_libfunc=NAME -mfixed-range=REGISTER-RANGE + -mindexed-addressing -mgettrcost=NUMBER -mpt-fixed + -maccumulate-outgoing-args -minvalid-symbols + -matomic-model=ATOMIC-MODEL + -mbranch-cost=NUM -mzdcbranch -mno-zdcbranch + -mfused-madd -mno-fused-madd -mfsca -mno-fsca -mfsrra -mno-fsrra + -mpretend-cmove -mtas + + _Solaris 2 Options_ + -mimpure-text -mno-impure-text + -pthreads -pthread + + _SPARC Options_ + -mcpu=CPU-TYPE + -mtune=CPU-TYPE + -mcmodel=CODE-MODEL + -mmemory-model=MEM-MODEL + -m32 -m64 -mapp-regs -mno-app-regs + -mfaster-structs -mno-faster-structs -mflat -mno-flat + -mfpu -mno-fpu -mhard-float -msoft-float + -mhard-quad-float -msoft-quad-float + -mstack-bias -mno-stack-bias + -munaligned-doubles -mno-unaligned-doubles + -mv8plus -mno-v8plus -mvis -mno-vis + -mvis2 -mno-vis2 -mvis3 -mno-vis3 + -mcbcond -mno-cbcond + -mfmaf -mno-fmaf -mpopc -mno-popc + -mfix-at697f -mfix-ut699 + + _SPU Options_ + -mwarn-reloc -merror-reloc + -msafe-dma -munsafe-dma + -mbranch-hints + -msmall-mem -mlarge-mem -mstdmain + -mfixed-range=REGISTER-RANGE + -mea32 -mea64 + -maddress-space-conversion -mno-address-space-conversion + -mcache-size=CACHE-SIZE + -matomic-updates -mno-atomic-updates + + _System V Options_ + -Qy -Qn -YP,PATHS -Ym,DIR + + _TILE-Gx Options_ + -mcpu=CPU -m32 -m64 -mbig-endian -mlittle-endian + -mcmodel=CODE-MODEL + + _TILEPro Options_ + -mcpu=CPU -m32 + + _V850 Options_ + -mlong-calls -mno-long-calls -mep -mno-ep + -mprolog-function -mno-prolog-function -mspace + -mtda=N -msda=N -mzda=N + -mapp-regs -mno-app-regs + -mdisable-callt -mno-disable-callt + -mv850e2v3 -mv850e2 -mv850e1 -mv850es + -mv850e -mv850 -mv850e3v5 + -mloop + -mrelax + -mlong-jumps + -msoft-float + -mhard-float + -mgcc-abi + -mrh850-abi + -mbig-switch + + _VAX Options_ + -mg -mgnu -munix + + _VMS Options_ + -mvms-return-codes -mdebug-main=PREFIX -mmalloc64 + -mpointer-size=SIZE + + _VxWorks Options_ + -mrtp -non-static -Bstatic -Bdynamic + -Xbind-lazy -Xbind-now + + _x86-64 Options_ See i386 and x86-64 Options. + + _Xstormy16 Options_ + -msim + + _Xtensa Options_ + -mconst16 -mno-const16 + -mfused-madd -mno-fused-madd + -mforce-no-pic + -mserialize-volatile -mno-serialize-volatile + -mtext-section-literals -mno-text-section-literals + -mtarget-align -mno-target-align + -mlongcalls -mno-longcalls + + _zSeries Options_ See S/390 and zSeries Options. + +_Code Generation Options_ + *Note Options for Code Generation Conventions: Code Gen Options. + -fcall-saved-REG -fcall-used-REG + -ffixed-REG -fexceptions + -fnon-call-exceptions -fdelete-dead-exceptions -funwind-tables + -fasynchronous-unwind-tables + -fno-gnu-unique + -finhibit-size-directive -finstrument-functions + -finstrument-functions-exclude-function-list=SYM,SYM,... + -finstrument-functions-exclude-file-list=FILE,FILE,... + -fno-common -fno-ident + -fpcc-struct-return -fpic -fPIC -fpie -fPIE + -fno-jump-tables + -frecord-gcc-switches + -freg-struct-return -fshort-enums + -fshort-double -fshort-wchar + -fverbose-asm -fpack-struct[=N] -fstack-check + -fstack-limit-register=REG -fstack-limit-symbol=SYM + -fno-stack-limit -fsplit-stack + -fleading-underscore -ftls-model=MODEL + -fstack-reuse=REUSE_LEVEL + -ftrapv -fwrapv -fbounds-check + -fvisibility -fstrict-volatile-bitfields -fsync-libcalls + + +File: gcc.info, Node: Overall Options, Next: Invoking G++, Prev: Option Summary, Up: Invoking GCC + +3.2 Options Controlling the Kind of Output +========================================== + +Compilation can involve up to four stages: preprocessing, compilation +proper, assembly and linking, always in that order. GCC is capable of +preprocessing and compiling several files either into several assembler +input files, or into one assembler input file; then each assembler input +file produces an object file, and linking combines all the object files +(those newly compiled, and those specified as input) into an executable +file. + + For any given input file, the file name suffix determines what kind of +compilation is done: + +'FILE.c' + C source code that must be preprocessed. + +'FILE.i' + C source code that should not be preprocessed. + +'FILE.ii' + C++ source code that should not be preprocessed. + +'FILE.m' + Objective-C source code. Note that you must link with the + 'libobjc' library to make an Objective-C program work. + +'FILE.mi' + Objective-C source code that should not be preprocessed. + +'FILE.mm' +'FILE.M' + Objective-C++ source code. Note that you must link with the + 'libobjc' library to make an Objective-C++ program work. Note that + '.M' refers to a literal capital M. + +'FILE.mii' + Objective-C++ source code that should not be preprocessed. + +'FILE.h' + C, C++, Objective-C or Objective-C++ header file to be turned into + a precompiled header (default), or C, C++ header file to be turned + into an Ada spec (via the '-fdump-ada-spec' switch). + +'FILE.cc' +'FILE.cp' +'FILE.cxx' +'FILE.cpp' +'FILE.CPP' +'FILE.c++' +'FILE.C' + C++ source code that must be preprocessed. Note that in '.cxx', + the last two letters must both be literally 'x'. Likewise, '.C' + refers to a literal capital C. + +'FILE.mm' +'FILE.M' + Objective-C++ source code that must be preprocessed. + +'FILE.mii' + Objective-C++ source code that should not be preprocessed. + +'FILE.hh' +'FILE.H' +'FILE.hp' +'FILE.hxx' +'FILE.hpp' +'FILE.HPP' +'FILE.h++' +'FILE.tcc' + C++ header file to be turned into a precompiled header or Ada spec. + +'FILE.f' +'FILE.for' +'FILE.ftn' + Fixed form Fortran source code that should not be preprocessed. + +'FILE.F' +'FILE.FOR' +'FILE.fpp' +'FILE.FPP' +'FILE.FTN' + Fixed form Fortran source code that must be preprocessed (with the + traditional preprocessor). + +'FILE.f90' +'FILE.f95' +'FILE.f03' +'FILE.f08' + Free form Fortran source code that should not be preprocessed. + +'FILE.F90' +'FILE.F95' +'FILE.F03' +'FILE.F08' + Free form Fortran source code that must be preprocessed (with the + traditional preprocessor). + +'FILE.go' + Go source code. + +'FILE.ads' + Ada source code file that contains a library unit declaration (a + declaration of a package, subprogram, or generic, or a generic + instantiation), or a library unit renaming declaration (a package, + generic, or subprogram renaming declaration). Such files are also + called "specs". + +'FILE.adb' + Ada source code file containing a library unit body (a subprogram + or package body). Such files are also called "bodies". + +'FILE.s' + Assembler code. + +'FILE.S' +'FILE.sx' + Assembler code that must be preprocessed. + +'OTHER' + An object file to be fed straight into linking. Any file name with + no recognized suffix is treated this way. + + You can specify the input language explicitly with the '-x' option: + +'-x LANGUAGE' + Specify explicitly the LANGUAGE for the following input files + (rather than letting the compiler choose a default based on the + file name suffix). This option applies to all following input + files until the next '-x' option. Possible values for LANGUAGE + are: + c c-header cpp-output + c++ c++-header c++-cpp-output + objective-c objective-c-header objective-c-cpp-output + objective-c++ objective-c++-header objective-c++-cpp-output + assembler assembler-with-cpp + ada + f77 f77-cpp-input f95 f95-cpp-input + go + java + +'-x none' + Turn off any specification of a language, so that subsequent files + are handled according to their file name suffixes (as they are if + '-x' has not been used at all). + +'-pass-exit-codes' + Normally the 'gcc' program exits with the code of 1 if any phase of + the compiler returns a non-success return code. If you specify + '-pass-exit-codes', the 'gcc' program instead returns with the + numerically highest error produced by any phase returning an error + indication. The C, C++, and Fortran front ends return 4 if an + internal compiler error is encountered. + + If you only want some of the stages of compilation, you can use '-x' +(or filename suffixes) to tell 'gcc' where to start, and one of the +options '-c', '-S', or '-E' to say where 'gcc' is to stop. Note that +some combinations (for example, '-x cpp-output -E') instruct 'gcc' to do +nothing at all. + +'-c' + Compile or assemble the source files, but do not link. The linking + stage simply is not done. The ultimate output is in the form of an + object file for each source file. + + By default, the object file name for a source file is made by + replacing the suffix '.c', '.i', '.s', etc., with '.o'. + + Unrecognized input files, not requiring compilation or assembly, + are ignored. + +'-S' + Stop after the stage of compilation proper; do not assemble. The + output is in the form of an assembler code file for each + non-assembler input file specified. + + By default, the assembler file name for a source file is made by + replacing the suffix '.c', '.i', etc., with '.s'. + + Input files that don't require compilation are ignored. + +'-E' + Stop after the preprocessing stage; do not run the compiler proper. + The output is in the form of preprocessed source code, which is + sent to the standard output. + + Input files that don't require preprocessing are ignored. + +'-o FILE' + Place output in file FILE. This applies to whatever sort of output + is being produced, whether it be an executable file, an object + file, an assembler file or preprocessed C code. + + If '-o' is not specified, the default is to put an executable file + in 'a.out', the object file for 'SOURCE.SUFFIX' in 'SOURCE.o', its + assembler file in 'SOURCE.s', a precompiled header file in + 'SOURCE.SUFFIX.gch', and all preprocessed C source on standard + output. + +'-v' + Print (on standard error output) the commands executed to run the + stages of compilation. Also print the version number of the + compiler driver program and of the preprocessor and the compiler + proper. + +'-###' + Like '-v' except the commands are not executed and arguments are + quoted unless they contain only alphanumeric characters or './-_'. + This is useful for shell scripts to capture the driver-generated + command lines. + +'-pipe' + Use pipes rather than temporary files for communication between the + various stages of compilation. This fails to work on some systems + where the assembler is unable to read from a pipe; but the GNU + assembler has no trouble. + +'--help' + Print (on the standard output) a description of the command-line + options understood by 'gcc'. If the '-v' option is also specified + then '--help' is also passed on to the various processes invoked by + 'gcc', so that they can display the command-line options they + accept. If the '-Wextra' option has also been specified (prior to + the '--help' option), then command-line options that have no + documentation associated with them are also displayed. + +'--target-help' + Print (on the standard output) a description of target-specific + command-line options for each tool. For some targets extra + target-specific information may also be printed. + +'--help={CLASS|[^]QUALIFIER}[,...]' + Print (on the standard output) a description of the command-line + options understood by the compiler that fit into all specified + classes and qualifiers. These are the supported classes: + + 'optimizers' + Display all of the optimization options supported by the + compiler. + + 'warnings' + Display all of the options controlling warning messages + produced by the compiler. + + 'target' + Display target-specific options. Unlike the '--target-help' + option however, target-specific options of the linker and + assembler are not displayed. This is because those tools do + not currently support the extended '--help=' syntax. + + 'params' + Display the values recognized by the '--param' option. + + LANGUAGE + Display the options supported for LANGUAGE, where LANGUAGE is + the name of one of the languages supported in this version of + GCC. + + 'common' + Display the options that are common to all languages. + + These are the supported qualifiers: + + 'undocumented' + Display only those options that are undocumented. + + 'joined' + Display options taking an argument that appears after an equal + sign in the same continuous piece of text, such as: + '--help=target'. + + 'separate' + Display options taking an argument that appears as a separate + word following the original option, such as: '-o output-file'. + + Thus for example to display all the undocumented target-specific + switches supported by the compiler, use: + + --help=target,undocumented + + The sense of a qualifier can be inverted by prefixing it with the + '^' character, so for example to display all binary warning options + (i.e., ones that are either on or off and that do not take an + argument) that have a description, use: + + --help=warnings,^joined,^undocumented + + The argument to '--help=' should not consist solely of inverted + qualifiers. + + Combining several classes is possible, although this usually + restricts the output so much that there is nothing to display. One + case where it does work, however, is when one of the classes is + TARGET. For example, to display all the target-specific + optimization options, use: + + --help=target,optimizers + + The '--help=' option can be repeated on the command line. Each + successive use displays its requested class of options, skipping + those that have already been displayed. + + If the '-Q' option appears on the command line before the '--help=' + option, then the descriptive text displayed by '--help=' is + changed. Instead of describing the displayed options, an + indication is given as to whether the option is enabled, disabled + or set to a specific value (assuming that the compiler knows this + at the point where the '--help=' option is used). + + Here is a truncated example from the ARM port of 'gcc': + + % gcc -Q -mabi=2 --help=target -c + The following options are target specific: + -mabi= 2 + -mabort-on-noreturn [disabled] + -mapcs [disabled] + + The output is sensitive to the effects of previous command-line + options, so for example it is possible to find out which + optimizations are enabled at '-O2' by using: + + -Q -O2 --help=optimizers + + Alternatively you can discover which binary optimizations are + enabled by '-O3' by using: + + gcc -c -Q -O3 --help=optimizers > /tmp/O3-opts + gcc -c -Q -O2 --help=optimizers > /tmp/O2-opts + diff /tmp/O2-opts /tmp/O3-opts | grep enabled + +'-no-canonical-prefixes' + Do not expand any symbolic links, resolve references to '/../' or + '/./', or make the path absolute when generating a relative prefix. + +'--version' + Display the version number and copyrights of the invoked GCC. + +'-wrapper' + Invoke all subcommands under a wrapper program. The name of the + wrapper program and its parameters are passed as a comma separated + list. + + gcc -c t.c -wrapper gdb,--args + + This invokes all subprograms of 'gcc' under 'gdb --args', thus the + invocation of 'cc1' is 'gdb --args cc1 ...'. + +'-fplugin=NAME.so' + Load the plugin code in file NAME.so, assumed to be a shared object + to be dlopen'd by the compiler. The base name of the shared object + file is used to identify the plugin for the purposes of argument + parsing (See '-fplugin-arg-NAME-KEY=VALUE' below). Each plugin + should define the callback functions specified in the Plugins API. + +'-fplugin-arg-NAME-KEY=VALUE' + Define an argument called KEY with a value of VALUE for the plugin + called NAME. + +'-fdump-ada-spec[-slim]' + For C and C++ source and include files, generate corresponding Ada + specs. *Note (gnat_ugn)Generating Ada Bindings for C and C++ + headers::, which provides detailed documentation on this feature. + +'-fada-spec-parent=UNIT' + In conjunction with '-fdump-ada-spec[-slim]' above, generate Ada + specs as child units of parent UNIT. + +'-fdump-go-spec=FILE' + For input files in any language, generate corresponding Go + declarations in FILE. This generates Go 'const', 'type', 'var', + and 'func' declarations which may be a useful way to start writing + a Go interface to code written in some other language. + +'@FILE' + Read command-line options from FILE. The options read are inserted + in place of the original @FILE option. If FILE does not exist, or + cannot be read, then the option will be treated literally, and not + removed. + + Options in FILE are separated by whitespace. A whitespace + character may be included in an option by surrounding the entire + option in either single or double quotes. Any character (including + a backslash) may be included by prefixing the character to be + included with a backslash. The FILE may itself contain additional + @FILE options; any such options will be processed recursively. + + +File: gcc.info, Node: Invoking G++, Next: C Dialect Options, Prev: Overall Options, Up: Invoking GCC + +3.3 Compiling C++ Programs +========================== + +C++ source files conventionally use one of the suffixes '.C', '.cc', +'.cpp', '.CPP', '.c++', '.cp', or '.cxx'; C++ header files often use +'.hh', '.hpp', '.H', or (for shared template code) '.tcc'; and +preprocessed C++ files use the suffix '.ii'. GCC recognizes files with +these names and compiles them as C++ programs even if you call the +compiler the same way as for compiling C programs (usually with the name +'gcc'). + + However, the use of 'gcc' does not add the C++ library. 'g++' is a +program that calls GCC and automatically specifies linking against the +C++ library. It treats '.c', '.h' and '.i' files as C++ source files +instead of C source files unless '-x' is used. This program is also +useful when precompiling a C header file with a '.h' extension for use +in C++ compilations. On many systems, 'g++' is also installed with the +name 'c++'. + + When you compile C++ programs, you may specify many of the same +command-line options that you use for compiling programs in any +language; or command-line options meaningful for C and related +languages; or options that are meaningful only for C++ programs. *Note +Options Controlling C Dialect: C Dialect Options, for explanations of +options for languages related to C. *Note Options Controlling C++ +Dialect: C++ Dialect Options, for explanations of options that are +meaningful only for C++ programs. + + +File: gcc.info, Node: C Dialect Options, Next: C++ Dialect Options, Prev: Invoking G++, Up: Invoking GCC + +3.4 Options Controlling C Dialect +================================= + +The following options control the dialect of C (or languages derived +from C, such as C++, Objective-C and Objective-C++) that the compiler +accepts: + +'-ansi' + In C mode, this is equivalent to '-std=c90'. In C++ mode, it is + equivalent to '-std=c++98'. + + This turns off certain features of GCC that are incompatible with + ISO C90 (when compiling C code), or of standard C++ (when compiling + C++ code), such as the 'asm' and 'typeof' keywords, and predefined + macros such as 'unix' and 'vax' that identify the type of system + you are using. It also enables the undesirable and rarely used ISO + trigraph feature. For the C compiler, it disables recognition of + C++ style '//' comments as well as the 'inline' keyword. + + The alternate keywords '__asm__', '__extension__', '__inline__' and + '__typeof__' continue to work despite '-ansi'. You would not want + to use them in an ISO C program, of course, but it is useful to put + them in header files that might be included in compilations done + with '-ansi'. Alternate predefined macros such as '__unix__' and + '__vax__' are also available, with or without '-ansi'. + + The '-ansi' option does not cause non-ISO programs to be rejected + gratuitously. For that, '-Wpedantic' is required in addition to + '-ansi'. *Note Warning Options::. + + The macro '__STRICT_ANSI__' is predefined when the '-ansi' option + is used. Some header files may notice this macro and refrain from + declaring certain functions or defining certain macros that the ISO + standard doesn't call for; this is to avoid interfering with any + programs that might use these names for other things. + + Functions that are normally built in but do not have semantics + defined by ISO C (such as 'alloca' and 'ffs') are not built-in + functions when '-ansi' is used. *Note Other built-in functions + provided by GCC: Other Builtins, for details of the functions + affected. + +'-std=' + Determine the language standard. *Note Language Standards + Supported by GCC: Standards, for details of these standard + versions. This option is currently only supported when compiling C + or C++. + + The compiler can accept several base standards, such as 'c90' or + 'c++98', and GNU dialects of those standards, such as 'gnu90' or + 'gnu++98'. When a base standard is specified, the compiler accepts + all programs following that standard plus those using GNU + extensions that do not contradict it. For example, '-std=c90' + turns off certain features of GCC that are incompatible with ISO + C90, such as the 'asm' and 'typeof' keywords, but not other GNU + extensions that do not have a meaning in ISO C90, such as omitting + the middle term of a '?:' expression. On the other hand, when a + GNU dialect of a standard is specified, all features supported by + the compiler are enabled, even when those features change the + meaning of the base standard. As a result, some strict-conforming + programs may be rejected. The particular standard is used by + '-Wpedantic' to identify which features are GNU extensions given + that version of the standard. For example '-std=gnu90 -Wpedantic' + warns about C++ style '//' comments, while '-std=gnu99 -Wpedantic' + does not. + + A value for this option must be provided; possible values are + + 'c90' + 'c89' + 'iso9899:1990' + Support all ISO C90 programs (certain GNU extensions that + conflict with ISO C90 are disabled). Same as '-ansi' for C + code. + + 'iso9899:199409' + ISO C90 as modified in amendment 1. + + 'c99' + 'c9x' + 'iso9899:1999' + 'iso9899:199x' + ISO C99. This standard is substantially completely supported, + modulo bugs, extended identifiers (supported except for corner + cases when '-fextended-identifiers' is used) and + floating-point issues (mainly but not entirely relating to + optional C99 features from Annexes F and G). See <http://gcc.gnu.org/c99status.html> + for more information. The names 'c9x' and 'iso9899:199x' are + deprecated. + + 'c11' + 'c1x' + 'iso9899:2011' + ISO C11, the 2011 revision of the ISO C standard. This + standard is substantially completely supported, modulo bugs, + extended identifiers (supported except for corner cases when + '-fextended-identifiers' is used), floating-point issues + (mainly but not entirely relating to optional C11 features + from Annexes F and G) and the optional Annexes K + (Bounds-checking interfaces) and L (Analyzability). The name + 'c1x' is deprecated. + + 'gnu90' + 'gnu89' + GNU dialect of ISO C90 (including some C99 features). This is + the default for C code. + + 'gnu99' + 'gnu9x' + GNU dialect of ISO C99. The name 'gnu9x' is deprecated. + + 'gnu11' + 'gnu1x' + GNU dialect of ISO C11. This is intended to become the + default in a future release of GCC. The name 'gnu1x' is + deprecated. + + 'c++98' + 'c++03' + The 1998 ISO C++ standard plus the 2003 technical corrigendum + and some additional defect reports. Same as '-ansi' for C++ + code. + + 'gnu++98' + 'gnu++03' + GNU dialect of '-std=c++98'. This is the default for C++ + code. + + 'c++11' + 'c++0x' + The 2011 ISO C++ standard plus amendments. The name 'c++0x' + is deprecated. + + 'gnu++11' + 'gnu++0x' + GNU dialect of '-std=c++11'. The name 'gnu++0x' is + deprecated. + + 'c++1y' + The next revision of the ISO C++ standard, tentatively planned + for 2014. Support is highly experimental, and will almost + certainly change in incompatible ways in future releases. + + 'gnu++1y' + GNU dialect of '-std=c++1y'. Support is highly experimental, + and will almost certainly change in incompatible ways in + future releases. + +'-fgnu89-inline' + The option '-fgnu89-inline' tells GCC to use the traditional GNU + semantics for 'inline' functions when in C99 mode. *Note An Inline + Function is As Fast As a Macro: Inline. This option is accepted + and ignored by GCC versions 4.1.3 up to but not including 4.3. In + GCC versions 4.3 and later it changes the behavior of GCC in C99 + mode. Using this option is roughly equivalent to adding the + 'gnu_inline' function attribute to all inline functions (*note + Function Attributes::). + + The option '-fno-gnu89-inline' explicitly tells GCC to use the C99 + semantics for 'inline' when in C99 or gnu99 mode (i.e., it + specifies the default behavior). This option was first supported + in GCC 4.3. This option is not supported in '-std=c90' or + '-std=gnu90' mode. + + The preprocessor macros '__GNUC_GNU_INLINE__' and + '__GNUC_STDC_INLINE__' may be used to check which semantics are in + effect for 'inline' functions. *Note (cpp)Common Predefined + Macros::. + +'-aux-info FILENAME' + Output to the given filename prototyped declarations for all + functions declared and/or defined in a translation unit, including + those in header files. This option is silently ignored in any + language other than C. + + Besides declarations, the file indicates, in comments, the origin + of each declaration (source file and line), whether the declaration + was implicit, prototyped or unprototyped ('I', 'N' for new or 'O' + for old, respectively, in the first character after the line number + and the colon), and whether it came from a declaration or a + definition ('C' or 'F', respectively, in the following character). + In the case of function definitions, a K&R-style list of arguments + followed by their declarations is also provided, inside comments, + after the declaration. + +'-fallow-parameterless-variadic-functions' + Accept variadic functions without named parameters. + + Although it is possible to define such a function, this is not very + useful as it is not possible to read the arguments. This is only + supported for C as this construct is allowed by C++. + +'-fno-asm' + Do not recognize 'asm', 'inline' or 'typeof' as a keyword, so that + code can use these words as identifiers. You can use the keywords + '__asm__', '__inline__' and '__typeof__' instead. '-ansi' implies + '-fno-asm'. + + In C++, this switch only affects the 'typeof' keyword, since 'asm' + and 'inline' are standard keywords. You may want to use the + '-fno-gnu-keywords' flag instead, which has the same effect. In + C99 mode ('-std=c99' or '-std=gnu99'), this switch only affects the + 'asm' and 'typeof' keywords, since 'inline' is a standard keyword + in ISO C99. + +'-fno-builtin' +'-fno-builtin-FUNCTION' + Don't recognize built-in functions that do not begin with + '__builtin_' as prefix. *Note Other built-in functions provided by + GCC: Other Builtins, for details of the functions affected, + including those which are not built-in functions when '-ansi' or + '-std' options for strict ISO C conformance are used because they + do not have an ISO standard meaning. + + GCC normally generates special code to handle certain built-in + functions more efficiently; for instance, calls to 'alloca' may + become single instructions which adjust the stack directly, and + calls to 'memcpy' may become inline copy loops. The resulting code + is often both smaller and faster, but since the function calls no + longer appear as such, you cannot set a breakpoint on those calls, + nor can you change the behavior of the functions by linking with a + different library. In addition, when a function is recognized as a + built-in function, GCC may use information about that function to + warn about problems with calls to that function, or to generate + more efficient code, even if the resulting code still contains + calls to that function. For example, warnings are given with + '-Wformat' for bad calls to 'printf' when 'printf' is built in and + 'strlen' is known not to modify global memory. + + With the '-fno-builtin-FUNCTION' option only the built-in function + FUNCTION is disabled. FUNCTION must not begin with '__builtin_'. + If a function is named that is not built-in in this version of GCC, + this option is ignored. There is no corresponding + '-fbuiltin-FUNCTION' option; if you wish to enable built-in + functions selectively when using '-fno-builtin' or + '-ffreestanding', you may define macros such as: + + #define abs(n) __builtin_abs ((n)) + #define strcpy(d, s) __builtin_strcpy ((d), (s)) + +'-fhosted' + + Assert that compilation targets a hosted environment. This implies + '-fbuiltin'. A hosted environment is one in which the entire + standard library is available, and in which 'main' has a return + type of 'int'. Examples are nearly everything except a kernel. + This is equivalent to '-fno-freestanding'. + +'-ffreestanding' + + Assert that compilation targets a freestanding environment. This + implies '-fno-builtin'. A freestanding environment is one in which + the standard library may not exist, and program startup may not + necessarily be at 'main'. The most obvious example is an OS + kernel. This is equivalent to '-fno-hosted'. + + *Note Language Standards Supported by GCC: Standards, for details + of freestanding and hosted environments. + +'-fopenmp' + Enable handling of OpenMP directives '#pragma omp' in C/C++ and + '!$omp' in Fortran. When '-fopenmp' is specified, the compiler + generates parallel code according to the OpenMP Application Program + Interface v4.0 <http://www.openmp.org/>. This option implies + '-pthread', and thus is only supported on targets that have support + for '-pthread'. '-fopenmp' implies '-fopenmp-simd'. + +'-fopenmp-simd' + Enable handling of OpenMP's SIMD directives with '#pragma omp' in + C/C++ and '!$omp' in Fortran. Other OpenMP directives are ignored. + +'-fcilkplus' + Enable the usage of Cilk Plus language extension features for + C/C++. When the option '-fcilkplus' is specified, enable the usage + of the Cilk Plus Language extension features for C/C++. The + present implementation follows ABI version 1.2. This is an + experimental feature that is only partially complete, and whose + interface may change in future versions of GCC as the official + specification changes. Currently, all features but '_Cilk_for' + have been implemented. + +'-fgnu-tm' + When the option '-fgnu-tm' is specified, the compiler generates + code for the Linux variant of Intel's current Transactional Memory + ABI specification document (Revision 1.1, May 6 2009). This is an + experimental feature whose interface may change in future versions + of GCC, as the official specification changes. Please note that + not all architectures are supported for this feature. + + For more information on GCC's support for transactional memory, + *Note The GNU Transactional Memory Library: (libitm)Enabling + libitm. + + Note that the transactional memory feature is not supported with + non-call exceptions ('-fnon-call-exceptions'). + +'-fms-extensions' + Accept some non-standard constructs used in Microsoft header files. + + In C++ code, this allows member names in structures to be similar + to previous types declarations. + + typedef int UOW; + struct ABC { + UOW UOW; + }; + + Some cases of unnamed fields in structures and unions are only + accepted with this option. *Note Unnamed struct/union fields + within structs/unions: Unnamed Fields, for details. + + Note that this option is off for all targets but i?86 and x86_64 + targets using ms-abi. +'-fplan9-extensions' + Accept some non-standard constructs used in Plan 9 code. + + This enables '-fms-extensions', permits passing pointers to + structures with anonymous fields to functions that expect pointers + to elements of the type of the field, and permits referring to + anonymous fields declared using a typedef. *Note Unnamed + struct/union fields within structs/unions: Unnamed Fields, for + details. This is only supported for C, not C++. + +'-trigraphs' + Support ISO C trigraphs. The '-ansi' option (and '-std' options + for strict ISO C conformance) implies '-trigraphs'. + +'-traditional' +'-traditional-cpp' + Formerly, these options caused GCC to attempt to emulate a + pre-standard C compiler. They are now only supported with the '-E' + switch. The preprocessor continues to support a pre-standard mode. + See the GNU CPP manual for details. + +'-fcond-mismatch' + Allow conditional expressions with mismatched types in the second + and third arguments. The value of such an expression is void. + This option is not supported for C++. + +'-flax-vector-conversions' + Allow implicit conversions between vectors with differing numbers + of elements and/or incompatible element types. This option should + not be used for new code. + +'-funsigned-char' + Let the type 'char' be unsigned, like 'unsigned char'. + + Each kind of machine has a default for what 'char' should be. It + is either like 'unsigned char' by default or like 'signed char' by + default. + + Ideally, a portable program should always use 'signed char' or + 'unsigned char' when it depends on the signedness of an object. + But many programs have been written to use plain 'char' and expect + it to be signed, or expect it to be unsigned, depending on the + machines they were written for. This option, and its inverse, let + you make such a program work with the opposite default. + + The type 'char' is always a distinct type from each of 'signed + char' or 'unsigned char', even though its behavior is always just + like one of those two. + +'-fsigned-char' + Let the type 'char' be signed, like 'signed char'. + + Note that this is equivalent to '-fno-unsigned-char', which is the + negative form of '-funsigned-char'. Likewise, the option + '-fno-signed-char' is equivalent to '-funsigned-char'. + +'-fsigned-bitfields' +'-funsigned-bitfields' +'-fno-signed-bitfields' +'-fno-unsigned-bitfields' + These options control whether a bit-field is signed or unsigned, + when the declaration does not use either 'signed' or 'unsigned'. + By default, such a bit-field is signed, because this is consistent: + the basic integer types such as 'int' are signed types. + + +File: gcc.info, Node: C++ Dialect Options, Next: Objective-C and Objective-C++ Dialect Options, Prev: C Dialect Options, Up: Invoking GCC + +3.5 Options Controlling C++ Dialect +=================================== + +This section describes the command-line options that are only meaningful +for C++ programs. You can also use most of the GNU compiler options +regardless of what language your program is in. For example, you might +compile a file 'firstClass.C' like this: + + g++ -g -frepo -O -c firstClass.C + +In this example, only '-frepo' is an option meant only for C++ programs; +you can use the other options with any language supported by GCC. + + Here is a list of options that are _only_ for compiling C++ programs: + +'-fabi-version=N' + Use version N of the C++ ABI. The default is version 2. + + Version 0 refers to the version conforming most closely to the C++ + ABI specification. Therefore, the ABI obtained using version 0 + will change in different versions of G++ as ABI bugs are fixed. + + Version 1 is the version of the C++ ABI that first appeared in G++ + 3.2. + + Version 2 is the version of the C++ ABI that first appeared in G++ + 3.4. + + Version 3 corrects an error in mangling a constant address as a + template argument. + + Version 4, which first appeared in G++ 4.5, implements a standard + mangling for vector types. + + Version 5, which first appeared in G++ 4.6, corrects the mangling + of attribute const/volatile on function pointer types, decltype of + a plain decl, and use of a function parameter in the declaration of + another parameter. + + Version 6, which first appeared in G++ 4.7, corrects the promotion + behavior of C++11 scoped enums and the mangling of template + argument packs, const/static_cast, prefix ++ and -, and a class + scope function used as a template argument. + + See also '-Wabi'. + +'-fno-access-control' + Turn off all access checking. This switch is mainly useful for + working around bugs in the access control code. + +'-fcheck-new' + Check that the pointer returned by 'operator new' is non-null + before attempting to modify the storage allocated. This check is + normally unnecessary because the C++ standard specifies that + 'operator new' only returns '0' if it is declared 'throw()', in + which case the compiler always checks the return value even without + this option. In all other cases, when 'operator new' has a + non-empty exception specification, memory exhaustion is signalled + by throwing 'std::bad_alloc'. See also 'new (nothrow)'. + +'-fconstexpr-depth=N' + Set the maximum nested evaluation depth for C++11 constexpr + functions to N. A limit is needed to detect endless recursion + during constant expression evaluation. The minimum specified by + the standard is 512. + +'-fdeduce-init-list' + Enable deduction of a template type parameter as + 'std::initializer_list' from a brace-enclosed initializer list, + i.e. + + template <class T> auto forward(T t) -> decltype (realfn (t)) + { + return realfn (t); + } + + void f() + { + forward({1,2}); // call forward<std::initializer_list<int>> + } + + This deduction was implemented as a possible extension to the + originally proposed semantics for the C++11 standard, but was not + part of the final standard, so it is disabled by default. This + option is deprecated, and may be removed in a future version of + G++. + +'-ffriend-injection' + Inject friend functions into the enclosing namespace, so that they + are visible outside the scope of the class in which they are + declared. Friend functions were documented to work this way in the + old Annotated C++ Reference Manual, and versions of G++ before 4.1 + always worked that way. However, in ISO C++ a friend function that + is not declared in an enclosing scope can only be found using + argument dependent lookup. This option causes friends to be + injected as they were in earlier releases. + + This option is for compatibility, and may be removed in a future + release of G++. + +'-fno-elide-constructors' + The C++ standard allows an implementation to omit creating a + temporary that is only used to initialize another object of the + same type. Specifying this option disables that optimization, and + forces G++ to call the copy constructor in all cases. + +'-fno-enforce-eh-specs' + Don't generate code to check for violation of exception + specifications at run time. This option violates the C++ standard, + but may be useful for reducing code size in production builds, much + like defining 'NDEBUG'. This does not give user code permission to + throw exceptions in violation of the exception specifications; the + compiler still optimizes based on the specifications, so throwing + an unexpected exception results in undefined behavior at run time. + +'-fextern-tls-init' +'-fno-extern-tls-init' + The C++11 and OpenMP standards allow 'thread_local' and + 'threadprivate' variables to have dynamic (runtime) initialization. + To support this, any use of such a variable goes through a wrapper + function that performs any necessary initialization. When the use + and definition of the variable are in the same translation unit, + this overhead can be optimized away, but when the use is in a + different translation unit there is significant overhead even if + the variable doesn't actually need dynamic initialization. If the + programmer can be sure that no use of the variable in a + non-defining TU needs to trigger dynamic initialization (either + because the variable is statically initialized, or a use of the + variable in the defining TU will be executed before any uses in + another TU), they can avoid this overhead with the + '-fno-extern-tls-init' option. + + On targets that support symbol aliases, the default is + '-fextern-tls-init'. On targets that do not support symbol + aliases, the default is '-fno-extern-tls-init'. + +'-ffor-scope' +'-fno-for-scope' + If '-ffor-scope' is specified, the scope of variables declared in a + for-init-statement is limited to the 'for' loop itself, as + specified by the C++ standard. If '-fno-for-scope' is specified, + the scope of variables declared in a for-init-statement extends to + the end of the enclosing scope, as was the case in old versions of + G++, and other (traditional) implementations of C++. + + If neither flag is given, the default is to follow the standard, + but to allow and give a warning for old-style code that would + otherwise be invalid, or have different behavior. + +'-fno-gnu-keywords' + Do not recognize 'typeof' as a keyword, so that code can use this + word as an identifier. You can use the keyword '__typeof__' + instead. '-ansi' implies '-fno-gnu-keywords'. + +'-fno-implicit-templates' + Never emit code for non-inline templates that are instantiated + implicitly (i.e. by use); only emit code for explicit + instantiations. *Note Template Instantiation::, for more + information. + +'-fno-implicit-inline-templates' + Don't emit code for implicit instantiations of inline templates, + either. The default is to handle inlines differently so that + compiles with and without optimization need the same set of + explicit instantiations. + +'-fno-implement-inlines' + To save space, do not emit out-of-line copies of inline functions + controlled by '#pragma implementation'. This causes linker errors + if these functions are not inlined everywhere they are called. + +'-fms-extensions' + Disable Wpedantic warnings about constructs used in MFC, such as + implicit int and getting a pointer to member function via + non-standard syntax. + +'-fno-nonansi-builtins' + Disable built-in declarations of functions that are not mandated by + ANSI/ISO C. These include 'ffs', 'alloca', '_exit', 'index', + 'bzero', 'conjf', and other related functions. + +'-fnothrow-opt' + Treat a 'throw()' exception specification as if it were a + 'noexcept' specification to reduce or eliminate the text size + overhead relative to a function with no exception specification. + If the function has local variables of types with non-trivial + destructors, the exception specification actually makes the + function smaller because the EH cleanups for those variables can be + optimized away. The semantic effect is that an exception thrown + out of a function with such an exception specification results in a + call to 'terminate' rather than 'unexpected'. + +'-fno-operator-names' + Do not treat the operator name keywords 'and', 'bitand', 'bitor', + 'compl', 'not', 'or' and 'xor' as synonyms as keywords. + +'-fno-optional-diags' + Disable diagnostics that the standard says a compiler does not need + to issue. Currently, the only such diagnostic issued by G++ is the + one for a name having multiple meanings within a class. + +'-fpermissive' + Downgrade some diagnostics about nonconformant code from errors to + warnings. Thus, using '-fpermissive' allows some nonconforming + code to compile. + +'-fno-pretty-templates' + When an error message refers to a specialization of a function + template, the compiler normally prints the signature of the + template followed by the template arguments and any typedefs or + typenames in the signature (e.g. 'void f(T) [with T = int]' rather + than 'void f(int)') so that it's clear which template is involved. + When an error message refers to a specialization of a class + template, the compiler omits any template arguments that match the + default template arguments for that template. If either of these + behaviors make it harder to understand the error message rather + than easier, you can use '-fno-pretty-templates' to disable them. + +'-frepo' + Enable automatic template instantiation at link time. This option + also implies '-fno-implicit-templates'. *Note Template + Instantiation::, for more information. + +'-fno-rtti' + Disable generation of information about every class with virtual + functions for use by the C++ run-time type identification features + ('dynamic_cast' and 'typeid'). If you don't use those parts of the + language, you can save some space by using this flag. Note that + exception handling uses the same information, but G++ generates it + as needed. The 'dynamic_cast' operator can still be used for casts + that do not require run-time type information, i.e. casts to 'void + *' or to unambiguous base classes. + +'-fstats' + Emit statistics about front-end processing at the end of the + compilation. This information is generally only useful to the G++ + development team. + +'-fstrict-enums' + Allow the compiler to optimize using the assumption that a value of + enumerated type can only be one of the values of the enumeration + (as defined in the C++ standard; basically, a value that can be + represented in the minimum number of bits needed to represent all + the enumerators). This assumption may not be valid if the program + uses a cast to convert an arbitrary integer value to the enumerated + type. + +'-ftemplate-backtrace-limit=N' + Set the maximum number of template instantiation notes for a single + warning or error to N. The default value is 10. + +'-ftemplate-depth=N' + Set the maximum instantiation depth for template classes to N. A + limit on the template instantiation depth is needed to detect + endless recursions during template class instantiation. ANSI/ISO + C++ conforming programs must not rely on a maximum depth greater + than 17 (changed to 1024 in C++11). The default value is 900, as + the compiler can run out of stack space before hitting 1024 in some + situations. + +'-fno-threadsafe-statics' + Do not emit the extra code to use the routines specified in the C++ + ABI for thread-safe initialization of local statics. You can use + this option to reduce code size slightly in code that doesn't need + to be thread-safe. + +'-fuse-cxa-atexit' + Register destructors for objects with static storage duration with + the '__cxa_atexit' function rather than the 'atexit' function. + This option is required for fully standards-compliant handling of + static destructors, but only works if your C library supports + '__cxa_atexit'. + +'-fno-use-cxa-get-exception-ptr' + Don't use the '__cxa_get_exception_ptr' runtime routine. This + causes 'std::uncaught_exception' to be incorrect, but is necessary + if the runtime routine is not available. + +'-fvisibility-inlines-hidden' + This switch declares that the user does not attempt to compare + pointers to inline functions or methods where the addresses of the + two functions are taken in different shared objects. + + The effect of this is that GCC may, effectively, mark inline + methods with '__attribute__ ((visibility ("hidden")))' so that they + do not appear in the export table of a DSO and do not require a PLT + indirection when used within the DSO. Enabling this option can + have a dramatic effect on load and link times of a DSO as it + massively reduces the size of the dynamic export table when the + library makes heavy use of templates. + + The behavior of this switch is not quite the same as marking the + methods as hidden directly, because it does not affect static + variables local to the function or cause the compiler to deduce + that the function is defined in only one shared object. + + You may mark a method as having a visibility explicitly to negate + the effect of the switch for that method. For example, if you do + want to compare pointers to a particular inline method, you might + mark it as having default visibility. Marking the enclosing class + with explicit visibility has no effect. + + Explicitly instantiated inline methods are unaffected by this + option as their linkage might otherwise cross a shared library + boundary. *Note Template Instantiation::. + +'-fvisibility-ms-compat' + This flag attempts to use visibility settings to make GCC's C++ + linkage model compatible with that of Microsoft Visual Studio. + + The flag makes these changes to GCC's linkage model: + + 1. It sets the default visibility to 'hidden', like + '-fvisibility=hidden'. + + 2. Types, but not their members, are not hidden by default. + + 3. The One Definition Rule is relaxed for types without explicit + visibility specifications that are defined in more than one + shared object: those declarations are permitted if they are + permitted when this option is not used. + + In new code it is better to use '-fvisibility=hidden' and export + those classes that are intended to be externally visible. + Unfortunately it is possible for code to rely, perhaps + accidentally, on the Visual Studio behavior. + + Among the consequences of these changes are that static data + members of the same type with the same name but defined in + different shared objects are different, so changing one does not + change the other; and that pointers to function members defined in + different shared objects may not compare equal. When this flag is + given, it is a violation of the ODR to define types with the same + name differently. + +'-fvtable-verify=STD|PREINIT|NONE' + Turn on (or off, if using '-fvtable-verify=none') the security + feature that verifies at runtime, for every virtual call that is + made, that the vtable pointer through which the call is made is + valid for the type of the object, and has not been corrupted or + overwritten. If an invalid vtable pointer is detected (at + runtime), an error is reported and execution of the program is + immediately halted. + + This option causes runtime data structures to be built, at program + start up, for verifying the vtable pointers. The options 'std' and + 'preinit' control the timing of when these data structures are + built. In both cases the data structures are built before + execution reaches 'main'. The '-fvtable-verify=std' causes these + data structure to be built after the shared libraries have been + loaded and initialized. '-fvtable-verify=preinit' causes them to + be built before the shared libraries have been loaded and + initialized. + + If this option appears multiple times in the compiler line, with + different values specified, 'none' will take highest priority over + both 'std' and 'preinit'; 'preinit' will take priority over 'std'. + +'-fvtv-debug' + Causes debug versions of the runtime functions for the vtable + verification feature to be called. This assumes the + '-fvtable-verify=std' or '-fvtable-verify=preinit' has been used. + This flag will also cause the compiler to keep track of which + vtable pointers it found for each class, and record that + information in the file "vtv_set_ptr_data.log", in the dump file + directory on the user's machine. + + Note: This feature APPENDS data to the log file. If you want a + fresh log file, be sure to delete any existing one. + +'-fvtv-counts' + This is a debugging flag. When used in conjunction with + '-fvtable-verify=std' or '-fvtable-verify=preinit', this causes the + compiler to keep track of the total number of virtual calls it + encountered and the number of verifications it inserted. It also + counts the number of calls to certain runtime library functions + that it inserts. This information, for each compilation unit, is + written to a file named "vtv_count_data.log", in the dump_file + directory on the user's machine. It also counts the size of the + vtable pointer sets for each class, and writes this information to + "vtv_class_set_sizes.log" in the same directory. + + Note: This feature APPENDS data to the log files. To get a fresh + log files, be sure to delete any existing ones. + +'-fno-weak' + Do not use weak symbol support, even if it is provided by the + linker. By default, G++ uses weak symbols if they are available. + This option exists only for testing, and should not be used by + end-users; it results in inferior code and has no benefits. This + option may be removed in a future release of G++. + +'-nostdinc++' + Do not search for header files in the standard directories specific + to C++, but do still search the other standard directories. (This + option is used when building the C++ library.) + + In addition, these optimization, warning, and code generation options +have meanings only for C++ programs: + +'-Wabi (C, Objective-C, C++ and Objective-C++ only)' + Warn when G++ generates code that is probably not compatible with + the vendor-neutral C++ ABI. Although an effort has been made to + warn about all such cases, there are probably some cases that are + not warned about, even though G++ is generating incompatible code. + There may also be cases where warnings are emitted even though the + code that is generated is compatible. + + You should rewrite your code to avoid these warnings if you are + concerned about the fact that code generated by G++ may not be + binary compatible with code generated by other compilers. + + The known incompatibilities in '-fabi-version=2' (the default) + include: + + * A template with a non-type template parameter of reference + type is mangled incorrectly: + extern int N; + template <int &> struct S {}; + void n (S<N>) {2} + + This is fixed in '-fabi-version=3'. + + * SIMD vector types declared using '__attribute ((vector_size))' + are mangled in a non-standard way that does not allow for + overloading of functions taking vectors of different sizes. + + The mangling is changed in '-fabi-version=4'. + + The known incompatibilities in '-fabi-version=1' include: + + * Incorrect handling of tail-padding for bit-fields. G++ may + attempt to pack data into the same byte as a base class. For + example: + + struct A { virtual void f(); int f1 : 1; }; + struct B : public A { int f2 : 1; }; + + In this case, G++ places 'B::f2' into the same byte as + 'A::f1'; other compilers do not. You can avoid this problem + by explicitly padding 'A' so that its size is a multiple of + the byte size on your platform; that causes G++ and other + compilers to lay out 'B' identically. + + * Incorrect handling of tail-padding for virtual bases. G++ + does not use tail padding when laying out virtual bases. For + example: + + struct A { virtual void f(); char c1; }; + struct B { B(); char c2; }; + struct C : public A, public virtual B {}; + + In this case, G++ does not place 'B' into the tail-padding for + 'A'; other compilers do. You can avoid this problem by + explicitly padding 'A' so that its size is a multiple of its + alignment (ignoring virtual base classes); that causes G++ and + other compilers to lay out 'C' identically. + + * Incorrect handling of bit-fields with declared widths greater + than that of their underlying types, when the bit-fields + appear in a union. For example: + + union U { int i : 4096; }; + + Assuming that an 'int' does not have 4096 bits, G++ makes the + union too small by the number of bits in an 'int'. + + * Empty classes can be placed at incorrect offsets. For + example: + + struct A {}; + + struct B { + A a; + virtual void f (); + }; + + struct C : public B, public A {}; + + G++ places the 'A' base class of 'C' at a nonzero offset; it + should be placed at offset zero. G++ mistakenly believes that + the 'A' data member of 'B' is already at offset zero. + + * Names of template functions whose types involve 'typename' or + template template parameters can be mangled incorrectly. + + template <typename Q> + void f(typename Q::X) {} + + template <template <typename> class Q> + void f(typename Q<int>::X) {} + + Instantiations of these templates may be mangled incorrectly. + + It also warns about psABI-related changes. The known psABI changes + at this point include: + + * For SysV/x86-64, unions with 'long double' members are passed + in memory as specified in psABI. For example: + + union U { + long double ld; + int i; + }; + + 'union U' is always passed in memory. + +'-Wctor-dtor-privacy (C++ and Objective-C++ only)' + Warn when a class seems unusable because all the constructors or + destructors in that class are private, and it has neither friends + nor public static member functions. Also warn if there are no + non-private methods, and there's at least one private member + function that isn't a constructor or destructor. + +'-Wdelete-non-virtual-dtor (C++ and Objective-C++ only)' + Warn when 'delete' is used to destroy an instance of a class that + has virtual functions and non-virtual destructor. It is unsafe to + delete an instance of a derived class through a pointer to a base + class if the base class does not have a virtual destructor. This + warning is enabled by '-Wall'. + +'-Wliteral-suffix (C++ and Objective-C++ only)' + Warn when a string or character literal is followed by a ud-suffix + which does not begin with an underscore. As a conforming + extension, GCC treats such suffixes as separate preprocessing + tokens in order to maintain backwards compatibility with code that + uses formatting macros from '<inttypes.h>'. For example: + + #define __STDC_FORMAT_MACROS + #include <inttypes.h> + #include <stdio.h> + + int main() { + int64_t i64 = 123; + printf("My int64: %"PRId64"\n", i64); + } + + In this case, 'PRId64' is treated as a separate preprocessing + token. + + This warning is enabled by default. + +'-Wnarrowing (C++ and Objective-C++ only)' + Warn when a narrowing conversion prohibited by C++11 occurs within + '{ }', e.g. + + int i = { 2.2 }; // error: narrowing from double to int + + This flag is included in '-Wall' and '-Wc++11-compat'. + + With '-std=c++11', '-Wno-narrowing' suppresses the diagnostic + required by the standard. Note that this does not affect the + meaning of well-formed code; narrowing conversions are still + considered ill-formed in SFINAE context. + +'-Wnoexcept (C++ and Objective-C++ only)' + Warn when a noexcept-expression evaluates to false because of a + call to a function that does not have a non-throwing exception + specification (i.e. 'throw()' or 'noexcept') but is known by the + compiler to never throw an exception. + +'-Wnon-virtual-dtor (C++ and Objective-C++ only)' + Warn when a class has virtual functions and an accessible + non-virtual destructor itself or in an accessible polymorphic base + class, in which case it is possible but unsafe to delete an + instance of a derived class through a pointer to the class itself + or base class. This warning is automatically enabled if '-Weffc++' + is specified. + +'-Wreorder (C++ and Objective-C++ only)' + Warn when the order of member initializers given in the code does + not match the order in which they must be executed. For instance: + + struct A { + int i; + int j; + A(): j (0), i (1) { } + }; + + The compiler rearranges the member initializers for 'i' and 'j' to + match the declaration order of the members, emitting a warning to + that effect. This warning is enabled by '-Wall'. + +'-fext-numeric-literals (C++ and Objective-C++ only)' + Accept imaginary, fixed-point, or machine-defined literal number + suffixes as GNU extensions. When this option is turned off these + suffixes are treated as C++11 user-defined literal numeric + suffixes. This is on by default for all pre-C++11 dialects and all + GNU dialects: '-std=c++98', '-std=gnu++98', '-std=gnu++11', + '-std=gnu++1y'. This option is off by default for ISO C++11 + onwards ('-std=c++11', ...). + + The following '-W...' options are not affected by '-Wall'. + +'-Weffc++ (C++ and Objective-C++ only)' + Warn about violations of the following style guidelines from Scott + Meyers' 'Effective C++' series of books: + + * Define a copy constructor and an assignment operator for + classes with dynamically-allocated memory. + + * Prefer initialization to assignment in constructors. + + * Have 'operator=' return a reference to '*this'. + + * Don't try to return a reference when you must return an + object. + + * Distinguish between prefix and postfix forms of increment and + decrement operators. + + * Never overload '&&', '||', or ','. + + This option also enables '-Wnon-virtual-dtor', which is also one of + the effective C++ recommendations. However, the check is extended + to warn about the lack of virtual destructor in accessible + non-polymorphic bases classes too. + + When selecting this option, be aware that the standard library + headers do not obey all of these guidelines; use 'grep -v' to + filter out those warnings. + +'-Wstrict-null-sentinel (C++ and Objective-C++ only)' + Warn about the use of an uncasted 'NULL' as sentinel. When + compiling only with GCC this is a valid sentinel, as 'NULL' is + defined to '__null'. Although it is a null pointer constant rather + than a null pointer, it is guaranteed to be of the same size as a + pointer. But this use is not portable across different compilers. + +'-Wno-non-template-friend (C++ and Objective-C++ only)' + Disable warnings when non-templatized friend functions are declared + within a template. Since the advent of explicit template + specification support in G++, if the name of the friend is an + unqualified-id (i.e., 'friend foo(int)'), the C++ language + specification demands that the friend declare or define an + ordinary, nontemplate function. (Section 14.5.3). Before G++ + implemented explicit specification, unqualified-ids could be + interpreted as a particular specialization of a templatized + function. Because this non-conforming behavior is no longer the + default behavior for G++, '-Wnon-template-friend' allows the + compiler to check existing code for potential trouble spots and is + on by default. This new compiler behavior can be turned off with + '-Wno-non-template-friend', which keeps the conformant compiler + code but disables the helpful warning. + +'-Wold-style-cast (C++ and Objective-C++ only)' + Warn if an old-style (C-style) cast to a non-void type is used + within a C++ program. The new-style casts ('dynamic_cast', + 'static_cast', 'reinterpret_cast', and 'const_cast') are less + vulnerable to unintended effects and much easier to search for. + +'-Woverloaded-virtual (C++ and Objective-C++ only)' + Warn when a function declaration hides virtual functions from a + base class. For example, in: + + struct A { + virtual void f(); + }; + + struct B: public A { + void f(int); + }; + + the 'A' class version of 'f' is hidden in 'B', and code like: + + B* b; + b->f(); + + fails to compile. + +'-Wno-pmf-conversions (C++ and Objective-C++ only)' + Disable the diagnostic for converting a bound pointer to member + function to a plain pointer. + +'-Wsign-promo (C++ and Objective-C++ only)' + Warn when overload resolution chooses a promotion from unsigned or + enumerated type to a signed type, over a conversion to an unsigned + type of the same size. Previous versions of G++ tried to preserve + unsignedness, but the standard mandates the current behavior. + + +File: gcc.info, Node: Objective-C and Objective-C++ Dialect Options, Next: Language Independent Options, Prev: C++ Dialect Options, Up: Invoking GCC + +3.6 Options Controlling Objective-C and Objective-C++ Dialects +============================================================== + +(NOTE: This manual does not describe the Objective-C and Objective-C++ +languages themselves. *Note Language Standards Supported by GCC: +Standards, for references.) + + This section describes the command-line options that are only +meaningful for Objective-C and Objective-C++ programs. You can also use +most of the language-independent GNU compiler options. For example, you +might compile a file 'some_class.m' like this: + + gcc -g -fgnu-runtime -O -c some_class.m + +In this example, '-fgnu-runtime' is an option meant only for Objective-C +and Objective-C++ programs; you can use the other options with any +language supported by GCC. + + Note that since Objective-C is an extension of the C language, +Objective-C compilations may also use options specific to the C +front-end (e.g., '-Wtraditional'). Similarly, Objective-C++ +compilations may use C++-specific options (e.g., '-Wabi'). + + Here is a list of options that are _only_ for compiling Objective-C and +Objective-C++ programs: + +'-fconstant-string-class=CLASS-NAME' + Use CLASS-NAME as the name of the class to instantiate for each + literal string specified with the syntax '@"..."'. The default + class name is 'NXConstantString' if the GNU runtime is being used, + and 'NSConstantString' if the NeXT runtime is being used (see + below). The '-fconstant-cfstrings' option, if also present, + overrides the '-fconstant-string-class' setting and cause '@"..."' + literals to be laid out as constant CoreFoundation strings. + +'-fgnu-runtime' + Generate object code compatible with the standard GNU Objective-C + runtime. This is the default for most types of systems. + +'-fnext-runtime' + Generate output compatible with the NeXT runtime. This is the + default for NeXT-based systems, including Darwin and Mac OS X. The + macro '__NEXT_RUNTIME__' is predefined if (and only if) this option + is used. + +'-fno-nil-receivers' + Assume that all Objective-C message dispatches ('[receiver + message:arg]') in this translation unit ensure that the receiver is + not 'nil'. This allows for more efficient entry points in the + runtime to be used. This option is only available in conjunction + with the NeXT runtime and ABI version 0 or 1. + +'-fobjc-abi-version=N' + Use version N of the Objective-C ABI for the selected runtime. + This option is currently supported only for the NeXT runtime. In + that case, Version 0 is the traditional (32-bit) ABI without + support for properties and other Objective-C 2.0 additions. + Version 1 is the traditional (32-bit) ABI with support for + properties and other Objective-C 2.0 additions. Version 2 is the + modern (64-bit) ABI. If nothing is specified, the default is + Version 0 on 32-bit target machines, and Version 2 on 64-bit target + machines. + +'-fobjc-call-cxx-cdtors' + For each Objective-C class, check if any of its instance variables + is a C++ object with a non-trivial default constructor. If so, + synthesize a special '- (id) .cxx_construct' instance method which + runs non-trivial default constructors on any such instance + variables, in order, and then return 'self'. Similarly, check if + any instance variable is a C++ object with a non-trivial + destructor, and if so, synthesize a special '- (void) + .cxx_destruct' method which runs all such default destructors, in + reverse order. + + The '- (id) .cxx_construct' and '- (void) .cxx_destruct' methods + thusly generated only operate on instance variables declared in the + current Objective-C class, and not those inherited from + superclasses. It is the responsibility of the Objective-C runtime + to invoke all such methods in an object's inheritance hierarchy. + The '- (id) .cxx_construct' methods are invoked by the runtime + immediately after a new object instance is allocated; the '- (void) + .cxx_destruct' methods are invoked immediately before the runtime + deallocates an object instance. + + As of this writing, only the NeXT runtime on Mac OS X 10.4 and + later has support for invoking the '- (id) .cxx_construct' and '- + (void) .cxx_destruct' methods. + +'-fobjc-direct-dispatch' + Allow fast jumps to the message dispatcher. On Darwin this is + accomplished via the comm page. + +'-fobjc-exceptions' + Enable syntactic support for structured exception handling in + Objective-C, similar to what is offered by C++ and Java. This + option is required to use the Objective-C keywords '@try', + '@throw', '@catch', '@finally' and '@synchronized'. This option is + available with both the GNU runtime and the NeXT runtime (but not + available in conjunction with the NeXT runtime on Mac OS X 10.2 and + earlier). + +'-fobjc-gc' + Enable garbage collection (GC) in Objective-C and Objective-C++ + programs. This option is only available with the NeXT runtime; the + GNU runtime has a different garbage collection implementation that + does not require special compiler flags. + +'-fobjc-nilcheck' + For the NeXT runtime with version 2 of the ABI, check for a nil + receiver in method invocations before doing the actual method call. + This is the default and can be disabled using '-fno-objc-nilcheck'. + Class methods and super calls are never checked for nil in this way + no matter what this flag is set to. Currently this flag does + nothing when the GNU runtime, or an older version of the NeXT + runtime ABI, is used. + +'-fobjc-std=objc1' + Conform to the language syntax of Objective-C 1.0, the language + recognized by GCC 4.0. This only affects the Objective-C additions + to the C/C++ language; it does not affect conformance to C/C++ + standards, which is controlled by the separate C/C++ dialect option + flags. When this option is used with the Objective-C or + Objective-C++ compiler, any Objective-C syntax that is not + recognized by GCC 4.0 is rejected. This is useful if you need to + make sure that your Objective-C code can be compiled with older + versions of GCC. + +'-freplace-objc-classes' + Emit a special marker instructing 'ld(1)' not to statically link in + the resulting object file, and allow 'dyld(1)' to load it in at run + time instead. This is used in conjunction with the + Fix-and-Continue debugging mode, where the object file in question + may be recompiled and dynamically reloaded in the course of program + execution, without the need to restart the program itself. + Currently, Fix-and-Continue functionality is only available in + conjunction with the NeXT runtime on Mac OS X 10.3 and later. + +'-fzero-link' + When compiling for the NeXT runtime, the compiler ordinarily + replaces calls to 'objc_getClass("...")' (when the name of the + class is known at compile time) with static class references that + get initialized at load time, which improves run-time performance. + Specifying the '-fzero-link' flag suppresses this behavior and + causes calls to 'objc_getClass("...")' to be retained. This is + useful in Zero-Link debugging mode, since it allows for individual + class implementations to be modified during program execution. The + GNU runtime currently always retains calls to + 'objc_get_class("...")' regardless of command-line options. + +'-gen-decls' + Dump interface declarations for all classes seen in the source file + to a file named 'SOURCENAME.decl'. + +'-Wassign-intercept (Objective-C and Objective-C++ only)' + Warn whenever an Objective-C assignment is being intercepted by the + garbage collector. + +'-Wno-protocol (Objective-C and Objective-C++ only)' + If a class is declared to implement a protocol, a warning is issued + for every method in the protocol that is not implemented by the + class. The default behavior is to issue a warning for every method + not explicitly implemented in the class, even if a method + implementation is inherited from the superclass. If you use the + '-Wno-protocol' option, then methods inherited from the superclass + are considered to be implemented, and no warning is issued for + them. + +'-Wselector (Objective-C and Objective-C++ only)' + Warn if multiple methods of different types for the same selector + are found during compilation. The check is performed on the list + of methods in the final stage of compilation. Additionally, a + check is performed for each selector appearing in a + '@selector(...)' expression, and a corresponding method for that + selector has been found during compilation. Because these checks + scan the method table only at the end of compilation, these + warnings are not produced if the final stage of compilation is not + reached, for example because an error is found during compilation, + or because the '-fsyntax-only' option is being used. + +'-Wstrict-selector-match (Objective-C and Objective-C++ only)' + Warn if multiple methods with differing argument and/or return + types are found for a given selector when attempting to send a + message using this selector to a receiver of type 'id' or 'Class'. + When this flag is off (which is the default behavior), the compiler + omits such warnings if any differences found are confined to types + that share the same size and alignment. + +'-Wundeclared-selector (Objective-C and Objective-C++ only)' + Warn if a '@selector(...)' expression referring to an undeclared + selector is found. A selector is considered undeclared if no + method with that name has been declared before the '@selector(...)' + expression, either explicitly in an '@interface' or '@protocol' + declaration, or implicitly in an '@implementation' section. This + option always performs its checks as soon as a '@selector(...)' + expression is found, while '-Wselector' only performs its checks in + the final stage of compilation. This also enforces the coding + style convention that methods and selectors must be declared before + being used. + +'-print-objc-runtime-info' + Generate C header describing the largest structure that is passed + by value, if any. + + +File: gcc.info, Node: Language Independent Options, Next: Warning Options, Prev: Objective-C and Objective-C++ Dialect Options, Up: Invoking GCC + +3.7 Options to Control Diagnostic Messages Formatting +===================================================== + +Traditionally, diagnostic messages have been formatted irrespective of +the output device's aspect (e.g. its width, ...). You can use the +options described below to control the formatting algorithm for +diagnostic messages, e.g. how many characters per line, how often source +location information should be reported. Note that some language front +ends may not honor these options. + +'-fmessage-length=N' + Try to format error messages so that they fit on lines of about N + characters. The default is 72 characters for 'g++' and 0 for the + rest of the front ends supported by GCC. If N is zero, then no + line-wrapping is done; each error message appears on a single line. + +'-fdiagnostics-show-location=once' + Only meaningful in line-wrapping mode. Instructs the diagnostic + messages reporter to emit source location information _once_; that + is, in case the message is too long to fit on a single physical + line and has to be wrapped, the source location won't be emitted + (as prefix) again, over and over, in subsequent continuation lines. + This is the default behavior. + +'-fdiagnostics-show-location=every-line' + Only meaningful in line-wrapping mode. Instructs the diagnostic + messages reporter to emit the same source location information (as + prefix) for physical lines that result from the process of breaking + a message which is too long to fit on a single line. + +'-fdiagnostics-color[=WHEN]' +'-fno-diagnostics-color' + Use color in diagnostics. WHEN is 'never', 'always', or 'auto'. + The default is 'never' if 'GCC_COLORS' environment variable isn't + present in the environment, and 'auto' otherwise. 'auto' means to + use color only when the standard error is a terminal. The forms + '-fdiagnostics-color' and '-fno-diagnostics-color' are aliases for + '-fdiagnostics-color=always' and '-fdiagnostics-color=never', + respectively. + + The colors are defined by the environment variable 'GCC_COLORS'. + Its value is a colon-separated list of capabilities and Select + Graphic Rendition (SGR) substrings. SGR commands are interpreted + by the terminal or terminal emulator. (See the section in the + documentation of your text terminal for permitted values and their + meanings as character attributes.) These substring values are + integers in decimal representation and can be concatenated with + semicolons. Common values to concatenate include '1' for bold, '4' + for underline, '5' for blink, '7' for inverse, '39' for default + foreground color, '30' to '37' for foreground colors, '90' to '97' + for 16-color mode foreground colors, '38;5;0' to '38;5;255' for + 88-color and 256-color modes foreground colors, '49' for default + background color, '40' to '47' for background colors, '100' to + '107' for 16-color mode background colors, and '48;5;0' to + '48;5;255' for 88-color and 256-color modes background colors. + + The default 'GCC_COLORS' is + 'error=01;31:warning=01;35:note=01;36:caret=01;32:locus=01:quote=01' + where '01;31' is bold red, '01;35' is bold magenta, '01;36' is bold + cyan, '01;32' is bold green and '01' is bold. Setting 'GCC_COLORS' + to the empty string disables colors. Supported capabilities are as + follows. + + 'error=' + SGR substring for error: markers. + + 'warning=' + SGR substring for warning: markers. + + 'note=' + SGR substring for note: markers. + + 'caret=' + SGR substring for caret line. + + 'locus=' + SGR substring for location information, 'file:line' or + 'file:line:column' etc. + + 'quote=' + SGR substring for information printed within quotes. + +'-fno-diagnostics-show-option' + By default, each diagnostic emitted includes text indicating the + command-line option that directly controls the diagnostic (if such + an option is known to the diagnostic machinery). Specifying the + '-fno-diagnostics-show-option' flag suppresses that behavior. + +'-fno-diagnostics-show-caret' + By default, each diagnostic emitted includes the original source + line and a caret '^' indicating the column. This option suppresses + this information. + + +File: gcc.info, Node: Warning Options, Next: Debugging Options, Prev: Language Independent Options, Up: Invoking GCC + +3.8 Options to Request or Suppress Warnings +=========================================== + +Warnings are diagnostic messages that report constructions that are not +inherently erroneous but that are risky or suggest there may have been +an error. + + The following language-independent options do not enable specific +warnings but control the kinds of diagnostics produced by GCC. + +'-fsyntax-only' + Check the code for syntax errors, but don't do anything beyond + that. + +'-fmax-errors=N' + Limits the maximum number of error messages to N, at which point + GCC bails out rather than attempting to continue processing the + source code. If N is 0 (the default), there is no limit on the + number of error messages produced. If '-Wfatal-errors' is also + specified, then '-Wfatal-errors' takes precedence over this option. + +'-w' + Inhibit all warning messages. + +'-Werror' + Make all warnings into errors. + +'-Werror=' + Make the specified warning into an error. The specifier for a + warning is appended; for example '-Werror=switch' turns the + warnings controlled by '-Wswitch' into errors. This switch takes a + negative form, to be used to negate '-Werror' for specific + warnings; for example '-Wno-error=switch' makes '-Wswitch' warnings + not be errors, even when '-Werror' is in effect. + + The warning message for each controllable warning includes the + option that controls the warning. That option can then be used + with '-Werror=' and '-Wno-error=' as described above. (Printing of + the option in the warning message can be disabled using the + '-fno-diagnostics-show-option' flag.) + + Note that specifying '-Werror='FOO automatically implies '-W'FOO. + However, '-Wno-error='FOO does not imply anything. + +'-Wfatal-errors' + This option causes the compiler to abort compilation on the first + error occurred rather than trying to keep going and printing + further error messages. + + You can request many specific warnings with options beginning with +'-W', for example '-Wimplicit' to request warnings on implicit +declarations. Each of these specific warning options also has a +negative form beginning '-Wno-' to turn off warnings; for example, +'-Wno-implicit'. This manual lists only one of the two forms, whichever +is not the default. For further language-specific options also refer to +*note C++ Dialect Options:: and *note Objective-C and Objective-C++ +Dialect Options::. + + When an unrecognized warning option is requested (e.g., +'-Wunknown-warning'), GCC emits a diagnostic stating that the option is +not recognized. However, if the '-Wno-' form is used, the behavior is +slightly different: no diagnostic is produced for '-Wno-unknown-warning' +unless other diagnostics are being produced. This allows the use of new +'-Wno-' options with old compilers, but if something goes wrong, the +compiler warns that an unrecognized option is present. + +'-Wpedantic' +'-pedantic' + Issue all the warnings demanded by strict ISO C and ISO C++; reject + all programs that use forbidden extensions, and some other programs + that do not follow ISO C and ISO C++. For ISO C, follows the + version of the ISO C standard specified by any '-std' option used. + + Valid ISO C and ISO C++ programs should compile properly with or + without this option (though a rare few require '-ansi' or a '-std' + option specifying the required version of ISO C). However, without + this option, certain GNU extensions and traditional C and C++ + features are supported as well. With this option, they are + rejected. + + '-Wpedantic' does not cause warning messages for use of the + alternate keywords whose names begin and end with '__'. Pedantic + warnings are also disabled in the expression that follows + '__extension__'. However, only system header files should use + these escape routes; application programs should avoid them. *Note + Alternate Keywords::. + + Some users try to use '-Wpedantic' to check programs for strict ISO + C conformance. They soon find that it does not do quite what they + want: it finds some non-ISO practices, but not all--only those for + which ISO C _requires_ a diagnostic, and some others for which + diagnostics have been added. + + A feature to report any failure to conform to ISO C might be useful + in some instances, but would require considerable additional work + and would be quite different from '-Wpedantic'. We don't have + plans to support such a feature in the near future. + + Where the standard specified with '-std' represents a GNU extended + dialect of C, such as 'gnu90' or 'gnu99', there is a corresponding + "base standard", the version of ISO C on which the GNU extended + dialect is based. Warnings from '-Wpedantic' are given where they + are required by the base standard. (It does not make sense for + such warnings to be given only for features not in the specified + GNU C dialect, since by definition the GNU dialects of C include + all features the compiler supports with the given option, and there + would be nothing to warn about.) + +'-pedantic-errors' + Like '-Wpedantic', except that errors are produced rather than + warnings. + +'-Wall' + This enables all the warnings about constructions that some users + consider questionable, and that are easy to avoid (or modify to + prevent the warning), even in conjunction with macros. This also + enables some language-specific warnings described in *note C++ + Dialect Options:: and *note Objective-C and Objective-C++ Dialect + Options::. + + '-Wall' turns on the following warning flags: + + -Waddress + -Warray-bounds (only with -O2) + -Wc++11-compat + -Wchar-subscripts + -Wenum-compare (in C/ObjC; this is on by default in C++) + -Wimplicit-int (C and Objective-C only) + -Wimplicit-function-declaration (C and Objective-C only) + -Wcomment + -Wformat + -Wmain (only for C/ObjC and unless -ffreestanding) + -Wmaybe-uninitialized + -Wmissing-braces (only for C/ObjC) + -Wnonnull + -Wopenmp-simd + -Wparentheses + -Wpointer-sign + -Wreorder + -Wreturn-type + -Wsequence-point + -Wsign-compare (only in C++) + -Wstrict-aliasing + -Wstrict-overflow=1 + -Wswitch + -Wtrigraphs + -Wuninitialized + -Wunknown-pragmas + -Wunused-function + -Wunused-label + -Wunused-value + -Wunused-variable + -Wvolatile-register-var + + Note that some warning flags are not implied by '-Wall'. Some of + them warn about constructions that users generally do not consider + questionable, but which occasionally you might wish to check for; + others warn about constructions that are necessary or hard to avoid + in some cases, and there is no simple way to modify the code to + suppress the warning. Some of them are enabled by '-Wextra' but + many of them must be enabled individually. + +'-Wextra' + This enables some extra warning flags that are not enabled by + '-Wall'. (This option used to be called '-W'. The older name is + still supported, but the newer name is more descriptive.) + + -Wclobbered + -Wempty-body + -Wignored-qualifiers + -Wmissing-field-initializers + -Wmissing-parameter-type (C only) + -Wold-style-declaration (C only) + -Woverride-init + -Wsign-compare + -Wtype-limits + -Wuninitialized + -Wunused-parameter (only with -Wunused or -Wall) + -Wunused-but-set-parameter (only with -Wunused or -Wall) + + The option '-Wextra' also prints warning messages for the following + cases: + + * A pointer is compared against integer zero with '<', '<=', + '>', or '>='. + + * (C++ only) An enumerator and a non-enumerator both appear in a + conditional expression. + + * (C++ only) Ambiguous virtual bases. + + * (C++ only) Subscripting an array that has been declared + 'register'. + + * (C++ only) Taking the address of a variable that has been + declared 'register'. + + * (C++ only) A base class is not initialized in a derived + class's copy constructor. + +'-Wchar-subscripts' + Warn if an array subscript has type 'char'. This is a common cause + of error, as programmers often forget that this type is signed on + some machines. This warning is enabled by '-Wall'. + +'-Wcomment' + Warn whenever a comment-start sequence '/*' appears in a '/*' + comment, or whenever a Backslash-Newline appears in a '//' comment. + This warning is enabled by '-Wall'. + +'-Wno-coverage-mismatch' + Warn if feedback profiles do not match when using the + '-fprofile-use' option. If a source file is changed between + compiling with '-fprofile-gen' and with '-fprofile-use', the files + with the profile feedback can fail to match the source file and GCC + cannot use the profile feedback information. By default, this + warning is enabled and is treated as an error. + '-Wno-coverage-mismatch' can be used to disable the warning or + '-Wno-error=coverage-mismatch' can be used to disable the error. + Disabling the error for this warning can result in poorly optimized + code and is useful only in the case of very minor changes such as + bug fixes to an existing code-base. Completely disabling the + warning is not recommended. + +'-Wno-cpp' + (C, Objective-C, C++, Objective-C++ and Fortran only) + + Suppress warning messages emitted by '#warning' directives. + +'-Wdouble-promotion (C, C++, Objective-C and Objective-C++ only)' + Give a warning when a value of type 'float' is implicitly promoted + to 'double'. CPUs with a 32-bit "single-precision" floating-point + unit implement 'float' in hardware, but emulate 'double' in + software. On such a machine, doing computations using 'double' + values is much more expensive because of the overhead required for + software emulation. + + It is easy to accidentally do computations with 'double' because + floating-point literals are implicitly of type 'double'. For + example, in: + float area(float radius) + { + return 3.14159 * radius * radius; + } + the compiler performs the entire computation with 'double' because + the floating-point literal is a 'double'. + +'-Wformat' +'-Wformat=N' + Check calls to 'printf' and 'scanf', etc., to make sure that the + arguments supplied have types appropriate to the format string + specified, and that the conversions specified in the format string + make sense. This includes standard functions, and others specified + by format attributes (*note Function Attributes::), in the + 'printf', 'scanf', 'strftime' and 'strfmon' (an X/Open extension, + not in the C standard) families (or other target-specific + families). Which functions are checked without format attributes + having been specified depends on the standard version selected, and + such checks of functions without the attribute specified are + disabled by '-ffreestanding' or '-fno-builtin'. + + The formats are checked against the format features supported by + GNU libc version 2.2. These include all ISO C90 and C99 features, + as well as features from the Single Unix Specification and some BSD + and GNU extensions. Other library implementations may not support + all these features; GCC does not support warning about features + that go beyond a particular library's limitations. However, if + '-Wpedantic' is used with '-Wformat', warnings are given about + format features not in the selected standard version (but not for + 'strfmon' formats, since those are not in any version of the C + standard). *Note Options Controlling C Dialect: C Dialect Options. + + '-Wformat=1' + '-Wformat' + Option '-Wformat' is equivalent to '-Wformat=1', and + '-Wno-format' is equivalent to '-Wformat=0'. Since '-Wformat' + also checks for null format arguments for several functions, + '-Wformat' also implies '-Wnonnull'. Some aspects of this + level of format checking can be disabled by the options: + '-Wno-format-contains-nul', '-Wno-format-extra-args', and + '-Wno-format-zero-length'. '-Wformat' is enabled by '-Wall'. + + '-Wno-format-contains-nul' + If '-Wformat' is specified, do not warn about format strings + that contain NUL bytes. + + '-Wno-format-extra-args' + If '-Wformat' is specified, do not warn about excess arguments + to a 'printf' or 'scanf' format function. The C standard + specifies that such arguments are ignored. + + Where the unused arguments lie between used arguments that are + specified with '$' operand number specifications, normally + warnings are still given, since the implementation could not + know what type to pass to 'va_arg' to skip the unused + arguments. However, in the case of 'scanf' formats, this + option suppresses the warning if the unused arguments are all + pointers, since the Single Unix Specification says that such + unused arguments are allowed. + + '-Wno-format-zero-length' + If '-Wformat' is specified, do not warn about zero-length + formats. The C standard specifies that zero-length formats + are allowed. + + '-Wformat=2' + Enable '-Wformat' plus additional format checks. Currently + equivalent to '-Wformat -Wformat-nonliteral -Wformat-security + -Wformat-y2k'. + + '-Wformat-nonliteral' + If '-Wformat' is specified, also warn if the format string is + not a string literal and so cannot be checked, unless the + format function takes its format arguments as a 'va_list'. + + '-Wformat-security' + If '-Wformat' is specified, also warn about uses of format + functions that represent possible security problems. At + present, this warns about calls to 'printf' and 'scanf' + functions where the format string is not a string literal and + there are no format arguments, as in 'printf (foo);'. This + may be a security hole if the format string came from + untrusted input and contains '%n'. (This is currently a + subset of what '-Wformat-nonliteral' warns about, but in + future warnings may be added to '-Wformat-security' that are + not included in '-Wformat-nonliteral'.) + + '-Wformat-y2k' + If '-Wformat' is specified, also warn about 'strftime' formats + that may yield only a two-digit year. + +'-Wnonnull' + Warn about passing a null pointer for arguments marked as requiring + a non-null value by the 'nonnull' function attribute. + + '-Wnonnull' is included in '-Wall' and '-Wformat'. It can be + disabled with the '-Wno-nonnull' option. + +'-Winit-self (C, C++, Objective-C and Objective-C++ only)' + Warn about uninitialized variables that are initialized with + themselves. Note this option can only be used with the + '-Wuninitialized' option. + + For example, GCC warns about 'i' being uninitialized in the + following snippet only when '-Winit-self' has been specified: + int f() + { + int i = i; + return i; + } + + This warning is enabled by '-Wall' in C++. + +'-Wimplicit-int (C and Objective-C only)' + Warn when a declaration does not specify a type. This warning is + enabled by '-Wall'. + +'-Wimplicit-function-declaration (C and Objective-C only)' + Give a warning whenever a function is used before being declared. + In C99 mode ('-std=c99' or '-std=gnu99'), this warning is enabled + by default and it is made into an error by '-pedantic-errors'. + This warning is also enabled by '-Wall'. + +'-Wimplicit (C and Objective-C only)' + Same as '-Wimplicit-int' and '-Wimplicit-function-declaration'. + This warning is enabled by '-Wall'. + +'-Wignored-qualifiers (C and C++ only)' + Warn if the return type of a function has a type qualifier such as + 'const'. For ISO C such a type qualifier has no effect, since the + value returned by a function is not an lvalue. For C++, the + warning is only emitted for scalar types or 'void'. ISO C + prohibits qualified 'void' return types on function definitions, so + such return types always receive a warning even without this + option. + + This warning is also enabled by '-Wextra'. + +'-Wmain' + Warn if the type of 'main' is suspicious. 'main' should be a + function with external linkage, returning int, taking either zero + arguments, two, or three arguments of appropriate types. This + warning is enabled by default in C++ and is enabled by either + '-Wall' or '-Wpedantic'. + +'-Wmissing-braces' + Warn if an aggregate or union initializer is not fully bracketed. + In the following example, the initializer for 'a' is not fully + bracketed, but that for 'b' is fully bracketed. This warning is + enabled by '-Wall' in C. + + int a[2][2] = { 0, 1, 2, 3 }; + int b[2][2] = { { 0, 1 }, { 2, 3 } }; + + This warning is enabled by '-Wall'. + +'-Wmissing-include-dirs (C, C++, Objective-C and Objective-C++ only)' + Warn if a user-supplied include directory does not exist. + +'-Wparentheses' + Warn if parentheses are omitted in certain contexts, such as when + there is an assignment in a context where a truth value is + expected, or when operators are nested whose precedence people + often get confused about. + + Also warn if a comparison like 'x<=y<=z' appears; this is + equivalent to '(x<=y ? 1 : 0) <= z', which is a different + interpretation from that of ordinary mathematical notation. + + Also warn about constructions where there may be confusion to which + 'if' statement an 'else' branch belongs. Here is an example of + such a case: + + { + if (a) + if (b) + foo (); + else + bar (); + } + + In C/C++, every 'else' branch belongs to the innermost possible + 'if' statement, which in this example is 'if (b)'. This is often + not what the programmer expected, as illustrated in the above + example by indentation the programmer chose. When there is the + potential for this confusion, GCC issues a warning when this flag + is specified. To eliminate the warning, add explicit braces around + the innermost 'if' statement so there is no way the 'else' can + belong to the enclosing 'if'. The resulting code looks like this: + + { + if (a) + { + if (b) + foo (); + else + bar (); + } + } + + Also warn for dangerous uses of the GNU extension to '?:' with + omitted middle operand. When the condition in the '?': operator is + a boolean expression, the omitted value is always 1. Often + programmers expect it to be a value computed inside the conditional + expression instead. + + This warning is enabled by '-Wall'. + +'-Wsequence-point' + Warn about code that may have undefined semantics because of + violations of sequence point rules in the C and C++ standards. + + The C and C++ standards define the order in which expressions in a + C/C++ program are evaluated in terms of "sequence points", which + represent a partial ordering between the execution of parts of the + program: those executed before the sequence point, and those + executed after it. These occur after the evaluation of a full + expression (one which is not part of a larger expression), after + the evaluation of the first operand of a '&&', '||', '? :' or ',' + (comma) operator, before a function is called (but after the + evaluation of its arguments and the expression denoting the called + function), and in certain other places. Other than as expressed by + the sequence point rules, the order of evaluation of subexpressions + of an expression is not specified. All these rules describe only a + partial order rather than a total order, since, for example, if two + functions are called within one expression with no sequence point + between them, the order in which the functions are called is not + specified. However, the standards committee have ruled that + function calls do not overlap. + + It is not specified when between sequence points modifications to + the values of objects take effect. Programs whose behavior depends + on this have undefined behavior; the C and C++ standards specify + that "Between the previous and next sequence point an object shall + have its stored value modified at most once by the evaluation of an + expression. Furthermore, the prior value shall be read only to + determine the value to be stored.". If a program breaks these + rules, the results on any particular implementation are entirely + unpredictable. + + Examples of code with undefined behavior are 'a = a++;', 'a[n] = + b[n++]' and 'a[i++] = i;'. Some more complicated cases are not + diagnosed by this option, and it may give an occasional false + positive result, but in general it has been found fairly effective + at detecting this sort of problem in programs. + + The standard is worded confusingly, therefore there is some debate + over the precise meaning of the sequence point rules in subtle + cases. Links to discussions of the problem, including proposed + formal definitions, may be found on the GCC readings page, at + <http://gcc.gnu.org/readings.html>. + + This warning is enabled by '-Wall' for C and C++. + +'-Wno-return-local-addr' + Do not warn about returning a pointer (or in C++, a reference) to a + variable that goes out of scope after the function returns. + +'-Wreturn-type' + Warn whenever a function is defined with a return type that + defaults to 'int'. Also warn about any 'return' statement with no + return value in a function whose return type is not 'void' (falling + off the end of the function body is considered returning without a + value), and about a 'return' statement with an expression in a + function whose return type is 'void'. + + For C++, a function without return type always produces a + diagnostic message, even when '-Wno-return-type' is specified. The + only exceptions are 'main' and functions defined in system headers. + + This warning is enabled by '-Wall'. + +'-Wswitch' + Warn whenever a 'switch' statement has an index of enumerated type + and lacks a 'case' for one or more of the named codes of that + enumeration. (The presence of a 'default' label prevents this + warning.) 'case' labels outside the enumeration range also provoke + warnings when this option is used (even if there is a 'default' + label). This warning is enabled by '-Wall'. + +'-Wswitch-default' + Warn whenever a 'switch' statement does not have a 'default' case. + +'-Wswitch-enum' + Warn whenever a 'switch' statement has an index of enumerated type + and lacks a 'case' for one or more of the named codes of that + enumeration. 'case' labels outside the enumeration range also + provoke warnings when this option is used. The only difference + between '-Wswitch' and this option is that this option gives a + warning about an omitted enumeration code even if there is a + 'default' label. + +'-Wsync-nand (C and C++ only)' + Warn when '__sync_fetch_and_nand' and '__sync_nand_and_fetch' + built-in functions are used. These functions changed semantics in + GCC 4.4. + +'-Wtrigraphs' + Warn if any trigraphs are encountered that might change the meaning + of the program (trigraphs within comments are not warned about). + This warning is enabled by '-Wall'. + +'-Wunused-but-set-parameter' + Warn whenever a function parameter is assigned to, but otherwise + unused (aside from its declaration). + + To suppress this warning use the 'unused' attribute (*note Variable + Attributes::). + + This warning is also enabled by '-Wunused' together with '-Wextra'. + +'-Wunused-but-set-variable' + Warn whenever a local variable is assigned to, but otherwise unused + (aside from its declaration). This warning is enabled by '-Wall'. + + To suppress this warning use the 'unused' attribute (*note Variable + Attributes::). + + This warning is also enabled by '-Wunused', which is enabled by + '-Wall'. + +'-Wunused-function' + Warn whenever a static function is declared but not defined or a + non-inline static function is unused. This warning is enabled by + '-Wall'. + +'-Wunused-label' + Warn whenever a label is declared but not used. This warning is + enabled by '-Wall'. + + To suppress this warning use the 'unused' attribute (*note Variable + Attributes::). + +'-Wunused-local-typedefs (C, Objective-C, C++ and Objective-C++ only)' + Warn when a typedef locally defined in a function is not used. + This warning is enabled by '-Wall'. + +'-Wunused-parameter' + Warn whenever a function parameter is unused aside from its + declaration. + + To suppress this warning use the 'unused' attribute (*note Variable + Attributes::). + +'-Wno-unused-result' + Do not warn if a caller of a function marked with attribute + 'warn_unused_result' (*note Function Attributes::) does not use its + return value. The default is '-Wunused-result'. + +'-Wunused-variable' + Warn whenever a local variable or non-constant static variable is + unused aside from its declaration. This warning is enabled by + '-Wall'. + + To suppress this warning use the 'unused' attribute (*note Variable + Attributes::). + +'-Wunused-value' + Warn whenever a statement computes a result that is explicitly not + used. To suppress this warning cast the unused expression to + 'void'. This includes an expression-statement or the left-hand + side of a comma expression that contains no side effects. For + example, an expression such as 'x[i,j]' causes a warning, while + 'x[(void)i,j]' does not. + + This warning is enabled by '-Wall'. + +'-Wunused' + All the above '-Wunused' options combined. + + In order to get a warning about an unused function parameter, you + must either specify '-Wextra -Wunused' (note that '-Wall' implies + '-Wunused'), or separately specify '-Wunused-parameter'. + +'-Wuninitialized' + Warn if an automatic variable is used without first being + initialized or if a variable may be clobbered by a 'setjmp' call. + In C++, warn if a non-static reference or non-static 'const' member + appears in a class without constructors. + + If you want to warn about code that uses the uninitialized value of + the variable in its own initializer, use the '-Winit-self' option. + + These warnings occur for individual uninitialized or clobbered + elements of structure, union or array variables as well as for + variables that are uninitialized or clobbered as a whole. They do + not occur for variables or elements declared 'volatile'. Because + these warnings depend on optimization, the exact variables or + elements for which there are warnings depends on the precise + optimization options and version of GCC used. + + Note that there may be no warning about a variable that is used + only to compute a value that itself is never used, because such + computations may be deleted by data flow analysis before the + warnings are printed. + +'-Wmaybe-uninitialized' + For an automatic variable, if there exists a path from the function + entry to a use of the variable that is initialized, but there exist + some other paths for which the variable is not initialized, the + compiler emits a warning if it cannot prove the uninitialized paths + are not executed at run time. These warnings are made optional + because GCC is not smart enough to see all the reasons why the code + might be correct in spite of appearing to have an error. Here is + one example of how this can happen: + + { + int x; + switch (y) + { + case 1: x = 1; + break; + case 2: x = 4; + break; + case 3: x = 5; + } + foo (x); + } + + If the value of 'y' is always 1, 2 or 3, then 'x' is always + initialized, but GCC doesn't know this. To suppress the warning, + you need to provide a default case with assert(0) or similar code. + + This option also warns when a non-volatile automatic variable might + be changed by a call to 'longjmp'. These warnings as well are + possible only in optimizing compilation. + + The compiler sees only the calls to 'setjmp'. It cannot know where + 'longjmp' will be called; in fact, a signal handler could call it + at any point in the code. As a result, you may get a warning even + when there is in fact no problem because 'longjmp' cannot in fact + be called at the place that would cause a problem. + + Some spurious warnings can be avoided if you declare all the + functions you use that never return as 'noreturn'. *Note Function + Attributes::. + + This warning is enabled by '-Wall' or '-Wextra'. + +'-Wunknown-pragmas' + Warn when a '#pragma' directive is encountered that is not + understood by GCC. If this command-line option is used, warnings + are even issued for unknown pragmas in system header files. This + is not the case if the warnings are only enabled by the '-Wall' + command-line option. + +'-Wno-pragmas' + Do not warn about misuses of pragmas, such as incorrect parameters, + invalid syntax, or conflicts between pragmas. See also + '-Wunknown-pragmas'. + +'-Wstrict-aliasing' + This option is only active when '-fstrict-aliasing' is active. It + warns about code that might break the strict aliasing rules that + the compiler is using for optimization. The warning does not catch + all cases, but does attempt to catch the more common pitfalls. It + is included in '-Wall'. It is equivalent to '-Wstrict-aliasing=3' + +'-Wstrict-aliasing=n' + This option is only active when '-fstrict-aliasing' is active. It + warns about code that might break the strict aliasing rules that + the compiler is using for optimization. Higher levels correspond + to higher accuracy (fewer false positives). Higher levels also + correspond to more effort, similar to the way '-O' works. + '-Wstrict-aliasing' is equivalent to '-Wstrict-aliasing=3'. + + Level 1: Most aggressive, quick, least accurate. Possibly useful + when higher levels do not warn but '-fstrict-aliasing' still breaks + the code, as it has very few false negatives. However, it has many + false positives. Warns for all pointer conversions between + possibly incompatible types, even if never dereferenced. Runs in + the front end only. + + Level 2: Aggressive, quick, not too precise. May still have many + false positives (not as many as level 1 though), and few false + negatives (but possibly more than level 1). Unlike level 1, it + only warns when an address is taken. Warns about incomplete types. + Runs in the front end only. + + Level 3 (default for '-Wstrict-aliasing'): Should have very few + false positives and few false negatives. Slightly slower than + levels 1 or 2 when optimization is enabled. Takes care of the + common pun+dereference pattern in the front end: + '*(int*)&some_float'. If optimization is enabled, it also runs in + the back end, where it deals with multiple statement cases using + flow-sensitive points-to information. Only warns when the + converted pointer is dereferenced. Does not warn about incomplete + types. + +'-Wstrict-overflow' +'-Wstrict-overflow=N' + This option is only active when '-fstrict-overflow' is active. It + warns about cases where the compiler optimizes based on the + assumption that signed overflow does not occur. Note that it does + not warn about all cases where the code might overflow: it only + warns about cases where the compiler implements some optimization. + Thus this warning depends on the optimization level. + + An optimization that assumes that signed overflow does not occur is + perfectly safe if the values of the variables involved are such + that overflow never does, in fact, occur. Therefore this warning + can easily give a false positive: a warning about code that is not + actually a problem. To help focus on important issues, several + warning levels are defined. No warnings are issued for the use of + undefined signed overflow when estimating how many iterations a + loop requires, in particular when determining whether a loop will + be executed at all. + + '-Wstrict-overflow=1' + Warn about cases that are both questionable and easy to avoid. + For example, with '-fstrict-overflow', the compiler simplifies + 'x + 1 > x' to '1'. This level of '-Wstrict-overflow' is + enabled by '-Wall'; higher levels are not, and must be + explicitly requested. + + '-Wstrict-overflow=2' + Also warn about other cases where a comparison is simplified + to a constant. For example: 'abs (x) >= 0'. This can only be + simplified when '-fstrict-overflow' is in effect, because 'abs + (INT_MIN)' overflows to 'INT_MIN', which is less than zero. + '-Wstrict-overflow' (with no level) is the same as + '-Wstrict-overflow=2'. + + '-Wstrict-overflow=3' + Also warn about other cases where a comparison is simplified. + For example: 'x + 1 > 1' is simplified to 'x > 0'. + + '-Wstrict-overflow=4' + Also warn about other simplifications not covered by the above + cases. For example: '(x * 10) / 5' is simplified to 'x * 2'. + + '-Wstrict-overflow=5' + Also warn about cases where the compiler reduces the magnitude + of a constant involved in a comparison. For example: 'x + 2 > + y' is simplified to 'x + 1 >= y'. This is reported only at + the highest warning level because this simplification applies + to many comparisons, so this warning level gives a very large + number of false positives. + +'-Wsuggest-attribute=[pure|const|noreturn|format]' + Warn for cases where adding an attribute may be beneficial. The + attributes currently supported are listed below. + + '-Wsuggest-attribute=pure' + '-Wsuggest-attribute=const' + '-Wsuggest-attribute=noreturn' + + Warn about functions that might be candidates for attributes + 'pure', 'const' or 'noreturn'. The compiler only warns for + functions visible in other compilation units or (in the case + of 'pure' and 'const') if it cannot prove that the function + returns normally. A function returns normally if it doesn't + contain an infinite loop or return abnormally by throwing, + calling 'abort()' or trapping. This analysis requires option + '-fipa-pure-const', which is enabled by default at '-O' and + higher. Higher optimization levels improve the accuracy of + the analysis. + + '-Wsuggest-attribute=format' + '-Wmissing-format-attribute' + + Warn about function pointers that might be candidates for + 'format' attributes. Note these are only possible candidates, + not absolute ones. GCC guesses that function pointers with + 'format' attributes that are used in assignment, + initialization, parameter passing or return statements should + have a corresponding 'format' attribute in the resulting type. + I.e. the left-hand side of the assignment or initialization, + the type of the parameter variable, or the return type of the + containing function respectively should also have a 'format' + attribute to avoid the warning. + + GCC also warns about function definitions that might be + candidates for 'format' attributes. Again, these are only + possible candidates. GCC guesses that 'format' attributes + might be appropriate for any function that calls a function + like 'vprintf' or 'vscanf', but this might not always be the + case, and some functions for which 'format' attributes are + appropriate may not be detected. + +'-Warray-bounds' + This option is only active when '-ftree-vrp' is active (default for + '-O2' and above). It warns about subscripts to arrays that are + always out of bounds. This warning is enabled by '-Wall'. + +'-Wno-div-by-zero' + Do not warn about compile-time integer division by zero. + Floating-point division by zero is not warned about, as it can be a + legitimate way of obtaining infinities and NaNs. + +'-Wsystem-headers' + Print warning messages for constructs found in system header files. + Warnings from system headers are normally suppressed, on the + assumption that they usually do not indicate real problems and + would only make the compiler output harder to read. Using this + command-line option tells GCC to emit warnings from system headers + as if they occurred in user code. However, note that using '-Wall' + in conjunction with this option does _not_ warn about unknown + pragmas in system headers--for that, '-Wunknown-pragmas' must also + be used. + +'-Wtrampolines' + Warn about trampolines generated for pointers to nested functions. + + A trampoline is a small piece of data or code that is created at + run time on the stack when the address of a nested function is + taken, and is used to call the nested function indirectly. For + some targets, it is made up of data only and thus requires no + special treatment. But, for most targets, it is made up of code + and thus requires the stack to be made executable in order for the + program to work properly. + +'-Wfloat-equal' + Warn if floating-point values are used in equality comparisons. + + The idea behind this is that sometimes it is convenient (for the + programmer) to consider floating-point values as approximations to + infinitely precise real numbers. If you are doing this, then you + need to compute (by analyzing the code, or in some other way) the + maximum or likely maximum error that the computation introduces, + and allow for it when performing comparisons (and when producing + output, but that's a different problem). In particular, instead of + testing for equality, you should check to see whether the two + values have ranges that overlap; and this is done with the + relational operators, so equality comparisons are probably + mistaken. + +'-Wtraditional (C and Objective-C only)' + Warn about certain constructs that behave differently in + traditional and ISO C. Also warn about ISO C constructs that have + no traditional C equivalent, and/or problematic constructs that + should be avoided. + + * Macro parameters that appear within string literals in the + macro body. In traditional C macro replacement takes place + within string literals, but in ISO C it does not. + + * In traditional C, some preprocessor directives did not exist. + Traditional preprocessors only considered a line to be a + directive if the '#' appeared in column 1 on the line. + Therefore '-Wtraditional' warns about directives that + traditional C understands but ignores because the '#' does not + appear as the first character on the line. It also suggests + you hide directives like '#pragma' not understood by + traditional C by indenting them. Some traditional + implementations do not recognize '#elif', so this option + suggests avoiding it altogether. + + * A function-like macro that appears without arguments. + + * The unary plus operator. + + * The 'U' integer constant suffix, or the 'F' or 'L' + floating-point constant suffixes. (Traditional C does support + the 'L' suffix on integer constants.) Note, these suffixes + appear in macros defined in the system headers of most modern + systems, e.g. the '_MIN'/'_MAX' macros in '<limits.h>'. Use + of these macros in user code might normally lead to spurious + warnings, however GCC's integrated preprocessor has enough + context to avoid warning in these cases. + + * A function declared external in one block and then used after + the end of the block. + + * A 'switch' statement has an operand of type 'long'. + + * A non-'static' function declaration follows a 'static' one. + This construct is not accepted by some traditional C + compilers. + + * The ISO type of an integer constant has a different width or + signedness from its traditional type. This warning is only + issued if the base of the constant is ten. I.e. hexadecimal + or octal values, which typically represent bit patterns, are + not warned about. + + * Usage of ISO string concatenation is detected. + + * Initialization of automatic aggregates. + + * Identifier conflicts with labels. Traditional C lacks a + separate namespace for labels. + + * Initialization of unions. If the initializer is zero, the + warning is omitted. This is done under the assumption that + the zero initializer in user code appears conditioned on e.g. + '__STDC__' to avoid missing initializer warnings and relies on + default initialization to zero in the traditional C case. + + * Conversions by prototypes between fixed/floating-point values + and vice versa. The absence of these prototypes when + compiling with traditional C causes serious problems. This is + a subset of the possible conversion warnings; for the full set + use '-Wtraditional-conversion'. + + * Use of ISO C style function definitions. This warning + intentionally is _not_ issued for prototype declarations or + variadic functions because these ISO C features appear in your + code when using libiberty's traditional C compatibility + macros, 'PARAMS' and 'VPARAMS'. This warning is also bypassed + for nested functions because that feature is already a GCC + extension and thus not relevant to traditional C + compatibility. + +'-Wtraditional-conversion (C and Objective-C only)' + Warn if a prototype causes a type conversion that is different from + what would happen to the same argument in the absence of a + prototype. This includes conversions of fixed point to floating + and vice versa, and conversions changing the width or signedness of + a fixed-point argument except when the same as the default + promotion. + +'-Wdeclaration-after-statement (C and Objective-C only)' + Warn when a declaration is found after a statement in a block. + This construct, known from C++, was introduced with ISO C99 and is + by default allowed in GCC. It is not supported by ISO C90 and was + not supported by GCC versions before GCC 3.0. *Note Mixed + Declarations::. + +'-Wundef' + Warn if an undefined identifier is evaluated in an '#if' directive. + +'-Wno-endif-labels' + Do not warn whenever an '#else' or an '#endif' are followed by + text. + +'-Wshadow' + Warn whenever a local variable or type declaration shadows another + variable, parameter, type, or class member (in C++), or whenever a + built-in function is shadowed. Note that in C++, the compiler + warns if a local variable shadows an explicit typedef, but not if + it shadows a struct/class/enum. + +'-Wlarger-than=LEN' + Warn whenever an object of larger than LEN bytes is defined. + +'-Wframe-larger-than=LEN' + Warn if the size of a function frame is larger than LEN bytes. The + computation done to determine the stack frame size is approximate + and not conservative. The actual requirements may be somewhat + greater than LEN even if you do not get a warning. In addition, + any space allocated via 'alloca', variable-length arrays, or + related constructs is not included by the compiler when determining + whether or not to issue a warning. + +'-Wno-free-nonheap-object' + Do not warn when attempting to free an object that was not + allocated on the heap. + +'-Wstack-usage=LEN' + Warn if the stack usage of a function might be larger than LEN + bytes. The computation done to determine the stack usage is + conservative. Any space allocated via 'alloca', variable-length + arrays, or related constructs is included by the compiler when + determining whether or not to issue a warning. + + The message is in keeping with the output of '-fstack-usage'. + + * If the stack usage is fully static but exceeds the specified + amount, it's: + + warning: stack usage is 1120 bytes + * If the stack usage is (partly) dynamic but bounded, it's: + + warning: stack usage might be 1648 bytes + * If the stack usage is (partly) dynamic and not bounded, it's: + + warning: stack usage might be unbounded + +'-Wunsafe-loop-optimizations' + Warn if the loop cannot be optimized because the compiler cannot + assume anything on the bounds of the loop indices. With + '-funsafe-loop-optimizations' warn if the compiler makes such + assumptions. + +'-Wno-pedantic-ms-format (MinGW targets only)' + When used in combination with '-Wformat' and '-pedantic' without + GNU extensions, this option disables the warnings about non-ISO + 'printf' / 'scanf' format width specifiers 'I32', 'I64', and 'I' + used on Windows targets, which depend on the MS runtime. + +'-Wpointer-arith' + Warn about anything that depends on the "size of" a function type + or of 'void'. GNU C assigns these types a size of 1, for + convenience in calculations with 'void *' pointers and pointers to + functions. In C++, warn also when an arithmetic operation involves + 'NULL'. This warning is also enabled by '-Wpedantic'. + +'-Wtype-limits' + Warn if a comparison is always true or always false due to the + limited range of the data type, but do not warn for constant + expressions. For example, warn if an unsigned variable is compared + against zero with '<' or '>='. This warning is also enabled by + '-Wextra'. + +'-Wbad-function-cast (C and Objective-C only)' + Warn whenever a function call is cast to a non-matching type. For + example, warn if 'int malloc()' is cast to 'anything *'. + +'-Wc++-compat (C and Objective-C only)' + Warn about ISO C constructs that are outside of the common subset + of ISO C and ISO C++, e.g. request for implicit conversion from + 'void *' to a pointer to non-'void' type. + +'-Wc++11-compat (C++ and Objective-C++ only)' + Warn about C++ constructs whose meaning differs between ISO C++ + 1998 and ISO C++ 2011, e.g., identifiers in ISO C++ 1998 that are + keywords in ISO C++ 2011. This warning turns on '-Wnarrowing' and + is enabled by '-Wall'. + +'-Wcast-qual' + Warn whenever a pointer is cast so as to remove a type qualifier + from the target type. For example, warn if a 'const char *' is + cast to an ordinary 'char *'. + + Also warn when making a cast that introduces a type qualifier in an + unsafe way. For example, casting 'char **' to 'const char **' is + unsafe, as in this example: + + /* p is char ** value. */ + const char **q = (const char **) p; + /* Assignment of readonly string to const char * is OK. */ + *q = "string"; + /* Now char** pointer points to read-only memory. */ + **p = 'b'; + +'-Wcast-align' + Warn whenever a pointer is cast such that the required alignment of + the target is increased. For example, warn if a 'char *' is cast + to an 'int *' on machines where integers can only be accessed at + two- or four-byte boundaries. + +'-Wwrite-strings' + When compiling C, give string constants the type 'const + char[LENGTH]' so that copying the address of one into a non-'const' + 'char *' pointer produces a warning. These warnings help you find + at compile time code that can try to write into a string constant, + but only if you have been very careful about using 'const' in + declarations and prototypes. Otherwise, it is just a nuisance. + This is why we did not make '-Wall' request these warnings. + + When compiling C++, warn about the deprecated conversion from + string literals to 'char *'. This warning is enabled by default + for C++ programs. + +'-Wclobbered' + Warn for variables that might be changed by 'longjmp' or 'vfork'. + This warning is also enabled by '-Wextra'. + +'-Wconditionally-supported (C++ and Objective-C++ only)' + Warn for conditionally-supported (C++11 [intro.defs]) constructs. + +'-Wconversion' + Warn for implicit conversions that may alter a value. This + includes conversions between real and integer, like 'abs (x)' when + 'x' is 'double'; conversions between signed and unsigned, like + 'unsigned ui = -1'; and conversions to smaller types, like 'sqrtf + (M_PI)'. Do not warn for explicit casts like 'abs ((int) x)' and + 'ui = (unsigned) -1', or if the value is not changed by the + conversion like in 'abs (2.0)'. Warnings about conversions between + signed and unsigned integers can be disabled by using + '-Wno-sign-conversion'. + + For C++, also warn for confusing overload resolution for + user-defined conversions; and conversions that never use a type + conversion operator: conversions to 'void', the same type, a base + class or a reference to them. Warnings about conversions between + signed and unsigned integers are disabled by default in C++ unless + '-Wsign-conversion' is explicitly enabled. + +'-Wno-conversion-null (C++ and Objective-C++ only)' + Do not warn for conversions between 'NULL' and non-pointer types. + '-Wconversion-null' is enabled by default. + +'-Wzero-as-null-pointer-constant (C++ and Objective-C++ only)' + Warn when a literal '0' is used as null pointer constant. This can + be useful to facilitate the conversion to 'nullptr' in C++11. + +'-Wdate-time' + Warn when macros '__TIME__', '__DATE__' or '__TIMESTAMP__' are + encountered as they might prevent bit-wise-identical reproducible + compilations. + +'-Wdelete-incomplete (C++ and Objective-C++ only)' + Warn when deleting a pointer to incomplete type, which may cause + undefined behavior at runtime. This warning is enabled by default. + +'-Wuseless-cast (C++ and Objective-C++ only)' + Warn when an expression is casted to its own type. + +'-Wempty-body' + Warn if an empty body occurs in an 'if', 'else' or 'do while' + statement. This warning is also enabled by '-Wextra'. + +'-Wenum-compare' + Warn about a comparison between values of different enumerated + types. In C++ enumeral mismatches in conditional expressions are + also diagnosed and the warning is enabled by default. In C this + warning is enabled by '-Wall'. + +'-Wjump-misses-init (C, Objective-C only)' + Warn if a 'goto' statement or a 'switch' statement jumps forward + across the initialization of a variable, or jumps backward to a + label after the variable has been initialized. This only warns + about variables that are initialized when they are declared. This + warning is only supported for C and Objective-C; in C++ this sort + of branch is an error in any case. + + '-Wjump-misses-init' is included in '-Wc++-compat'. It can be + disabled with the '-Wno-jump-misses-init' option. + +'-Wsign-compare' + Warn when a comparison between signed and unsigned values could + produce an incorrect result when the signed value is converted to + unsigned. This warning is also enabled by '-Wextra'; to get the + other warnings of '-Wextra' without this warning, use '-Wextra + -Wno-sign-compare'. + +'-Wsign-conversion' + Warn for implicit conversions that may change the sign of an + integer value, like assigning a signed integer expression to an + unsigned integer variable. An explicit cast silences the warning. + In C, this option is enabled also by '-Wconversion'. + +'-Wfloat-conversion' + Warn for implicit conversions that reduce the precision of a real + value. This includes conversions from real to integer, and from + higher precision real to lower precision real values. This option + is also enabled by '-Wconversion'. + +'-Wsizeof-pointer-memaccess' + Warn for suspicious length parameters to certain string and memory + built-in functions if the argument uses 'sizeof'. This warning + warns e.g. about 'memset (ptr, 0, sizeof (ptr));' if 'ptr' is not + an array, but a pointer, and suggests a possible fix, or about + 'memcpy (&foo, ptr, sizeof (&foo));'. This warning is enabled by + '-Wall'. + +'-Waddress' + Warn about suspicious uses of memory addresses. These include + using the address of a function in a conditional expression, such + as 'void func(void); if (func)', and comparisons against the memory + address of a string literal, such as 'if (x == "abc")'. Such uses + typically indicate a programmer error: the address of a function + always evaluates to true, so their use in a conditional usually + indicate that the programmer forgot the parentheses in a function + call; and comparisons against string literals result in unspecified + behavior and are not portable in C, so they usually indicate that + the programmer intended to use 'strcmp'. This warning is enabled + by '-Wall'. + +'-Wlogical-op' + Warn about suspicious uses of logical operators in expressions. + This includes using logical operators in contexts where a bit-wise + operator is likely to be expected. + +'-Waggregate-return' + Warn if any functions that return structures or unions are defined + or called. (In languages where you can return an array, this also + elicits a warning.) + +'-Wno-aggressive-loop-optimizations' + Warn if in a loop with constant number of iterations the compiler + detects undefined behavior in some statement during one or more of + the iterations. + +'-Wno-attributes' + Do not warn if an unexpected '__attribute__' is used, such as + unrecognized attributes, function attributes applied to variables, + etc. This does not stop errors for incorrect use of supported + attributes. + +'-Wno-builtin-macro-redefined' + Do not warn if certain built-in macros are redefined. This + suppresses warnings for redefinition of '__TIMESTAMP__', + '__TIME__', '__DATE__', '__FILE__', and '__BASE_FILE__'. + +'-Wstrict-prototypes (C and Objective-C only)' + Warn if a function is declared or defined without specifying the + argument types. (An old-style function definition is permitted + without a warning if preceded by a declaration that specifies the + argument types.) + +'-Wold-style-declaration (C and Objective-C only)' + Warn for obsolescent usages, according to the C Standard, in a + declaration. For example, warn if storage-class specifiers like + 'static' are not the first things in a declaration. This warning + is also enabled by '-Wextra'. + +'-Wold-style-definition (C and Objective-C only)' + Warn if an old-style function definition is used. A warning is + given even if there is a previous prototype. + +'-Wmissing-parameter-type (C and Objective-C only)' + A function parameter is declared without a type specifier in + K&R-style functions: + + void foo(bar) { } + + This warning is also enabled by '-Wextra'. + +'-Wmissing-prototypes (C and Objective-C only)' + Warn if a global function is defined without a previous prototype + declaration. This warning is issued even if the definition itself + provides a prototype. Use this option to detect global functions + that do not have a matching prototype declaration in a header file. + This option is not valid for C++ because all function declarations + provide prototypes and a non-matching declaration will declare an + overload rather than conflict with an earlier declaration. Use + '-Wmissing-declarations' to detect missing declarations in C++. + +'-Wmissing-declarations' + Warn if a global function is defined without a previous + declaration. Do so even if the definition itself provides a + prototype. Use this option to detect global functions that are not + declared in header files. In C, no warnings are issued for + functions with previous non-prototype declarations; use + '-Wmissing-prototype' to detect missing prototypes. In C++, no + warnings are issued for function templates, or for inline + functions, or for functions in anonymous namespaces. + +'-Wmissing-field-initializers' + Warn if a structure's initializer has some fields missing. For + example, the following code causes such a warning, because 'x.h' is + implicitly zero: + + struct s { int f, g, h; }; + struct s x = { 3, 4 }; + + This option does not warn about designated initializers, so the + following modification does not trigger a warning: + + struct s { int f, g, h; }; + struct s x = { .f = 3, .g = 4 }; + + This warning is included in '-Wextra'. To get other '-Wextra' + warnings without this one, use '-Wextra + -Wno-missing-field-initializers'. + +'-Wno-multichar' + Do not warn if a multicharacter constant (''FOOF'') is used. + Usually they indicate a typo in the user's code, as they have + implementation-defined values, and should not be used in portable + code. + +'-Wnormalized=<none|id|nfc|nfkc>' + In ISO C and ISO C++, two identifiers are different if they are + different sequences of characters. However, sometimes when + characters outside the basic ASCII character set are used, you can + have two different character sequences that look the same. To + avoid confusion, the ISO 10646 standard sets out some + "normalization rules" which when applied ensure that two sequences + that look the same are turned into the same sequence. GCC can warn + you if you are using identifiers that have not been normalized; + this option controls that warning. + + There are four levels of warning supported by GCC. The default is + '-Wnormalized=nfc', which warns about any identifier that is not in + the ISO 10646 "C" normalized form, "NFC". NFC is the recommended + form for most uses. + + Unfortunately, there are some characters allowed in identifiers by + ISO C and ISO C++ that, when turned into NFC, are not allowed in + identifiers. That is, there's no way to use these symbols in + portable ISO C or C++ and have all your identifiers in NFC. + '-Wnormalized=id' suppresses the warning for these characters. It + is hoped that future versions of the standards involved will + correct this, which is why this option is not the default. + + You can switch the warning off for all characters by writing + '-Wnormalized=none'. You should only do this if you are using some + other normalization scheme (like "D"), because otherwise you can + easily create bugs that are literally impossible to see. + + Some characters in ISO 10646 have distinct meanings but look + identical in some fonts or display methodologies, especially once + formatting has been applied. For instance '\u207F', "SUPERSCRIPT + LATIN SMALL LETTER N", displays just like a regular 'n' that has + been placed in a superscript. ISO 10646 defines the "NFKC" + normalization scheme to convert all these into a standard form as + well, and GCC warns if your code is not in NFKC if you use + '-Wnormalized=nfkc'. This warning is comparable to warning about + every identifier that contains the letter O because it might be + confused with the digit 0, and so is not the default, but may be + useful as a local coding convention if the programming environment + cannot be fixed to display these characters distinctly. + +'-Wno-deprecated' + Do not warn about usage of deprecated features. *Note Deprecated + Features::. + +'-Wno-deprecated-declarations' + Do not warn about uses of functions (*note Function Attributes::), + variables (*note Variable Attributes::), and types (*note Type + Attributes::) marked as deprecated by using the 'deprecated' + attribute. + +'-Wno-overflow' + Do not warn about compile-time overflow in constant expressions. + +'-Wopenmp-simd' + Warn if the vectorizer cost model overrides the OpenMP or the Cilk + Plus simd directive set by user. The '-fsimd-cost-model=unlimited' + can be used to relax the cost model. + +'-Woverride-init (C and Objective-C only)' + Warn if an initialized field without side effects is overridden + when using designated initializers (*note Designated Initializers: + Designated Inits.). + + This warning is included in '-Wextra'. To get other '-Wextra' + warnings without this one, use '-Wextra -Wno-override-init'. + +'-Wpacked' + Warn if a structure is given the packed attribute, but the packed + attribute has no effect on the layout or size of the structure. + Such structures may be mis-aligned for little benefit. For + instance, in this code, the variable 'f.x' in 'struct bar' is + misaligned even though 'struct bar' does not itself have the packed + attribute: + + struct foo { + int x; + char a, b, c, d; + } __attribute__((packed)); + struct bar { + char z; + struct foo f; + }; + +'-Wpacked-bitfield-compat' + The 4.1, 4.2 and 4.3 series of GCC ignore the 'packed' attribute on + bit-fields of type 'char'. This has been fixed in GCC 4.4 but the + change can lead to differences in the structure layout. GCC + informs you when the offset of such a field has changed in GCC 4.4. + For example there is no longer a 4-bit padding between field 'a' + and 'b' in this structure: + + struct foo + { + char a:4; + char b:8; + } __attribute__ ((packed)); + + This warning is enabled by default. Use + '-Wno-packed-bitfield-compat' to disable this warning. + +'-Wpadded' + Warn if padding is included in a structure, either to align an + element of the structure or to align the whole structure. + Sometimes when this happens it is possible to rearrange the fields + of the structure to reduce the padding and so make the structure + smaller. + +'-Wredundant-decls' + Warn if anything is declared more than once in the same scope, even + in cases where multiple declaration is valid and changes nothing. + +'-Wnested-externs (C and Objective-C only)' + Warn if an 'extern' declaration is encountered within a function. + +'-Wno-inherited-variadic-ctor' + Suppress warnings about use of C++11 inheriting constructors when + the base class inherited from has a C variadic constructor; the + warning is on by default because the ellipsis is not inherited. + +'-Winline' + Warn if a function that is declared as inline cannot be inlined. + Even with this option, the compiler does not warn about failures to + inline functions declared in system headers. + + The compiler uses a variety of heuristics to determine whether or + not to inline a function. For example, the compiler takes into + account the size of the function being inlined and the amount of + inlining that has already been done in the current function. + Therefore, seemingly insignificant changes in the source program + can cause the warnings produced by '-Winline' to appear or + disappear. + +'-Wno-invalid-offsetof (C++ and Objective-C++ only)' + Suppress warnings from applying the 'offsetof' macro to a non-POD + type. According to the 1998 ISO C++ standard, applying 'offsetof' + to a non-POD type is undefined. In existing C++ implementations, + however, 'offsetof' typically gives meaningful results even when + applied to certain kinds of non-POD types (such as a simple + 'struct' that fails to be a POD type only by virtue of having a + constructor). This flag is for users who are aware that they are + writing nonportable code and who have deliberately chosen to ignore + the warning about it. + + The restrictions on 'offsetof' may be relaxed in a future version + of the C++ standard. + +'-Wno-int-to-pointer-cast' + Suppress warnings from casts to pointer type of an integer of a + different size. In C++, casting to a pointer type of smaller size + is an error. 'Wint-to-pointer-cast' is enabled by default. + +'-Wno-pointer-to-int-cast (C and Objective-C only)' + Suppress warnings from casts from a pointer to an integer type of a + different size. + +'-Winvalid-pch' + Warn if a precompiled header (*note Precompiled Headers::) is found + in the search path but can't be used. + +'-Wlong-long' + Warn if 'long long' type is used. This is enabled by either + '-Wpedantic' or '-Wtraditional' in ISO C90 and C++98 modes. To + inhibit the warning messages, use '-Wno-long-long'. + +'-Wvariadic-macros' + Warn if variadic macros are used in pedantic ISO C90 mode, or the + GNU alternate syntax when in pedantic ISO C99 mode. This is + default. To inhibit the warning messages, use + '-Wno-variadic-macros'. + +'-Wvarargs' + Warn upon questionable usage of the macros used to handle variable + arguments like 'va_start'. This is default. To inhibit the + warning messages, use '-Wno-varargs'. + +'-Wvector-operation-performance' + Warn if vector operation is not implemented via SIMD capabilities + of the architecture. Mainly useful for the performance tuning. + Vector operation can be implemented 'piecewise', which means that + the scalar operation is performed on every vector element; 'in + parallel', which means that the vector operation is implemented + using scalars of wider type, which normally is more performance + efficient; and 'as a single scalar', which means that vector fits + into a scalar type. + +'-Wno-virtual-move-assign' + Suppress warnings about inheriting from a virtual base with a + non-trivial C++11 move assignment operator. This is dangerous + because if the virtual base is reachable along more than one path, + it will be moved multiple times, which can mean both objects end up + in the moved-from state. If the move assignment operator is + written to avoid moving from a moved-from object, this warning can + be disabled. + +'-Wvla' + Warn if variable length array is used in the code. '-Wno-vla' + prevents the '-Wpedantic' warning of the variable length array. + +'-Wvolatile-register-var' + Warn if a register variable is declared volatile. The volatile + modifier does not inhibit all optimizations that may eliminate + reads and/or writes to register variables. This warning is enabled + by '-Wall'. + +'-Wdisabled-optimization' + Warn if a requested optimization pass is disabled. This warning + does not generally indicate that there is anything wrong with your + code; it merely indicates that GCC's optimizers are unable to + handle the code effectively. Often, the problem is that your code + is too big or too complex; GCC refuses to optimize programs when + the optimization itself is likely to take inordinate amounts of + time. + +'-Wpointer-sign (C and Objective-C only)' + Warn for pointer argument passing or assignment with different + signedness. This option is only supported for C and Objective-C. + It is implied by '-Wall' and by '-Wpedantic', which can be disabled + with '-Wno-pointer-sign'. + +'-Wstack-protector' + This option is only active when '-fstack-protector' is active. It + warns about functions that are not protected against stack + smashing. + +'-Woverlength-strings' + Warn about string constants that are longer than the "minimum + maximum" length specified in the C standard. Modern compilers + generally allow string constants that are much longer than the + standard's minimum limit, but very portable programs should avoid + using longer strings. + + The limit applies _after_ string constant concatenation, and does + not count the trailing NUL. In C90, the limit was 509 characters; + in C99, it was raised to 4095. C++98 does not specify a normative + minimum maximum, so we do not diagnose overlength strings in C++. + + This option is implied by '-Wpedantic', and can be disabled with + '-Wno-overlength-strings'. + +'-Wunsuffixed-float-constants (C and Objective-C only)' + + Issue a warning for any floating constant that does not have a + suffix. When used together with '-Wsystem-headers' it warns about + such constants in system header files. This can be useful when + preparing code to use with the 'FLOAT_CONST_DECIMAL64' pragma from + the decimal floating-point extension to C99. + + +File: gcc.info, Node: Debugging Options, Next: Optimize Options, Prev: Warning Options, Up: Invoking GCC + +3.9 Options for Debugging Your Program or GCC +============================================= + +GCC has various special options that are used for debugging either your +program or GCC: + +'-g' + Produce debugging information in the operating system's native + format (stabs, COFF, XCOFF, or DWARF 2). GDB can work with this + debugging information. + + On most systems that use stabs format, '-g' enables use of extra + debugging information that only GDB can use; this extra information + makes debugging work better in GDB but probably makes other + debuggers crash or refuse to read the program. If you want to + control for certain whether to generate the extra information, use + '-gstabs+', '-gstabs', '-gxcoff+', '-gxcoff', or '-gvms' (see + below). + + GCC allows you to use '-g' with '-O'. The shortcuts taken by + optimized code may occasionally produce surprising results: some + variables you declared may not exist at all; flow of control may + briefly move where you did not expect it; some statements may not + be executed because they compute constant results or their values + are already at hand; some statements may execute in different + places because they have been moved out of loops. + + Nevertheless it proves possible to debug optimized output. This + makes it reasonable to use the optimizer for programs that might + have bugs. + + The following options are useful when GCC is generated with the + capability for more than one debugging format. + +'-gsplit-dwarf' + Separate as much dwarf debugging information as possible into a + separate output file with the extension .dwo. This option allows + the build system to avoid linking files with debug information. To + be useful, this option requires a debugger capable of reading .dwo + files. + +'-ggdb' + Produce debugging information for use by GDB. This means to use + the most expressive format available (DWARF 2, stabs, or the native + format if neither of those are supported), including GDB extensions + if at all possible. + +'-gpubnames' + Generate dwarf .debug_pubnames and .debug_pubtypes sections. + +'-ggnu-pubnames' + Generate .debug_pubnames and .debug_pubtypes sections in a format + suitable for conversion into a GDB index. This option is only + useful with a linker that can produce GDB index version 7. + +'-gstabs' + Produce debugging information in stabs format (if that is + supported), without GDB extensions. This is the format used by DBX + on most BSD systems. On MIPS, Alpha and System V Release 4 systems + this option produces stabs debugging output that is not understood + by DBX or SDB. On System V Release 4 systems this option requires + the GNU assembler. + +'-feliminate-unused-debug-symbols' + Produce debugging information in stabs format (if that is + supported), for only symbols that are actually used. + +'-femit-class-debug-always' + Instead of emitting debugging information for a C++ class in only + one object file, emit it in all object files using the class. This + option should be used only with debuggers that are unable to handle + the way GCC normally emits debugging information for classes + because using this option increases the size of debugging + information by as much as a factor of two. + +'-fdebug-types-section' + When using DWARF Version 4 or higher, type DIEs can be put into + their own '.debug_types' section instead of making them part of the + '.debug_info' section. It is more efficient to put them in a + separate comdat sections since the linker can then remove + duplicates. But not all DWARF consumers support '.debug_types' + sections yet and on some objects '.debug_types' produces larger + instead of smaller debugging information. + +'-gstabs+' + Produce debugging information in stabs format (if that is + supported), using GNU extensions understood only by the GNU + debugger (GDB). The use of these extensions is likely to make + other debuggers crash or refuse to read the program. + +'-gcoff' + Produce debugging information in COFF format (if that is + supported). This is the format used by SDB on most System V + systems prior to System V Release 4. + +'-gxcoff' + Produce debugging information in XCOFF format (if that is + supported). This is the format used by the DBX debugger on IBM + RS/6000 systems. + +'-gxcoff+' + Produce debugging information in XCOFF format (if that is + supported), using GNU extensions understood only by the GNU + debugger (GDB). The use of these extensions is likely to make + other debuggers crash or refuse to read the program, and may cause + assemblers other than the GNU assembler (GAS) to fail with an + error. + +'-gdwarf-VERSION' + Produce debugging information in DWARF format (if that is + supported). The value of VERSION may be either 2, 3 or 4; the + default version for most targets is 4. + + Note that with DWARF Version 2, some ports require and always use + some non-conflicting DWARF 3 extensions in the unwind tables. + + Version 4 may require GDB 7.0 and '-fvar-tracking-assignments' for + maximum benefit. + +'-grecord-gcc-switches' + This switch causes the command-line options used to invoke the + compiler that may affect code generation to be appended to the + DW_AT_producer attribute in DWARF debugging information. The + options are concatenated with spaces separating them from each + other and from the compiler version. See also + '-frecord-gcc-switches' for another way of storing compiler options + into the object file. This is the default. + +'-gno-record-gcc-switches' + Disallow appending command-line options to the DW_AT_producer + attribute in DWARF debugging information. + +'-gstrict-dwarf' + Disallow using extensions of later DWARF standard version than + selected with '-gdwarf-VERSION'. On most targets using + non-conflicting DWARF extensions from later standard versions is + allowed. + +'-gno-strict-dwarf' + Allow using extensions of later DWARF standard version than + selected with '-gdwarf-VERSION'. + +'-gvms' + Produce debugging information in Alpha/VMS debug format (if that is + supported). This is the format used by DEBUG on Alpha/VMS systems. + +'-gLEVEL' +'-ggdbLEVEL' +'-gstabsLEVEL' +'-gcoffLEVEL' +'-gxcoffLEVEL' +'-gvmsLEVEL' + Request debugging information and also use LEVEL to specify how + much information. The default level is 2. + + Level 0 produces no debug information at all. Thus, '-g0' negates + '-g'. + + Level 1 produces minimal information, enough for making backtraces + in parts of the program that you don't plan to debug. This + includes descriptions of functions and external variables, and line + number tables, but no information about local variables. + + Level 3 includes extra information, such as all the macro + definitions present in the program. Some debuggers support macro + expansion when you use '-g3'. + + '-gdwarf-2' does not accept a concatenated debug level, because GCC + used to support an option '-gdwarf' that meant to generate debug + information in version 1 of the DWARF format (which is very + different from version 2), and it would have been too confusing. + That debug format is long obsolete, but the option cannot be + changed now. Instead use an additional '-gLEVEL' option to change + the debug level for DWARF. + +'-gtoggle' + Turn off generation of debug info, if leaving out this option + generates it, or turn it on at level 2 otherwise. The position of + this argument in the command line does not matter; it takes effect + after all other options are processed, and it does so only once, no + matter how many times it is given. This is mainly intended to be + used with '-fcompare-debug'. + +'-fsanitize=address' + Enable AddressSanitizer, a fast memory error detector. Memory + access instructions will be instrumented to detect out-of-bounds + and use-after-free bugs. See + <http://code.google.com/p/address-sanitizer/> for more details. + The run-time behavior can be influenced using the 'ASAN_OPTIONS' + environment variable; see + <https://code.google.com/p/address-sanitizer/wiki/Flags#Run-time_flags> + for a list of supported options. + +'-fsanitize=thread' + Enable ThreadSanitizer, a fast data race detector. Memory access + instructions will be instrumented to detect data race bugs. See + <http://code.google.com/p/thread-sanitizer/> for more details. The + run-time behavior can be influenced using the 'TSAN_OPTIONS' + environment variable; see + <https://code.google.com/p/thread-sanitizer/wiki/Flags> for a list + of supported options. + +'-fsanitize=leak' + Enable LeakSanitizer, a memory leak detector. This option only + matters for linking of executables and if neither + '-fsanitize=address' nor '-fsanitize=thread' is used. In that case + it will link the executable against a library that overrides + 'malloc' and other allocator functions. See + <https://code.google.com/p/address-sanitizer/wiki/LeakSanitizer> + for more details. The run-time behavior can be influenced using + the 'LSAN_OPTIONS' environment variable. + +'-fsanitize=undefined' + Enable UndefinedBehaviorSanitizer, a fast undefined behavior + detector. Various computations will be instrumented to detect + undefined behavior at runtime. Current suboptions are: + + '-fsanitize=shift' + + This option enables checking that the result of a shift + operation is not undefined. Note that what exactly is + considered undefined differs slightly between C and C++, as + well as between ISO C90 and C99, etc. + + '-fsanitize=integer-divide-by-zero' + + Detect integer division by zero as well as 'INT_MIN / -1' + division. + + '-fsanitize=unreachable' + + With this option, the compiler will turn the + '__builtin_unreachable' call into a diagnostics message call + instead. When reaching the '__builtin_unreachable' call, the + behavior is undefined. + + '-fsanitize=vla-bound' + + This option instructs the compiler to check that the size of a + variable length array is positive. This option does not have + any effect in '-std=c++1y' mode, as the standard requires the + exception be thrown instead. + + '-fsanitize=null' + + This option enables pointer checking. Particularly, the + application built with this option turned on will issue an + error message when it tries to dereference a NULL pointer, or + if a reference (possibly an rvalue reference) is bound to a + NULL pointer. + + '-fsanitize=return' + + This option enables return statement checking. Programs built + with this option turned on will issue an error message when + the end of a non-void function is reached without actually + returning a value. This option works in C++ only. + + '-fsanitize=signed-integer-overflow' + + This option enables signed integer overflow checking. We + check that the result of '+', '*', and both unary and binary + '-' does not overflow in the signed arithmetics. Note, + integer promotion rules must be taken into account. That is, + the following is not an overflow: + signed char a = SCHAR_MAX; + a++; + + While '-ftrapv' causes traps for signed overflows to be emitted, + '-fsanitize=undefined' gives a diagnostic message. This currently + works only for the C family of languages. + +'-fdump-final-insns[=FILE]' + Dump the final internal representation (RTL) to FILE. If the + optional argument is omitted (or if FILE is '.'), the name of the + dump file is determined by appending '.gkd' to the compilation + output file name. + +'-fcompare-debug[=OPTS]' + If no error occurs during compilation, run the compiler a second + time, adding OPTS and '-fcompare-debug-second' to the arguments + passed to the second compilation. Dump the final internal + representation in both compilations, and print an error if they + differ. + + If the equal sign is omitted, the default '-gtoggle' is used. + + The environment variable 'GCC_COMPARE_DEBUG', if defined, non-empty + and nonzero, implicitly enables '-fcompare-debug'. If + 'GCC_COMPARE_DEBUG' is defined to a string starting with a dash, + then it is used for OPTS, otherwise the default '-gtoggle' is used. + + '-fcompare-debug=', with the equal sign but without OPTS, is + equivalent to '-fno-compare-debug', which disables the dumping of + the final representation and the second compilation, preventing + even 'GCC_COMPARE_DEBUG' from taking effect. + + To verify full coverage during '-fcompare-debug' testing, set + 'GCC_COMPARE_DEBUG' to say '-fcompare-debug-not-overridden', which + GCC rejects as an invalid option in any actual compilation (rather + than preprocessing, assembly or linking). To get just a warning, + setting 'GCC_COMPARE_DEBUG' to '-w%n-fcompare-debug not overridden' + will do. + +'-fcompare-debug-second' + This option is implicitly passed to the compiler for the second + compilation requested by '-fcompare-debug', along with options to + silence warnings, and omitting other options that would cause + side-effect compiler outputs to files or to the standard output. + Dump files and preserved temporary files are renamed so as to + contain the '.gk' additional extension during the second + compilation, to avoid overwriting those generated by the first. + + When this option is passed to the compiler driver, it causes the + _first_ compilation to be skipped, which makes it useful for little + other than debugging the compiler proper. + +'-feliminate-dwarf2-dups' + Compress DWARF 2 debugging information by eliminating duplicated + information about each symbol. This option only makes sense when + generating DWARF 2 debugging information with '-gdwarf-2'. + +'-femit-struct-debug-baseonly' + Emit debug information for struct-like types only when the base + name of the compilation source file matches the base name of file + in which the struct is defined. + + This option substantially reduces the size of debugging + information, but at significant potential loss in type information + to the debugger. See '-femit-struct-debug-reduced' for a less + aggressive option. See '-femit-struct-debug-detailed' for more + detailed control. + + This option works only with DWARF 2. + +'-femit-struct-debug-reduced' + Emit debug information for struct-like types only when the base + name of the compilation source file matches the base name of file + in which the type is defined, unless the struct is a template or + defined in a system header. + + This option significantly reduces the size of debugging + information, with some potential loss in type information to the + debugger. See '-femit-struct-debug-baseonly' for a more aggressive + option. See '-femit-struct-debug-detailed' for more detailed + control. + + This option works only with DWARF 2. + +'-femit-struct-debug-detailed[=SPEC-LIST]' + Specify the struct-like types for which the compiler generates + debug information. The intent is to reduce duplicate struct debug + information between different object files within the same program. + + This option is a detailed version of '-femit-struct-debug-reduced' + and '-femit-struct-debug-baseonly', which serves for most needs. + + A specification has the syntax + ['dir:'|'ind:']['ord:'|'gen:']('any'|'sys'|'base'|'none') + + The optional first word limits the specification to structs that + are used directly ('dir:') or used indirectly ('ind:'). A struct + type is used directly when it is the type of a variable, member. + Indirect uses arise through pointers to structs. That is, when use + of an incomplete struct is valid, the use is indirect. An example + is 'struct one direct; struct two * indirect;'. + + The optional second word limits the specification to ordinary + structs ('ord:') or generic structs ('gen:'). Generic structs are + a bit complicated to explain. For C++, these are non-explicit + specializations of template classes, or non-template classes within + the above. Other programming languages have generics, but + '-femit-struct-debug-detailed' does not yet implement them. + + The third word specifies the source files for those structs for + which the compiler should emit debug information. The values + 'none' and 'any' have the normal meaning. The value 'base' means + that the base of name of the file in which the type declaration + appears must match the base of the name of the main compilation + file. In practice, this means that when compiling 'foo.c', debug + information is generated for types declared in that file and + 'foo.h', but not other header files. The value 'sys' means those + types satisfying 'base' or declared in system or compiler headers. + + You may need to experiment to determine the best settings for your + application. + + The default is '-femit-struct-debug-detailed=all'. + + This option works only with DWARF 2. + +'-fno-merge-debug-strings' + Direct the linker to not merge together strings in the debugging + information that are identical in different object files. Merging + is not supported by all assemblers or linkers. Merging decreases + the size of the debug information in the output file at the cost of + increasing link processing time. Merging is enabled by default. + +'-fdebug-prefix-map=OLD=NEW' + When compiling files in directory 'OLD', record debugging + information describing them as in 'NEW' instead. + +'-fno-dwarf2-cfi-asm' + Emit DWARF 2 unwind info as compiler generated '.eh_frame' section + instead of using GAS '.cfi_*' directives. + +'-p' + Generate extra code to write profile information suitable for the + analysis program 'prof'. You must use this option when compiling + the source files you want data about, and you must also use it when + linking. + +'-pg' + Generate extra code to write profile information suitable for the + analysis program 'gprof'. You must use this option when compiling + the source files you want data about, and you must also use it when + linking. + +'-Q' + Makes the compiler print out each function name as it is compiled, + and print some statistics about each pass when it finishes. + +'-ftime-report' + Makes the compiler print some statistics about the time consumed by + each pass when it finishes. + +'-fmem-report' + Makes the compiler print some statistics about permanent memory + allocation when it finishes. + +'-fmem-report-wpa' + Makes the compiler print some statistics about permanent memory + allocation for the WPA phase only. + +'-fpre-ipa-mem-report' +'-fpost-ipa-mem-report' + Makes the compiler print some statistics about permanent memory + allocation before or after interprocedural optimization. + +'-fprofile-report' + Makes the compiler print some statistics about consistency of the + (estimated) profile and effect of individual passes. + +'-fstack-usage' + Makes the compiler output stack usage information for the program, + on a per-function basis. The filename for the dump is made by + appending '.su' to the AUXNAME. AUXNAME is generated from the name + of the output file, if explicitly specified and it is not an + executable, otherwise it is the basename of the source file. An + entry is made up of three fields: + + * The name of the function. + * A number of bytes. + * One or more qualifiers: 'static', 'dynamic', 'bounded'. + + The qualifier 'static' means that the function manipulates the + stack statically: a fixed number of bytes are allocated for the + frame on function entry and released on function exit; no stack + adjustments are otherwise made in the function. The second field + is this fixed number of bytes. + + The qualifier 'dynamic' means that the function manipulates the + stack dynamically: in addition to the static allocation described + above, stack adjustments are made in the body of the function, for + example to push/pop arguments around function calls. If the + qualifier 'bounded' is also present, the amount of these + adjustments is bounded at compile time and the second field is an + upper bound of the total amount of stack used by the function. If + it is not present, the amount of these adjustments is not bounded + at compile time and the second field only represents the bounded + part. + +'-fprofile-arcs' + Add code so that program flow "arcs" are instrumented. During + execution the program records how many times each branch and call + is executed and how many times it is taken or returns. When the + compiled program exits it saves this data to a file called + 'AUXNAME.gcda' for each source file. The data may be used for + profile-directed optimizations ('-fbranch-probabilities'), or for + test coverage analysis ('-ftest-coverage'). Each object file's + AUXNAME is generated from the name of the output file, if + explicitly specified and it is not the final executable, otherwise + it is the basename of the source file. In both cases any suffix is + removed (e.g. 'foo.gcda' for input file 'dir/foo.c', or + 'dir/foo.gcda' for output file specified as '-o dir/foo.o'). *Note + Cross-profiling::. + +'--coverage' + + This option is used to compile and link code instrumented for + coverage analysis. The option is a synonym for '-fprofile-arcs' + '-ftest-coverage' (when compiling) and '-lgcov' (when linking). + See the documentation for those options for more details. + + * Compile the source files with '-fprofile-arcs' plus + optimization and code generation options. For test coverage + analysis, use the additional '-ftest-coverage' option. You do + not need to profile every source file in a program. + + * Link your object files with '-lgcov' or '-fprofile-arcs' (the + latter implies the former). + + * Run the program on a representative workload to generate the + arc profile information. This may be repeated any number of + times. You can run concurrent instances of your program, and + provided that the file system supports locking, the data files + will be correctly updated. Also 'fork' calls are detected and + correctly handled (double counting will not happen). + + * For profile-directed optimizations, compile the source files + again with the same optimization and code generation options + plus '-fbranch-probabilities' (*note Options that Control + Optimization: Optimize Options.). + + * For test coverage analysis, use 'gcov' to produce human + readable information from the '.gcno' and '.gcda' files. + Refer to the 'gcov' documentation for further information. + + With '-fprofile-arcs', for each function of your program GCC + creates a program flow graph, then finds a spanning tree for the + graph. Only arcs that are not on the spanning tree have to be + instrumented: the compiler adds code to count the number of times + that these arcs are executed. When an arc is the only exit or only + entrance to a block, the instrumentation code can be added to the + block; otherwise, a new basic block must be created to hold the + instrumentation code. + +'-ftest-coverage' + Produce a notes file that the 'gcov' code-coverage utility (*note + 'gcov'--a Test Coverage Program: Gcov.) can use to show program + coverage. Each source file's note file is called 'AUXNAME.gcno'. + Refer to the '-fprofile-arcs' option above for a description of + AUXNAME and instructions on how to generate test coverage data. + Coverage data matches the source files more closely if you do not + optimize. + +'-fdbg-cnt-list' + Print the name and the counter upper bound for all debug counters. + +'-fdbg-cnt=COUNTER-VALUE-LIST' + Set the internal debug counter upper bound. COUNTER-VALUE-LIST is + a comma-separated list of NAME:VALUE pairs which sets the upper + bound of each debug counter NAME to VALUE. All debug counters have + the initial upper bound of 'UINT_MAX'; thus 'dbg_cnt()' returns + true always unless the upper bound is set by this option. For + example, with '-fdbg-cnt=dce:10,tail_call:0', 'dbg_cnt(dce)' + returns true only for first 10 invocations. + +'-fenable-KIND-PASS' +'-fdisable-KIND-PASS=RANGE-LIST' + + This is a set of options that are used to explicitly disable/enable + optimization passes. These options are intended for use for + debugging GCC. Compiler users should use regular options for + enabling/disabling passes instead. + + '-fdisable-ipa-PASS' + Disable IPA pass PASS. PASS is the pass name. If the same + pass is statically invoked in the compiler multiple times, the + pass name should be appended with a sequential number starting + from 1. + + '-fdisable-rtl-PASS' + '-fdisable-rtl-PASS=RANGE-LIST' + Disable RTL pass PASS. PASS is the pass name. If the same + pass is statically invoked in the compiler multiple times, the + pass name should be appended with a sequential number starting + from 1. RANGE-LIST is a comma-separated list of function + ranges or assembler names. Each range is a number pair + separated by a colon. The range is inclusive in both ends. + If the range is trivial, the number pair can be simplified as + a single number. If the function's call graph node's UID + falls within one of the specified ranges, the PASS is disabled + for that function. The UID is shown in the function header of + a dump file, and the pass names can be dumped by using option + '-fdump-passes'. + + '-fdisable-tree-PASS' + '-fdisable-tree-PASS=RANGE-LIST' + Disable tree pass PASS. See '-fdisable-rtl' for the + description of option arguments. + + '-fenable-ipa-PASS' + Enable IPA pass PASS. PASS is the pass name. If the same + pass is statically invoked in the compiler multiple times, the + pass name should be appended with a sequential number starting + from 1. + + '-fenable-rtl-PASS' + '-fenable-rtl-PASS=RANGE-LIST' + Enable RTL pass PASS. See '-fdisable-rtl' for option argument + description and examples. + + '-fenable-tree-PASS' + '-fenable-tree-PASS=RANGE-LIST' + Enable tree pass PASS. See '-fdisable-rtl' for the + description of option arguments. + + Here are some examples showing uses of these options. + + + # disable ccp1 for all functions + -fdisable-tree-ccp1 + # disable complete unroll for function whose cgraph node uid is 1 + -fenable-tree-cunroll=1 + # disable gcse2 for functions at the following ranges [1,1], + # [300,400], and [400,1000] + # disable gcse2 for functions foo and foo2 + -fdisable-rtl-gcse2=foo,foo2 + # disable early inlining + -fdisable-tree-einline + # disable ipa inlining + -fdisable-ipa-inline + # enable tree full unroll + -fenable-tree-unroll + +'-dLETTERS' +'-fdump-rtl-PASS' +'-fdump-rtl-PASS=FILENAME' + Says to make debugging dumps during compilation at times specified + by LETTERS. This is used for debugging the RTL-based passes of the + compiler. The file names for most of the dumps are made by + appending a pass number and a word to the DUMPNAME, and the files + are created in the directory of the output file. In case of + '=FILENAME' option, the dump is output on the given file instead of + the pass numbered dump files. Note that the pass number is + computed statically as passes get registered into the pass manager. + Thus the numbering is not related to the dynamic order of execution + of passes. In particular, a pass installed by a plugin could have + a number over 200 even if it executed quite early. DUMPNAME is + generated from the name of the output file, if explicitly specified + and it is not an executable, otherwise it is the basename of the + source file. These switches may have different effects when '-E' + is used for preprocessing. + + Debug dumps can be enabled with a '-fdump-rtl' switch or some '-d' + option LETTERS. Here are the possible letters for use in PASS and + LETTERS, and their meanings: + + '-fdump-rtl-alignments' + Dump after branch alignments have been computed. + + '-fdump-rtl-asmcons' + Dump after fixing rtl statements that have unsatisfied in/out + constraints. + + '-fdump-rtl-auto_inc_dec' + Dump after auto-inc-dec discovery. This pass is only run on + architectures that have auto inc or auto dec instructions. + + '-fdump-rtl-barriers' + Dump after cleaning up the barrier instructions. + + '-fdump-rtl-bbpart' + Dump after partitioning hot and cold basic blocks. + + '-fdump-rtl-bbro' + Dump after block reordering. + + '-fdump-rtl-btl1' + '-fdump-rtl-btl2' + '-fdump-rtl-btl1' and '-fdump-rtl-btl2' enable dumping after + the two branch target load optimization passes. + + '-fdump-rtl-bypass' + Dump after jump bypassing and control flow optimizations. + + '-fdump-rtl-combine' + Dump after the RTL instruction combination pass. + + '-fdump-rtl-compgotos' + Dump after duplicating the computed gotos. + + '-fdump-rtl-ce1' + '-fdump-rtl-ce2' + '-fdump-rtl-ce3' + '-fdump-rtl-ce1', '-fdump-rtl-ce2', and '-fdump-rtl-ce3' + enable dumping after the three if conversion passes. + + '-fdump-rtl-cprop_hardreg' + Dump after hard register copy propagation. + + '-fdump-rtl-csa' + Dump after combining stack adjustments. + + '-fdump-rtl-cse1' + '-fdump-rtl-cse2' + '-fdump-rtl-cse1' and '-fdump-rtl-cse2' enable dumping after + the two common subexpression elimination passes. + + '-fdump-rtl-dce' + Dump after the standalone dead code elimination passes. + + '-fdump-rtl-dbr' + Dump after delayed branch scheduling. + + '-fdump-rtl-dce1' + '-fdump-rtl-dce2' + '-fdump-rtl-dce1' and '-fdump-rtl-dce2' enable dumping after + the two dead store elimination passes. + + '-fdump-rtl-eh' + Dump after finalization of EH handling code. + + '-fdump-rtl-eh_ranges' + Dump after conversion of EH handling range regions. + + '-fdump-rtl-expand' + Dump after RTL generation. + + '-fdump-rtl-fwprop1' + '-fdump-rtl-fwprop2' + '-fdump-rtl-fwprop1' and '-fdump-rtl-fwprop2' enable dumping + after the two forward propagation passes. + + '-fdump-rtl-gcse1' + '-fdump-rtl-gcse2' + '-fdump-rtl-gcse1' and '-fdump-rtl-gcse2' enable dumping after + global common subexpression elimination. + + '-fdump-rtl-init-regs' + Dump after the initialization of the registers. + + '-fdump-rtl-initvals' + Dump after the computation of the initial value sets. + + '-fdump-rtl-into_cfglayout' + Dump after converting to cfglayout mode. + + '-fdump-rtl-ira' + Dump after iterated register allocation. + + '-fdump-rtl-jump' + Dump after the second jump optimization. + + '-fdump-rtl-loop2' + '-fdump-rtl-loop2' enables dumping after the rtl loop + optimization passes. + + '-fdump-rtl-mach' + Dump after performing the machine dependent reorganization + pass, if that pass exists. + + '-fdump-rtl-mode_sw' + Dump after removing redundant mode switches. + + '-fdump-rtl-rnreg' + Dump after register renumbering. + + '-fdump-rtl-outof_cfglayout' + Dump after converting from cfglayout mode. + + '-fdump-rtl-peephole2' + Dump after the peephole pass. + + '-fdump-rtl-postreload' + Dump after post-reload optimizations. + + '-fdump-rtl-pro_and_epilogue' + Dump after generating the function prologues and epilogues. + + '-fdump-rtl-sched1' + '-fdump-rtl-sched2' + '-fdump-rtl-sched1' and '-fdump-rtl-sched2' enable dumping + after the basic block scheduling passes. + + '-fdump-rtl-ree' + Dump after sign/zero extension elimination. + + '-fdump-rtl-seqabstr' + Dump after common sequence discovery. + + '-fdump-rtl-shorten' + Dump after shortening branches. + + '-fdump-rtl-sibling' + Dump after sibling call optimizations. + + '-fdump-rtl-split1' + '-fdump-rtl-split2' + '-fdump-rtl-split3' + '-fdump-rtl-split4' + '-fdump-rtl-split5' + '-fdump-rtl-split1', '-fdump-rtl-split2', '-fdump-rtl-split3', + '-fdump-rtl-split4' and '-fdump-rtl-split5' enable dumping + after five rounds of instruction splitting. + + '-fdump-rtl-sms' + Dump after modulo scheduling. This pass is only run on some + architectures. + + '-fdump-rtl-stack' + Dump after conversion from GCC's "flat register file" + registers to the x87's stack-like registers. This pass is + only run on x86 variants. + + '-fdump-rtl-subreg1' + '-fdump-rtl-subreg2' + '-fdump-rtl-subreg1' and '-fdump-rtl-subreg2' enable dumping + after the two subreg expansion passes. + + '-fdump-rtl-unshare' + Dump after all rtl has been unshared. + + '-fdump-rtl-vartrack' + Dump after variable tracking. + + '-fdump-rtl-vregs' + Dump after converting virtual registers to hard registers. + + '-fdump-rtl-web' + Dump after live range splitting. + + '-fdump-rtl-regclass' + '-fdump-rtl-subregs_of_mode_init' + '-fdump-rtl-subregs_of_mode_finish' + '-fdump-rtl-dfinit' + '-fdump-rtl-dfinish' + These dumps are defined but always produce empty files. + + '-da' + '-fdump-rtl-all' + Produce all the dumps listed above. + + '-dA' + Annotate the assembler output with miscellaneous debugging + information. + + '-dD' + Dump all macro definitions, at the end of preprocessing, in + addition to normal output. + + '-dH' + Produce a core dump whenever an error occurs. + + '-dp' + Annotate the assembler output with a comment indicating which + pattern and alternative is used. The length of each + instruction is also printed. + + '-dP' + Dump the RTL in the assembler output as a comment before each + instruction. Also turns on '-dp' annotation. + + '-dx' + Just generate RTL for a function instead of compiling it. + Usually used with '-fdump-rtl-expand'. + +'-fdump-noaddr' + When doing debugging dumps, suppress address output. This makes it + more feasible to use diff on debugging dumps for compiler + invocations with different compiler binaries and/or different text + / bss / data / heap / stack / dso start locations. + +'-fdump-unnumbered' + When doing debugging dumps, suppress instruction numbers and + address output. This makes it more feasible to use diff on + debugging dumps for compiler invocations with different options, in + particular with and without '-g'. + +'-fdump-unnumbered-links' + When doing debugging dumps (see '-d' option above), suppress + instruction numbers for the links to the previous and next + instructions in a sequence. + +'-fdump-translation-unit (C++ only)' +'-fdump-translation-unit-OPTIONS (C++ only)' + Dump a representation of the tree structure for the entire + translation unit to a file. The file name is made by appending + '.tu' to the source file name, and the file is created in the same + directory as the output file. If the '-OPTIONS' form is used, + OPTIONS controls the details of the dump as described for the + '-fdump-tree' options. + +'-fdump-class-hierarchy (C++ only)' +'-fdump-class-hierarchy-OPTIONS (C++ only)' + Dump a representation of each class's hierarchy and virtual + function table layout to a file. The file name is made by + appending '.class' to the source file name, and the file is created + in the same directory as the output file. If the '-OPTIONS' form + is used, OPTIONS controls the details of the dump as described for + the '-fdump-tree' options. + +'-fdump-ipa-SWITCH' + Control the dumping at various stages of inter-procedural analysis + language tree to a file. The file name is generated by appending a + switch specific suffix to the source file name, and the file is + created in the same directory as the output file. The following + dumps are possible: + + 'all' + Enables all inter-procedural analysis dumps. + + 'cgraph' + Dumps information about call-graph optimization, unused + function removal, and inlining decisions. + + 'inline' + Dump after function inlining. + +'-fdump-passes' + Dump the list of optimization passes that are turned on and off by + the current command-line options. + +'-fdump-statistics-OPTION' + Enable and control dumping of pass statistics in a separate file. + The file name is generated by appending a suffix ending in + '.statistics' to the source file name, and the file is created in + the same directory as the output file. If the '-OPTION' form is + used, '-stats' causes counters to be summed over the whole + compilation unit while '-details' dumps every event as the passes + generate them. The default with no option is to sum counters for + each function compiled. + +'-fdump-tree-SWITCH' +'-fdump-tree-SWITCH-OPTIONS' +'-fdump-tree-SWITCH-OPTIONS=FILENAME' + Control the dumping at various stages of processing the + intermediate language tree to a file. The file name is generated + by appending a switch-specific suffix to the source file name, and + the file is created in the same directory as the output file. In + case of '=FILENAME' option, the dump is output on the given file + instead of the auto named dump files. If the '-OPTIONS' form is + used, OPTIONS is a list of '-' separated options which control the + details of the dump. Not all options are applicable to all dumps; + those that are not meaningful are ignored. The following options + are available + + 'address' + Print the address of each node. Usually this is not + meaningful as it changes according to the environment and + source file. Its primary use is for tying up a dump file with + a debug environment. + 'asmname' + If 'DECL_ASSEMBLER_NAME' has been set for a given decl, use + that in the dump instead of 'DECL_NAME'. Its primary use is + ease of use working backward from mangled names in the + assembly file. + 'slim' + When dumping front-end intermediate representations, inhibit + dumping of members of a scope or body of a function merely + because that scope has been reached. Only dump such items + when they are directly reachable by some other path. + + When dumping pretty-printed trees, this option inhibits + dumping the bodies of control structures. + + When dumping RTL, print the RTL in slim (condensed) form + instead of the default LISP-like representation. + 'raw' + Print a raw representation of the tree. By default, trees are + pretty-printed into a C-like representation. + 'details' + Enable more detailed dumps (not honored by every dump option). + Also include information from the optimization passes. + 'stats' + Enable dumping various statistics about the pass (not honored + by every dump option). + 'blocks' + Enable showing basic block boundaries (disabled in raw dumps). + 'graph' + For each of the other indicated dump files + ('-fdump-rtl-PASS'), dump a representation of the control flow + graph suitable for viewing with GraphViz to + 'FILE.PASSID.PASS.dot'. Each function in the file is + pretty-printed as a subgraph, so that GraphViz can render them + all in a single plot. + + This option currently only works for RTL dumps, and the RTL is + always dumped in slim form. + 'vops' + Enable showing virtual operands for every statement. + 'lineno' + Enable showing line numbers for statements. + 'uid' + Enable showing the unique ID ('DECL_UID') for each variable. + 'verbose' + Enable showing the tree dump for each statement. + 'eh' + Enable showing the EH region number holding each statement. + 'scev' + Enable showing scalar evolution analysis details. + 'optimized' + Enable showing optimization information (only available in + certain passes). + 'missed' + Enable showing missed optimization information (only available + in certain passes). + 'notes' + Enable other detailed optimization information (only available + in certain passes). + '=FILENAME' + Instead of an auto named dump file, output into the given file + name. The file names 'stdout' and 'stderr' are treated + specially and are considered already open standard streams. + For example, + + gcc -O2 -ftree-vectorize -fdump-tree-vect-blocks=foo.dump + -fdump-tree-pre=stderr file.c + + outputs vectorizer dump into 'foo.dump', while the PRE dump is + output on to 'stderr'. If two conflicting dump filenames are + given for the same pass, then the latter option overrides the + earlier one. + + 'all' + Turn on all options, except 'raw', 'slim', 'verbose' and + 'lineno'. + + 'optall' + Turn on all optimization options, i.e., 'optimized', 'missed', + and 'note'. + + The following tree dumps are possible: + + 'original' + Dump before any tree based optimization, to 'FILE.original'. + + 'optimized' + Dump after all tree based optimization, to 'FILE.optimized'. + + 'gimple' + Dump each function before and after the gimplification pass to + a file. The file name is made by appending '.gimple' to the + source file name. + + 'cfg' + Dump the control flow graph of each function to a file. The + file name is made by appending '.cfg' to the source file name. + + 'ch' + Dump each function after copying loop headers. The file name + is made by appending '.ch' to the source file name. + + 'ssa' + Dump SSA related information to a file. The file name is made + by appending '.ssa' to the source file name. + + 'alias' + Dump aliasing information for each function. The file name is + made by appending '.alias' to the source file name. + + 'ccp' + Dump each function after CCP. The file name is made by + appending '.ccp' to the source file name. + + 'storeccp' + Dump each function after STORE-CCP. The file name is made by + appending '.storeccp' to the source file name. + + 'pre' + Dump trees after partial redundancy elimination. The file + name is made by appending '.pre' to the source file name. + + 'fre' + Dump trees after full redundancy elimination. The file name + is made by appending '.fre' to the source file name. + + 'copyprop' + Dump trees after copy propagation. The file name is made by + appending '.copyprop' to the source file name. + + 'store_copyprop' + Dump trees after store copy-propagation. The file name is + made by appending '.store_copyprop' to the source file name. + + 'dce' + Dump each function after dead code elimination. The file name + is made by appending '.dce' to the source file name. + + 'sra' + Dump each function after performing scalar replacement of + aggregates. The file name is made by appending '.sra' to the + source file name. + + 'sink' + Dump each function after performing code sinking. The file + name is made by appending '.sink' to the source file name. + + 'dom' + Dump each function after applying dominator tree + optimizations. The file name is made by appending '.dom' to + the source file name. + + 'dse' + Dump each function after applying dead store elimination. The + file name is made by appending '.dse' to the source file name. + + 'phiopt' + Dump each function after optimizing PHI nodes into + straightline code. The file name is made by appending + '.phiopt' to the source file name. + + 'forwprop' + Dump each function after forward propagating single use + variables. The file name is made by appending '.forwprop' to + the source file name. + + 'copyrename' + Dump each function after applying the copy rename + optimization. The file name is made by appending + '.copyrename' to the source file name. + + 'nrv' + Dump each function after applying the named return value + optimization on generic trees. The file name is made by + appending '.nrv' to the source file name. + + 'vect' + Dump each function after applying vectorization of loops. The + file name is made by appending '.vect' to the source file + name. + + 'slp' + Dump each function after applying vectorization of basic + blocks. The file name is made by appending '.slp' to the + source file name. + + 'vrp' + Dump each function after Value Range Propagation (VRP). The + file name is made by appending '.vrp' to the source file name. + + 'all' + Enable all the available tree dumps with the flags provided in + this option. + +'-fopt-info' +'-fopt-info-OPTIONS' +'-fopt-info-OPTIONS=FILENAME' + Controls optimization dumps from various optimization passes. If + the '-OPTIONS' form is used, OPTIONS is a list of '-' separated + options to select the dump details and optimizations. If OPTIONS + is not specified, it defaults to 'optimized' for details and + 'optall' for optimization groups. If the FILENAME is not + specified, it defaults to 'stderr'. Note that the output FILENAME + will be overwritten in case of multiple translation units. If a + combined output from multiple translation units is desired, + 'stderr' should be used instead. + + The options can be divided into two groups, 1) options describing + the verbosity of the dump, and 2) options describing which + optimizations should be included. The options from both the groups + can be freely mixed as they are non-overlapping. However, in case + of any conflicts, the latter options override the earlier options + on the command line. Though multiple -fopt-info options are + accepted, only one of them can have '=filename'. If other + filenames are provided then all but the first one are ignored. + + The dump verbosity has the following options + + 'optimized' + Print information when an optimization is successfully + applied. It is up to a pass to decide which information is + relevant. For example, the vectorizer passes print the source + location of loops which got successfully vectorized. + 'missed' + Print information about missed optimizations. Individual + passes control which information to include in the output. + For example, + + gcc -O2 -ftree-vectorize -fopt-info-vec-missed + + will print information about missed optimization opportunities + from vectorization passes on stderr. + 'note' + Print verbose information about optimizations, such as certain + transformations, more detailed messages about decisions etc. + 'all' + Print detailed optimization information. This includes + OPTIMIZED, MISSED, and NOTE. + + The second set of options describes a group of optimizations and + may include one or more of the following. + + 'ipa' + Enable dumps from all interprocedural optimizations. + 'loop' + Enable dumps from all loop optimizations. + 'inline' + Enable dumps from all inlining optimizations. + 'vec' + Enable dumps from all vectorization optimizations. + 'optall' + Enable dumps from all optimizations. This is a superset of + the optimization groups listed above. + + For example, + gcc -O3 -fopt-info-missed=missed.all + + outputs missed optimization report from all the passes into + 'missed.all'. + + As another example, + gcc -O3 -fopt-info-inline-optimized-missed=inline.txt + + will output information about missed optimizations as well as + optimized locations from all the inlining passes into 'inline.txt'. + + If the FILENAME is provided, then the dumps from all the applicable + optimizations are concatenated into the 'filename'. Otherwise the + dump is output onto 'stderr'. If OPTIONS is omitted, it defaults + to 'all-optall', which means dump all available optimization info + from all the passes. In the following example, all optimization + info is output on to 'stderr'. + + gcc -O3 -fopt-info + + Note that '-fopt-info-vec-missed' behaves the same as + '-fopt-info-missed-vec'. + + As another example, consider + + gcc -fopt-info-vec-missed=vec.miss -fopt-info-loop-optimized=loop.opt + + Here the two output filenames 'vec.miss' and 'loop.opt' are in + conflict since only one output file is allowed. In this case, only + the first option takes effect and the subsequent options are + ignored. Thus only the 'vec.miss' is produced which contains dumps + from the vectorizer about missed opportunities. + +'-frandom-seed=STRING' + This option provides a seed that GCC uses in place of random + numbers in generating certain symbol names that have to be + different in every compiled file. It is also used to place unique + stamps in coverage data files and the object files that produce + them. You can use the '-frandom-seed' option to produce + reproducibly identical object files. + + The STRING should be different for every file you compile. + +'-fsched-verbose=N' + On targets that use instruction scheduling, this option controls + the amount of debugging output the scheduler prints. This + information is written to standard error, unless + '-fdump-rtl-sched1' or '-fdump-rtl-sched2' is specified, in which + case it is output to the usual dump listing file, '.sched1' or + '.sched2' respectively. However for N greater than nine, the + output is always printed to standard error. + + For N greater than zero, '-fsched-verbose' outputs the same + information as '-fdump-rtl-sched1' and '-fdump-rtl-sched2'. For N + greater than one, it also output basic block probabilities, + detailed ready list information and unit/insn info. For N greater + than two, it includes RTL at abort point, control-flow and regions + info. And for N over four, '-fsched-verbose' also includes + dependence info. + +'-save-temps' +'-save-temps=cwd' + Store the usual "temporary" intermediate files permanently; place + them in the current directory and name them based on the source + file. Thus, compiling 'foo.c' with '-c -save-temps' produces files + 'foo.i' and 'foo.s', as well as 'foo.o'. This creates a + preprocessed 'foo.i' output file even though the compiler now + normally uses an integrated preprocessor. + + When used in combination with the '-x' command-line option, + '-save-temps' is sensible enough to avoid over writing an input + source file with the same extension as an intermediate file. The + corresponding intermediate file may be obtained by renaming the + source file before using '-save-temps'. + + If you invoke GCC in parallel, compiling several different source + files that share a common base name in different subdirectories or + the same source file compiled for multiple output destinations, it + is likely that the different parallel compilers will interfere with + each other, and overwrite the temporary files. For instance: + + gcc -save-temps -o outdir1/foo.o indir1/foo.c& + gcc -save-temps -o outdir2/foo.o indir2/foo.c& + + may result in 'foo.i' and 'foo.o' being written to simultaneously + by both compilers. + +'-save-temps=obj' + Store the usual "temporary" intermediate files permanently. If the + '-o' option is used, the temporary files are based on the object + file. If the '-o' option is not used, the '-save-temps=obj' switch + behaves like '-save-temps'. + + For example: + + gcc -save-temps=obj -c foo.c + gcc -save-temps=obj -c bar.c -o dir/xbar.o + gcc -save-temps=obj foobar.c -o dir2/yfoobar + + creates 'foo.i', 'foo.s', 'dir/xbar.i', 'dir/xbar.s', + 'dir2/yfoobar.i', 'dir2/yfoobar.s', and 'dir2/yfoobar.o'. + +'-time[=FILE]' + Report the CPU time taken by each subprocess in the compilation + sequence. For C source files, this is the compiler proper and + assembler (plus the linker if linking is done). + + Without the specification of an output file, the output looks like + this: + + # cc1 0.12 0.01 + # as 0.00 0.01 + + The first number on each line is the "user time", that is time + spent executing the program itself. The second number is "system + time", time spent executing operating system routines on behalf of + the program. Both numbers are in seconds. + + With the specification of an output file, the output is appended to + the named file, and it looks like this: + + 0.12 0.01 cc1 OPTIONS + 0.00 0.01 as OPTIONS + + The "user time" and the "system time" are moved before the program + name, and the options passed to the program are displayed, so that + one can later tell what file was being compiled, and with which + options. + +'-fvar-tracking' + Run variable tracking pass. It computes where variables are stored + at each position in code. Better debugging information is then + generated (if the debugging information format supports this + information). + + It is enabled by default when compiling with optimization ('-Os', + '-O', '-O2', ...), debugging information ('-g') and the debug info + format supports it. + +'-fvar-tracking-assignments' + Annotate assignments to user variables early in the compilation and + attempt to carry the annotations over throughout the compilation + all the way to the end, in an attempt to improve debug information + while optimizing. Use of '-gdwarf-4' is recommended along with it. + + It can be enabled even if var-tracking is disabled, in which case + annotations are created and maintained, but discarded at the end. + +'-fvar-tracking-assignments-toggle' + Toggle '-fvar-tracking-assignments', in the same way that + '-gtoggle' toggles '-g'. + +'-print-file-name=LIBRARY' + Print the full absolute name of the library file LIBRARY that would + be used when linking--and don't do anything else. With this + option, GCC does not compile or link anything; it just prints the + file name. + +'-print-multi-directory' + Print the directory name corresponding to the multilib selected by + any other switches present in the command line. This directory is + supposed to exist in 'GCC_EXEC_PREFIX'. + +'-print-multi-lib' + Print the mapping from multilib directory names to compiler + switches that enable them. The directory name is separated from + the switches by ';', and each switch starts with an '@' instead of + the '-', without spaces between multiple switches. This is + supposed to ease shell processing. + +'-print-multi-os-directory' + Print the path to OS libraries for the selected multilib, relative + to some 'lib' subdirectory. If OS libraries are present in the + 'lib' subdirectory and no multilibs are used, this is usually just + '.', if OS libraries are present in 'libSUFFIX' sibling directories + this prints e.g. '../lib64', '../lib' or '../lib32', or if OS + libraries are present in 'lib/SUBDIR' subdirectories it prints e.g. + 'amd64', 'sparcv9' or 'ev6'. + +'-print-multiarch' + Print the path to OS libraries for the selected multiarch, relative + to some 'lib' subdirectory. + +'-print-prog-name=PROGRAM' + Like '-print-file-name', but searches for a program such as 'cpp'. + +'-print-libgcc-file-name' + Same as '-print-file-name=libgcc.a'. + + This is useful when you use '-nostdlib' or '-nodefaultlibs' but you + do want to link with 'libgcc.a'. You can do: + + gcc -nostdlib FILES... `gcc -print-libgcc-file-name` + +'-print-search-dirs' + Print the name of the configured installation directory and a list + of program and library directories 'gcc' searches--and don't do + anything else. + + This is useful when 'gcc' prints the error message 'installation + problem, cannot exec cpp0: No such file or directory'. To resolve + this you either need to put 'cpp0' and the other compiler + components where 'gcc' expects to find them, or you can set the + environment variable 'GCC_EXEC_PREFIX' to the directory where you + installed them. Don't forget the trailing '/'. *Note Environment + Variables::. + +'-print-sysroot' + Print the target sysroot directory that is used during compilation. + This is the target sysroot specified either at configure time or + using the '--sysroot' option, possibly with an extra suffix that + depends on compilation options. If no target sysroot is specified, + the option prints nothing. + +'-print-sysroot-headers-suffix' + Print the suffix added to the target sysroot when searching for + headers, or give an error if the compiler is not configured with + such a suffix--and don't do anything else. + +'-dumpmachine' + Print the compiler's target machine (for example, + 'i686-pc-linux-gnu')--and don't do anything else. + +'-dumpversion' + Print the compiler version (for example, '3.0')--and don't do + anything else. + +'-dumpspecs' + Print the compiler's built-in specs--and don't do anything else. + (This is used when GCC itself is being built.) *Note Spec Files::. + +'-fno-eliminate-unused-debug-types' + Normally, when producing DWARF 2 output, GCC avoids producing debug + symbol output for types that are nowhere used in the source file + being compiled. Sometimes it is useful to have GCC emit debugging + information for all types declared in a compilation unit, + regardless of whether or not they are actually used in that + compilation unit, for example if, in the debugger, you want to cast + a value to a type that is not actually used in your program (but is + declared). More often, however, this results in a significant + amount of wasted space. + + +File: gcc.info, Node: Optimize Options, Next: Preprocessor Options, Prev: Debugging Options, Up: Invoking GCC + +3.10 Options That Control Optimization +====================================== + +These options control various sorts of optimizations. + + Without any optimization option, the compiler's goal is to reduce the +cost of compilation and to make debugging produce the expected results. +Statements are independent: if you stop the program with a breakpoint +between statements, you can then assign a new value to any variable or +change the program counter to any other statement in the function and +get exactly the results you expect from the source code. + + Turning on optimization flags makes the compiler attempt to improve the +performance and/or code size at the expense of compilation time and +possibly the ability to debug the program. + + The compiler performs optimization based on the knowledge it has of the +program. Compiling multiple files at once to a single output file mode +allows the compiler to use information gained from all of the files when +compiling each of them. + + Not all optimizations are controlled directly by a flag. Only +optimizations that have a flag are listed in this section. + + Most optimizations are only enabled if an '-O' level is set on the +command line. Otherwise they are disabled, even if individual +optimization flags are specified. + + Depending on the target and how GCC was configured, a slightly +different set of optimizations may be enabled at each '-O' level than +those listed here. You can invoke GCC with '-Q --help=optimizers' to +find out the exact set of optimizations that are enabled at each level. +*Note Overall Options::, for examples. + +'-O' +'-O1' + Optimize. Optimizing compilation takes somewhat more time, and a + lot more memory for a large function. + + With '-O', the compiler tries to reduce code size and execution + time, without performing any optimizations that take a great deal + of compilation time. + + '-O' turns on the following optimization flags: + -fauto-inc-dec + -fcompare-elim + -fcprop-registers + -fdce + -fdefer-pop + -fdelayed-branch + -fdse + -fguess-branch-probability + -fif-conversion2 + -fif-conversion + -fipa-pure-const + -fipa-profile + -fipa-reference + -fmerge-constants + -fsplit-wide-types + -ftree-bit-ccp + -ftree-builtin-call-dce + -ftree-ccp + -ftree-ch + -ftree-copyrename + -ftree-dce + -ftree-dominator-opts + -ftree-dse + -ftree-forwprop + -ftree-fre + -ftree-phiprop + -ftree-slsr + -ftree-sra + -ftree-pta + -ftree-ter + -funit-at-a-time + + '-O' also turns on '-fomit-frame-pointer' on machines where doing + so does not interfere with debugging. + +'-O2' + Optimize even more. GCC performs nearly all supported + optimizations that do not involve a space-speed tradeoff. As + compared to '-O', this option increases both compilation time and + the performance of the generated code. + + '-O2' turns on all optimization flags specified by '-O'. It also + turns on the following optimization flags: + -fthread-jumps + -falign-functions -falign-jumps + -falign-loops -falign-labels + -fcaller-saves + -fcrossjumping + -fcse-follow-jumps -fcse-skip-blocks + -fdelete-null-pointer-checks + -fdevirtualize -fdevirtualize-speculatively + -fexpensive-optimizations + -fgcse -fgcse-lm + -fhoist-adjacent-loads + -finline-small-functions + -findirect-inlining + -fipa-sra + -fisolate-erroneous-paths-dereference + -foptimize-sibling-calls + -fpartial-inlining + -fpeephole2 + -freorder-blocks -freorder-functions + -frerun-cse-after-loop + -fsched-interblock -fsched-spec + -fschedule-insns -fschedule-insns2 + -fstrict-aliasing -fstrict-overflow + -ftree-switch-conversion -ftree-tail-merge + -ftree-pre + -ftree-vrp + + Please note the warning under '-fgcse' about invoking '-O2' on + programs that use computed gotos. + +'-O3' + Optimize yet more. '-O3' turns on all optimizations specified by + '-O2' and also turns on the '-finline-functions', + '-funswitch-loops', '-fpredictive-commoning', + '-fgcse-after-reload', '-ftree-loop-vectorize', + '-ftree-slp-vectorize', '-fvect-cost-model', '-ftree-partial-pre' + and '-fipa-cp-clone' options. + +'-O0' + Reduce compilation time and make debugging produce the expected + results. This is the default. + +'-Os' + Optimize for size. '-Os' enables all '-O2' optimizations that do + not typically increase code size. It also performs further + optimizations designed to reduce code size. + + '-Os' disables the following optimization flags: + -falign-functions -falign-jumps -falign-loops + -falign-labels -freorder-blocks -freorder-blocks-and-partition + -fprefetch-loop-arrays + +'-Ofast' + Disregard strict standards compliance. '-Ofast' enables all '-O3' + optimizations. It also enables optimizations that are not valid + for all standard-compliant programs. It turns on '-ffast-math' and + the Fortran-specific '-fno-protect-parens' and '-fstack-arrays'. + +'-Og' + Optimize debugging experience. '-Og' enables optimizations that do + not interfere with debugging. It should be the optimization level + of choice for the standard edit-compile-debug cycle, offering a + reasonable level of optimization while maintaining fast compilation + and a good debugging experience. + + If you use multiple '-O' options, with or without level numbers, + the last such option is the one that is effective. + + Options of the form '-fFLAG' specify machine-independent flags. Most +flags have both positive and negative forms; the negative form of +'-ffoo' is '-fno-foo'. In the table below, only one of the forms is +listed--the one you typically use. You can figure out the other form by +either removing 'no-' or adding it. + + The following options control specific optimizations. They are either +activated by '-O' options or are related to ones that are. You can use +the following flags in the rare cases when "fine-tuning" of +optimizations to be performed is desired. + +'-fno-defer-pop' + Always pop the arguments to each function call as soon as that + function returns. For machines that must pop arguments after a + function call, the compiler normally lets arguments accumulate on + the stack for several function calls and pops them all at once. + + Disabled at levels '-O', '-O2', '-O3', '-Os'. + +'-fforward-propagate' + Perform a forward propagation pass on RTL. The pass tries to + combine two instructions and checks if the result can be + simplified. If loop unrolling is active, two passes are performed + and the second is scheduled after loop unrolling. + + This option is enabled by default at optimization levels '-O', + '-O2', '-O3', '-Os'. + +'-ffp-contract=STYLE' + '-ffp-contract=off' disables floating-point expression contraction. + '-ffp-contract=fast' enables floating-point expression contraction + such as forming of fused multiply-add operations if the target has + native support for them. '-ffp-contract=on' enables floating-point + expression contraction if allowed by the language standard. This + is currently not implemented and treated equal to + '-ffp-contract=off'. + + The default is '-ffp-contract=fast'. + +'-fomit-frame-pointer' + Don't keep the frame pointer in a register for functions that don't + need one. This avoids the instructions to save, set up and restore + frame pointers; it also makes an extra register available in many + functions. *It also makes debugging impossible on some machines.* + + On some machines, such as the VAX, this flag has no effect, because + the standard calling sequence automatically handles the frame + pointer and nothing is saved by pretending it doesn't exist. The + machine-description macro 'FRAME_POINTER_REQUIRED' controls whether + a target machine supports this flag. *Note Register Usage: + (gccint)Registers. + + Starting with GCC version 4.6, the default setting (when not + optimizing for size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86 + targets has been changed to '-fomit-frame-pointer'. The default + can be reverted to '-fno-omit-frame-pointer' by configuring GCC + with the '--enable-frame-pointer' configure option. + + Enabled at levels '-O', '-O2', '-O3', '-Os'. + +'-foptimize-sibling-calls' + Optimize sibling and tail recursive calls. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fno-inline' + Do not expand any functions inline apart from those marked with the + 'always_inline' attribute. This is the default when not + optimizing. + + Single functions can be exempted from inlining by marking them with + the 'noinline' attribute. + +'-finline-small-functions' + Integrate functions into their callers when their body is smaller + than expected function call code (so overall size of program gets + smaller). The compiler heuristically decides which functions are + simple enough to be worth integrating in this way. This inlining + applies to all functions, even those not declared inline. + + Enabled at level '-O2'. + +'-findirect-inlining' + Inline also indirect calls that are discovered to be known at + compile time thanks to previous inlining. This option has any + effect only when inlining itself is turned on by the + '-finline-functions' or '-finline-small-functions' options. + + Enabled at level '-O2'. + +'-finline-functions' + Consider all functions for inlining, even if they are not declared + inline. The compiler heuristically decides which functions are + worth integrating in this way. + + If all calls to a given function are integrated, and the function + is declared 'static', then the function is normally not output as + assembler code in its own right. + + Enabled at level '-O3'. + +'-finline-functions-called-once' + Consider all 'static' functions called once for inlining into their + caller even if they are not marked 'inline'. If a call to a given + function is integrated, then the function is not output as + assembler code in its own right. + + Enabled at levels '-O1', '-O2', '-O3' and '-Os'. + +'-fearly-inlining' + Inline functions marked by 'always_inline' and functions whose body + seems smaller than the function call overhead early before doing + '-fprofile-generate' instrumentation and real inlining pass. Doing + so makes profiling significantly cheaper and usually inlining + faster on programs having large chains of nested wrapper functions. + + Enabled by default. + +'-fipa-sra' + Perform interprocedural scalar replacement of aggregates, removal + of unused parameters and replacement of parameters passed by + reference by parameters passed by value. + + Enabled at levels '-O2', '-O3' and '-Os'. + +'-finline-limit=N' + By default, GCC limits the size of functions that can be inlined. + This flag allows coarse control of this limit. N is the size of + functions that can be inlined in number of pseudo instructions. + + Inlining is actually controlled by a number of parameters, which + may be specified individually by using '--param NAME=VALUE'. The + '-finline-limit=N' option sets some of these parameters as follows: + + 'max-inline-insns-single' + is set to N/2. + 'max-inline-insns-auto' + is set to N/2. + + See below for a documentation of the individual parameters + controlling inlining and for the defaults of these parameters. + + _Note:_ there may be no value to '-finline-limit' that results in + default behavior. + + _Note:_ pseudo instruction represents, in this particular context, + an abstract measurement of function's size. In no way does it + represent a count of assembly instructions and as such its exact + meaning might change from one release to an another. + +'-fno-keep-inline-dllexport' + This is a more fine-grained version of '-fkeep-inline-functions', + which applies only to functions that are declared using the + 'dllexport' attribute or declspec (*Note Declaring Attributes of + Functions: Function Attributes.) + +'-fkeep-inline-functions' + In C, emit 'static' functions that are declared 'inline' into the + object file, even if the function has been inlined into all of its + callers. This switch does not affect functions using the 'extern + inline' extension in GNU C90. In C++, emit any and all inline + functions into the object file. + +'-fkeep-static-consts' + Emit variables declared 'static const' when optimization isn't + turned on, even if the variables aren't referenced. + + GCC enables this option by default. If you want to force the + compiler to check if a variable is referenced, regardless of + whether or not optimization is turned on, use the + '-fno-keep-static-consts' option. + +'-fmerge-constants' + Attempt to merge identical constants (string constants and + floating-point constants) across compilation units. + + This option is the default for optimized compilation if the + assembler and linker support it. Use '-fno-merge-constants' to + inhibit this behavior. + + Enabled at levels '-O', '-O2', '-O3', '-Os'. + +'-fmerge-all-constants' + Attempt to merge identical constants and identical variables. + + This option implies '-fmerge-constants'. In addition to + '-fmerge-constants' this considers e.g. even constant initialized + arrays or initialized constant variables with integral or + floating-point types. Languages like C or C++ require each + variable, including multiple instances of the same variable in + recursive calls, to have distinct locations, so using this option + results in non-conforming behavior. + +'-fmodulo-sched' + Perform swing modulo scheduling immediately before the first + scheduling pass. This pass looks at innermost loops and reorders + their instructions by overlapping different iterations. + +'-fmodulo-sched-allow-regmoves' + Perform more aggressive SMS-based modulo scheduling with register + moves allowed. By setting this flag certain anti-dependences edges + are deleted, which triggers the generation of reg-moves based on + the life-range analysis. This option is effective only with + '-fmodulo-sched' enabled. + +'-fno-branch-count-reg' + Do not use "decrement and branch" instructions on a count register, + but instead generate a sequence of instructions that decrement a + register, compare it against zero, then branch based upon the + result. This option is only meaningful on architectures that + support such instructions, which include x86, PowerPC, IA-64 and + S/390. + + The default is '-fbranch-count-reg'. + +'-fno-function-cse' + Do not put function addresses in registers; make each instruction + that calls a constant function contain the function's address + explicitly. + + This option results in less efficient code, but some strange hacks + that alter the assembler output may be confused by the + optimizations performed when this option is not used. + + The default is '-ffunction-cse' + +'-fno-zero-initialized-in-bss' + If the target supports a BSS section, GCC by default puts variables + that are initialized to zero into BSS. This can save space in the + resulting code. + + This option turns off this behavior because some programs + explicitly rely on variables going to the data section--e.g., so + that the resulting executable can find the beginning of that + section and/or make assumptions based on that. + + The default is '-fzero-initialized-in-bss'. + +'-fthread-jumps' + Perform optimizations that check to see if a jump branches to a + location where another comparison subsumed by the first is found. + If so, the first branch is redirected to either the destination of + the second branch or a point immediately following it, depending on + whether the condition is known to be true or false. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fsplit-wide-types' + When using a type that occupies multiple registers, such as 'long + long' on a 32-bit system, split the registers apart and allocate + them independently. This normally generates better code for those + types, but may make debugging more difficult. + + Enabled at levels '-O', '-O2', '-O3', '-Os'. + +'-fcse-follow-jumps' + In common subexpression elimination (CSE), scan through jump + instructions when the target of the jump is not reached by any + other path. For example, when CSE encounters an 'if' statement + with an 'else' clause, CSE follows the jump when the condition + tested is false. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fcse-skip-blocks' + This is similar to '-fcse-follow-jumps', but causes CSE to follow + jumps that conditionally skip over blocks. When CSE encounters a + simple 'if' statement with no else clause, '-fcse-skip-blocks' + causes CSE to follow the jump around the body of the 'if'. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-frerun-cse-after-loop' + Re-run common subexpression elimination after loop optimizations + are performed. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fgcse' + Perform a global common subexpression elimination pass. This pass + also performs global constant and copy propagation. + + _Note:_ When compiling a program using computed gotos, a GCC + extension, you may get better run-time performance if you disable + the global common subexpression elimination pass by adding + '-fno-gcse' to the command line. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fgcse-lm' + When '-fgcse-lm' is enabled, global common subexpression + elimination attempts to move loads that are only killed by stores + into themselves. This allows a loop containing a load/store + sequence to be changed to a load outside the loop, and a copy/store + within the loop. + + Enabled by default when '-fgcse' is enabled. + +'-fgcse-sm' + When '-fgcse-sm' is enabled, a store motion pass is run after + global common subexpression elimination. This pass attempts to + move stores out of loops. When used in conjunction with + '-fgcse-lm', loops containing a load/store sequence can be changed + to a load before the loop and a store after the loop. + + Not enabled at any optimization level. + +'-fgcse-las' + When '-fgcse-las' is enabled, the global common subexpression + elimination pass eliminates redundant loads that come after stores + to the same memory location (both partial and full redundancies). + + Not enabled at any optimization level. + +'-fgcse-after-reload' + When '-fgcse-after-reload' is enabled, a redundant load elimination + pass is performed after reload. The purpose of this pass is to + clean up redundant spilling. + +'-faggressive-loop-optimizations' + This option tells the loop optimizer to use language constraints to + derive bounds for the number of iterations of a loop. This assumes + that loop code does not invoke undefined behavior by for example + causing signed integer overflows or out-of-bound array accesses. + The bounds for the number of iterations of a loop are used to guide + loop unrolling and peeling and loop exit test optimizations. This + option is enabled by default. + +'-funsafe-loop-optimizations' + This option tells the loop optimizer to assume that loop indices do + not overflow, and that loops with nontrivial exit condition are not + infinite. This enables a wider range of loop optimizations even if + the loop optimizer itself cannot prove that these assumptions are + valid. If you use '-Wunsafe-loop-optimizations', the compiler + warns you if it finds this kind of loop. + +'-fcrossjumping' + Perform cross-jumping transformation. This transformation unifies + equivalent code and saves code size. The resulting code may or may + not perform better than without cross-jumping. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fauto-inc-dec' + Combine increments or decrements of addresses with memory accesses. + This pass is always skipped on architectures that do not have + instructions to support this. Enabled by default at '-O' and + higher on architectures that support this. + +'-fdce' + Perform dead code elimination (DCE) on RTL. Enabled by default at + '-O' and higher. + +'-fdse' + Perform dead store elimination (DSE) on RTL. Enabled by default at + '-O' and higher. + +'-fif-conversion' + Attempt to transform conditional jumps into branch-less + equivalents. This includes use of conditional moves, min, max, set + flags and abs instructions, and some tricks doable by standard + arithmetics. The use of conditional execution on chips where it is + available is controlled by 'if-conversion2'. + + Enabled at levels '-O', '-O2', '-O3', '-Os'. + +'-fif-conversion2' + Use conditional execution (where available) to transform + conditional jumps into branch-less equivalents. + + Enabled at levels '-O', '-O2', '-O3', '-Os'. + +'-fdeclone-ctor-dtor' + The C++ ABI requires multiple entry points for constructors and + destructors: one for a base subobject, one for a complete object, + and one for a virtual destructor that calls operator delete + afterwards. For a hierarchy with virtual bases, the base and + complete variants are clones, which means two copies of the + function. With this option, the base and complete variants are + changed to be thunks that call a common implementation. + + Enabled by '-Os'. + +'-fdelete-null-pointer-checks' + Assume that programs cannot safely dereference null pointers, and + that no code or data element resides there. This enables simple + constant folding optimizations at all optimization levels. In + addition, other optimization passes in GCC use this flag to control + global dataflow analyses that eliminate useless checks for null + pointers; these assume that if a pointer is checked after it has + already been dereferenced, it cannot be null. + + Note however that in some environments this assumption is not true. + Use '-fno-delete-null-pointer-checks' to disable this optimization + for programs that depend on that behavior. + + Some targets, especially embedded ones, disable this option at all + levels. Otherwise it is enabled at all levels: '-O0', '-O1', + '-O2', '-O3', '-Os'. Passes that use the information are enabled + independently at different optimization levels. + +'-fdevirtualize' + Attempt to convert calls to virtual functions to direct calls. + This is done both within a procedure and interprocedurally as part + of indirect inlining ('-findirect-inlining') and interprocedural + constant propagation ('-fipa-cp'). Enabled at levels '-O2', '-O3', + '-Os'. + +'-fdevirtualize-speculatively' + Attempt to convert calls to virtual functions to speculative direct + calls. Based on the analysis of the type inheritance graph, + determine for a given call the set of likely targets. If the set + is small, preferably of size 1, change the call into an conditional + deciding on direct and indirect call. The speculative calls enable + more optimizations, such as inlining. When they seem useless after + further optimization, they are converted back into original form. + +'-fexpensive-optimizations' + Perform a number of minor optimizations that are relatively + expensive. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-free' + Attempt to remove redundant extension instructions. This is + especially helpful for the x86-64 architecture, which implicitly + zero-extends in 64-bit registers after writing to their lower + 32-bit half. + + Enabled for AArch64 and x86 at levels '-O2', '-O3'. + +'-flive-range-shrinkage' + Attempt to decrease register pressure through register live range + shrinkage. This is helpful for fast processors with small or + moderate size register sets. + +'-fira-algorithm=ALGORITHM' + Use the specified coloring algorithm for the integrated register + allocator. The ALGORITHM argument can be 'priority', which + specifies Chow's priority coloring, or 'CB', which specifies + Chaitin-Briggs coloring. Chaitin-Briggs coloring is not + implemented for all architectures, but for those targets that do + support it, it is the default because it generates better code. + +'-fira-region=REGION' + Use specified regions for the integrated register allocator. The + REGION argument should be one of the following: + + 'all' + Use all loops as register allocation regions. This can give + the best results for machines with a small and/or irregular + register set. + + 'mixed' + Use all loops except for loops with small register pressure as + the regions. This value usually gives the best results in + most cases and for most architectures, and is enabled by + default when compiling with optimization for speed ('-O', + '-O2', ...). + + 'one' + Use all functions as a single region. This typically results + in the smallest code size, and is enabled by default for '-Os' + or '-O0'. + +'-fira-hoist-pressure' + Use IRA to evaluate register pressure in the code hoisting pass for + decisions to hoist expressions. This option usually results in + smaller code, but it can slow the compiler down. + + This option is enabled at level '-Os' for all targets. + +'-fira-loop-pressure' + Use IRA to evaluate register pressure in loops for decisions to + move loop invariants. This option usually results in generation of + faster and smaller code on machines with large register files (>= + 32 registers), but it can slow the compiler down. + + This option is enabled at level '-O3' for some targets. + +'-fno-ira-share-save-slots' + Disable sharing of stack slots used for saving call-used hard + registers living through a call. Each hard register gets a + separate stack slot, and as a result function stack frames are + larger. + +'-fno-ira-share-spill-slots' + Disable sharing of stack slots allocated for pseudo-registers. + Each pseudo-register that does not get a hard register gets a + separate stack slot, and as a result function stack frames are + larger. + +'-fira-verbose=N' + Control the verbosity of the dump file for the integrated register + allocator. The default value is 5. If the value N is greater or + equal to 10, the dump output is sent to stderr using the same + format as N minus 10. + +'-fdelayed-branch' + If supported for the target machine, attempt to reorder + instructions to exploit instruction slots available after delayed + branch instructions. + + Enabled at levels '-O', '-O2', '-O3', '-Os'. + +'-fschedule-insns' + If supported for the target machine, attempt to reorder + instructions to eliminate execution stalls due to required data + being unavailable. This helps machines that have slow floating + point or memory load instructions by allowing other instructions to + be issued until the result of the load or floating-point + instruction is required. + + Enabled at levels '-O2', '-O3'. + +'-fschedule-insns2' + Similar to '-fschedule-insns', but requests an additional pass of + instruction scheduling after register allocation has been done. + This is especially useful on machines with a relatively small + number of registers and where memory load instructions take more + than one cycle. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fno-sched-interblock' + Don't schedule instructions across basic blocks. This is normally + enabled by default when scheduling before register allocation, i.e. + with '-fschedule-insns' or at '-O2' or higher. + +'-fno-sched-spec' + Don't allow speculative motion of non-load instructions. This is + normally enabled by default when scheduling before register + allocation, i.e. with '-fschedule-insns' or at '-O2' or higher. + +'-fsched-pressure' + Enable register pressure sensitive insn scheduling before register + allocation. This only makes sense when scheduling before register + allocation is enabled, i.e. with '-fschedule-insns' or at '-O2' or + higher. Usage of this option can improve the generated code and + decrease its size by preventing register pressure increase above + the number of available hard registers and subsequent spills in + register allocation. + +'-fsched-spec-load' + Allow speculative motion of some load instructions. This only + makes sense when scheduling before register allocation, i.e. with + '-fschedule-insns' or at '-O2' or higher. + +'-fsched-spec-load-dangerous' + Allow speculative motion of more load instructions. This only + makes sense when scheduling before register allocation, i.e. with + '-fschedule-insns' or at '-O2' or higher. + +'-fsched-stalled-insns' +'-fsched-stalled-insns=N' + Define how many insns (if any) can be moved prematurely from the + queue of stalled insns into the ready list during the second + scheduling pass. '-fno-sched-stalled-insns' means that no insns + are moved prematurely, '-fsched-stalled-insns=0' means there is no + limit on how many queued insns can be moved prematurely. + '-fsched-stalled-insns' without a value is equivalent to + '-fsched-stalled-insns=1'. + +'-fsched-stalled-insns-dep' +'-fsched-stalled-insns-dep=N' + Define how many insn groups (cycles) are examined for a dependency + on a stalled insn that is a candidate for premature removal from + the queue of stalled insns. This has an effect only during the + second scheduling pass, and only if '-fsched-stalled-insns' is + used. '-fno-sched-stalled-insns-dep' is equivalent to + '-fsched-stalled-insns-dep=0'. '-fsched-stalled-insns-dep' without + a value is equivalent to '-fsched-stalled-insns-dep=1'. + +'-fsched2-use-superblocks' + When scheduling after register allocation, use superblock + scheduling. This allows motion across basic block boundaries, + resulting in faster schedules. This option is experimental, as not + all machine descriptions used by GCC model the CPU closely enough + to avoid unreliable results from the algorithm. + + This only makes sense when scheduling after register allocation, + i.e. with '-fschedule-insns2' or at '-O2' or higher. + +'-fsched-group-heuristic' + Enable the group heuristic in the scheduler. This heuristic favors + the instruction that belongs to a schedule group. This is enabled + by default when scheduling is enabled, i.e. with '-fschedule-insns' + or '-fschedule-insns2' or at '-O2' or higher. + +'-fsched-critical-path-heuristic' + Enable the critical-path heuristic in the scheduler. This + heuristic favors instructions on the critical path. This is + enabled by default when scheduling is enabled, i.e. with + '-fschedule-insns' or '-fschedule-insns2' or at '-O2' or higher. + +'-fsched-spec-insn-heuristic' + Enable the speculative instruction heuristic in the scheduler. + This heuristic favors speculative instructions with greater + dependency weakness. This is enabled by default when scheduling is + enabled, i.e. with '-fschedule-insns' or '-fschedule-insns2' or at + '-O2' or higher. + +'-fsched-rank-heuristic' + Enable the rank heuristic in the scheduler. This heuristic favors + the instruction belonging to a basic block with greater size or + frequency. This is enabled by default when scheduling is enabled, + i.e. with '-fschedule-insns' or '-fschedule-insns2' or at '-O2' or + higher. + +'-fsched-last-insn-heuristic' + Enable the last-instruction heuristic in the scheduler. This + heuristic favors the instruction that is less dependent on the last + instruction scheduled. This is enabled by default when scheduling + is enabled, i.e. with '-fschedule-insns' or '-fschedule-insns2' or + at '-O2' or higher. + +'-fsched-dep-count-heuristic' + Enable the dependent-count heuristic in the scheduler. This + heuristic favors the instruction that has more instructions + depending on it. This is enabled by default when scheduling is + enabled, i.e. with '-fschedule-insns' or '-fschedule-insns2' or at + '-O2' or higher. + +'-freschedule-modulo-scheduled-loops' + Modulo scheduling is performed before traditional scheduling. If a + loop is modulo scheduled, later scheduling passes may change its + schedule. Use this option to control that behavior. + +'-fselective-scheduling' + Schedule instructions using selective scheduling algorithm. + Selective scheduling runs instead of the first scheduler pass. + +'-fselective-scheduling2' + Schedule instructions using selective scheduling algorithm. + Selective scheduling runs instead of the second scheduler pass. + +'-fsel-sched-pipelining' + Enable software pipelining of innermost loops during selective + scheduling. This option has no effect unless one of + '-fselective-scheduling' or '-fselective-scheduling2' is turned on. + +'-fsel-sched-pipelining-outer-loops' + When pipelining loops during selective scheduling, also pipeline + outer loops. This option has no effect unless + '-fsel-sched-pipelining' is turned on. + +'-fshrink-wrap' + Emit function prologues only before parts of the function that need + it, rather than at the top of the function. This flag is enabled + by default at '-O' and higher. + +'-fcaller-saves' + Enable allocation of values to registers that are clobbered by + function calls, by emitting extra instructions to save and restore + the registers around such calls. Such allocation is done only when + it seems to result in better code. + + This option is always enabled by default on certain machines, + usually those which have no call-preserved registers to use + instead. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fcombine-stack-adjustments' + Tracks stack adjustments (pushes and pops) and stack memory + references and then tries to find ways to combine them. + + Enabled by default at '-O1' and higher. + +'-fconserve-stack' + Attempt to minimize stack usage. The compiler attempts to use less + stack space, even if that makes the program slower. This option + implies setting the 'large-stack-frame' parameter to 100 and the + 'large-stack-frame-growth' parameter to 400. + +'-ftree-reassoc' + Perform reassociation on trees. This flag is enabled by default at + '-O' and higher. + +'-ftree-pre' + Perform partial redundancy elimination (PRE) on trees. This flag + is enabled by default at '-O2' and '-O3'. + +'-ftree-partial-pre' + Make partial redundancy elimination (PRE) more aggressive. This + flag is enabled by default at '-O3'. + +'-ftree-forwprop' + Perform forward propagation on trees. This flag is enabled by + default at '-O' and higher. + +'-ftree-fre' + Perform full redundancy elimination (FRE) on trees. The difference + between FRE and PRE is that FRE only considers expressions that are + computed on all paths leading to the redundant computation. This + analysis is faster than PRE, though it exposes fewer redundancies. + This flag is enabled by default at '-O' and higher. + +'-ftree-phiprop' + Perform hoisting of loads from conditional pointers on trees. This + pass is enabled by default at '-O' and higher. + +'-fhoist-adjacent-loads' + Speculatively hoist loads from both branches of an if-then-else if + the loads are from adjacent locations in the same structure and the + target architecture has a conditional move instruction. This flag + is enabled by default at '-O2' and higher. + +'-ftree-copy-prop' + Perform copy propagation on trees. This pass eliminates + unnecessary copy operations. This flag is enabled by default at + '-O' and higher. + +'-fipa-pure-const' + Discover which functions are pure or constant. Enabled by default + at '-O' and higher. + +'-fipa-reference' + Discover which static variables do not escape the compilation unit. + Enabled by default at '-O' and higher. + +'-fipa-pta' + Perform interprocedural pointer analysis and interprocedural + modification and reference analysis. This option can cause + excessive memory and compile-time usage on large compilation units. + It is not enabled by default at any optimization level. + +'-fipa-profile' + Perform interprocedural profile propagation. The functions called + only from cold functions are marked as cold. Also functions + executed once (such as 'cold', 'noreturn', static constructors or + destructors) are identified. Cold functions and loop less parts of + functions executed once are then optimized for size. Enabled by + default at '-O' and higher. + +'-fipa-cp' + Perform interprocedural constant propagation. This optimization + analyzes the program to determine when values passed to functions + are constants and then optimizes accordingly. This optimization + can substantially increase performance if the application has + constants passed to functions. This flag is enabled by default at + '-O2', '-Os' and '-O3'. + +'-fipa-cp-clone' + Perform function cloning to make interprocedural constant + propagation stronger. When enabled, interprocedural constant + propagation performs function cloning when externally visible + function can be called with constant arguments. Because this + optimization can create multiple copies of functions, it may + significantly increase code size (see '--param + ipcp-unit-growth=VALUE'). This flag is enabled by default at + '-O3'. + +'-fisolate-erroneous-paths-dereference' + Detect paths which trigger erroneous or undefined behaviour due to + dereferencing a NULL pointer. Isolate those paths from the main + control flow and turn the statement with erroneous or undefined + behaviour into a trap. + +'-fisolate-erroneous-paths-attribute' + Detect paths which trigger erroneous or undefined behaviour due a + NULL value being used in a way which is forbidden by a + 'returns_nonnull' or 'nonnull' attribute. Isolate those paths from + the main control flow and turn the statement with erroneous or + undefined behaviour into a trap. This is not currently enabled, + but may be enabled by '-O2' in the future. + +'-ftree-sink' + Perform forward store motion on trees. This flag is enabled by + default at '-O' and higher. + +'-ftree-bit-ccp' + Perform sparse conditional bit constant propagation on trees and + propagate pointer alignment information. This pass only operates + on local scalar variables and is enabled by default at '-O' and + higher. It requires that '-ftree-ccp' is enabled. + +'-ftree-ccp' + Perform sparse conditional constant propagation (CCP) on trees. + This pass only operates on local scalar variables and is enabled by + default at '-O' and higher. + +'-ftree-switch-conversion' + Perform conversion of simple initializations in a switch to + initializations from a scalar array. This flag is enabled by + default at '-O2' and higher. + +'-ftree-tail-merge' + Look for identical code sequences. When found, replace one with a + jump to the other. This optimization is known as tail merging or + cross jumping. This flag is enabled by default at '-O2' and + higher. The compilation time in this pass can be limited using + 'max-tail-merge-comparisons' parameter and + 'max-tail-merge-iterations' parameter. + +'-ftree-dce' + Perform dead code elimination (DCE) on trees. This flag is enabled + by default at '-O' and higher. + +'-ftree-builtin-call-dce' + Perform conditional dead code elimination (DCE) for calls to + built-in functions that may set 'errno' but are otherwise + side-effect free. This flag is enabled by default at '-O2' and + higher if '-Os' is not also specified. + +'-ftree-dominator-opts' + Perform a variety of simple scalar cleanups (constant/copy + propagation, redundancy elimination, range propagation and + expression simplification) based on a dominator tree traversal. + This also performs jump threading (to reduce jumps to jumps). This + flag is enabled by default at '-O' and higher. + +'-ftree-dse' + Perform dead store elimination (DSE) on trees. A dead store is a + store into a memory location that is later overwritten by another + store without any intervening loads. In this case the earlier + store can be deleted. This flag is enabled by default at '-O' and + higher. + +'-ftree-ch' + Perform loop header copying on trees. This is beneficial since it + increases effectiveness of code motion optimizations. It also + saves one jump. This flag is enabled by default at '-O' and + higher. It is not enabled for '-Os', since it usually increases + code size. + +'-ftree-loop-optimize' + Perform loop optimizations on trees. This flag is enabled by + default at '-O' and higher. + +'-ftree-loop-linear' + Perform loop interchange transformations on tree. Same as + '-floop-interchange'. To use this code transformation, GCC has to + be configured with '--with-ppl' and '--with-cloog' to enable the + Graphite loop transformation infrastructure. + +'-floop-interchange' + Perform loop interchange transformations on loops. Interchanging + two nested loops switches the inner and outer loops. For example, + given a loop like: + DO J = 1, M + DO I = 1, N + A(J, I) = A(J, I) * C + ENDDO + ENDDO + loop interchange transforms the loop as if it were written: + DO I = 1, N + DO J = 1, M + A(J, I) = A(J, I) * C + ENDDO + ENDDO + which can be beneficial when 'N' is larger than the caches, because + in Fortran, the elements of an array are stored in memory + contiguously by column, and the original loop iterates over rows, + potentially creating at each access a cache miss. This + optimization applies to all the languages supported by GCC and is + not limited to Fortran. To use this code transformation, GCC has + to be configured with '--with-ppl' and '--with-cloog' to enable the + Graphite loop transformation infrastructure. + +'-floop-strip-mine' + Perform loop strip mining transformations on loops. Strip mining + splits a loop into two nested loops. The outer loop has strides + equal to the strip size and the inner loop has strides of the + original loop within a strip. The strip length can be changed + using the 'loop-block-tile-size' parameter. For example, given a + loop like: + DO I = 1, N + A(I) = A(I) + C + ENDDO + loop strip mining transforms the loop as if it were written: + DO II = 1, N, 51 + DO I = II, min (II + 50, N) + A(I) = A(I) + C + ENDDO + ENDDO + This optimization applies to all the languages supported by GCC and + is not limited to Fortran. To use this code transformation, GCC + has to be configured with '--with-ppl' and '--with-cloog' to enable + the Graphite loop transformation infrastructure. + +'-floop-block' + Perform loop blocking transformations on loops. Blocking strip + mines each loop in the loop nest such that the memory accesses of + the element loops fit inside caches. The strip length can be + changed using the 'loop-block-tile-size' parameter. For example, + given a loop like: + DO I = 1, N + DO J = 1, M + A(J, I) = B(I) + C(J) + ENDDO + ENDDO + loop blocking transforms the loop as if it were written: + DO II = 1, N, 51 + DO JJ = 1, M, 51 + DO I = II, min (II + 50, N) + DO J = JJ, min (JJ + 50, M) + A(J, I) = B(I) + C(J) + ENDDO + ENDDO + ENDDO + ENDDO + which can be beneficial when 'M' is larger than the caches, because + the innermost loop iterates over a smaller amount of data which can + be kept in the caches. This optimization applies to all the + languages supported by GCC and is not limited to Fortran. To use + this code transformation, GCC has to be configured with + '--with-ppl' and '--with-cloog' to enable the Graphite loop + transformation infrastructure. + +'-fgraphite-identity' + Enable the identity transformation for graphite. For every SCoP we + generate the polyhedral representation and transform it back to + gimple. Using '-fgraphite-identity' we can check the costs or + benefits of the GIMPLE -> GRAPHITE -> GIMPLE transformation. Some + minimal optimizations are also performed by the code generator + CLooG, like index splitting and dead code elimination in loops. + +'-floop-nest-optimize' + Enable the ISL based loop nest optimizer. This is a generic loop + nest optimizer based on the Pluto optimization algorithms. It + calculates a loop structure optimized for data-locality and + parallelism. This option is experimental. + +'-floop-parallelize-all' + Use the Graphite data dependence analysis to identify loops that + can be parallelized. Parallelize all the loops that can be + analyzed to not contain loop carried dependences without checking + that it is profitable to parallelize the loops. + +'-fcheck-data-deps' + Compare the results of several data dependence analyzers. This + option is used for debugging the data dependence analyzers. + +'-ftree-loop-if-convert' + Attempt to transform conditional jumps in the innermost loops to + branch-less equivalents. The intent is to remove control-flow from + the innermost loops in order to improve the ability of the + vectorization pass to handle these loops. This is enabled by + default if vectorization is enabled. + +'-ftree-loop-if-convert-stores' + Attempt to also if-convert conditional jumps containing memory + writes. This transformation can be unsafe for multi-threaded + programs as it transforms conditional memory writes into + unconditional memory writes. For example, + for (i = 0; i < N; i++) + if (cond) + A[i] = expr; + is transformed to + for (i = 0; i < N; i++) + A[i] = cond ? expr : A[i]; + potentially producing data races. + +'-ftree-loop-distribution' + Perform loop distribution. This flag can improve cache performance + on big loop bodies and allow further loop optimizations, like + parallelization or vectorization, to take place. For example, the + loop + DO I = 1, N + A(I) = B(I) + C + D(I) = E(I) * F + ENDDO + is transformed to + DO I = 1, N + A(I) = B(I) + C + ENDDO + DO I = 1, N + D(I) = E(I) * F + ENDDO + +'-ftree-loop-distribute-patterns' + Perform loop distribution of patterns that can be code generated + with calls to a library. This flag is enabled by default at '-O3'. + + This pass distributes the initialization loops and generates a call + to memset zero. For example, the loop + DO I = 1, N + A(I) = 0 + B(I) = A(I) + I + ENDDO + is transformed to + DO I = 1, N + A(I) = 0 + ENDDO + DO I = 1, N + B(I) = A(I) + I + ENDDO + and the initialization loop is transformed into a call to memset + zero. + +'-ftree-loop-im' + Perform loop invariant motion on trees. This pass moves only + invariants that are hard to handle at RTL level (function calls, + operations that expand to nontrivial sequences of insns). With + '-funswitch-loops' it also moves operands of conditions that are + invariant out of the loop, so that we can use just trivial + invariantness analysis in loop unswitching. The pass also includes + store motion. + +'-ftree-loop-ivcanon' + Create a canonical counter for number of iterations in loops for + which determining number of iterations requires complicated + analysis. Later optimizations then may determine the number + easily. Useful especially in connection with unrolling. + +'-fivopts' + Perform induction variable optimizations (strength reduction, + induction variable merging and induction variable elimination) on + trees. + +'-ftree-parallelize-loops=n' + Parallelize loops, i.e., split their iteration space to run in n + threads. This is only possible for loops whose iterations are + independent and can be arbitrarily reordered. The optimization is + only profitable on multiprocessor machines, for loops that are + CPU-intensive, rather than constrained e.g. by memory bandwidth. + This option implies '-pthread', and thus is only supported on + targets that have support for '-pthread'. + +'-ftree-pta' + Perform function-local points-to analysis on trees. This flag is + enabled by default at '-O' and higher. + +'-ftree-sra' + Perform scalar replacement of aggregates. This pass replaces + structure references with scalars to prevent committing structures + to memory too early. This flag is enabled by default at '-O' and + higher. + +'-ftree-copyrename' + Perform copy renaming on trees. This pass attempts to rename + compiler temporaries to other variables at copy locations, usually + resulting in variable names which more closely resemble the + original variables. This flag is enabled by default at '-O' and + higher. + +'-ftree-coalesce-inlined-vars' + Tell the copyrename pass (see '-ftree-copyrename') to attempt to + combine small user-defined variables too, but only if they were + inlined from other functions. It is a more limited form of + '-ftree-coalesce-vars'. This may harm debug information of such + inlined variables, but it will keep variables of the inlined-into + function apart from each other, such that they are more likely to + contain the expected values in a debugging session. This was the + default in GCC versions older than 4.7. + +'-ftree-coalesce-vars' + Tell the copyrename pass (see '-ftree-copyrename') to attempt to + combine small user-defined variables too, instead of just compiler + temporaries. This may severely limit the ability to debug an + optimized program compiled with '-fno-var-tracking-assignments'. + In the negated form, this flag prevents SSA coalescing of user + variables, including inlined ones. This option is enabled by + default. + +'-ftree-ter' + Perform temporary expression replacement during the SSA->normal + phase. Single use/single def temporaries are replaced at their use + location with their defining expression. This results in + non-GIMPLE code, but gives the expanders much more complex trees to + work on resulting in better RTL generation. This is enabled by + default at '-O' and higher. + +'-ftree-slsr' + Perform straight-line strength reduction on trees. This recognizes + related expressions involving multiplications and replaces them by + less expensive calculations when possible. This is enabled by + default at '-O' and higher. + +'-ftree-vectorize' + Perform vectorization on trees. This flag enables + '-ftree-loop-vectorize' and '-ftree-slp-vectorize' if not + explicitly specified. + +'-ftree-loop-vectorize' + Perform loop vectorization on trees. This flag is enabled by + default at '-O3' and when '-ftree-vectorize' is enabled. + +'-ftree-slp-vectorize' + Perform basic block vectorization on trees. This flag is enabled + by default at '-O3' and when '-ftree-vectorize' is enabled. + +'-fvect-cost-model=MODEL' + Alter the cost model used for vectorization. The MODEL argument + should be one of 'unlimited', 'dynamic' or 'cheap'. With the + 'unlimited' model the vectorized code-path is assumed to be + profitable while with the 'dynamic' model a runtime check will + guard the vectorized code-path to enable it only for iteration + counts that will likely execute faster than when executing the + original scalar loop. The 'cheap' model will disable vectorization + of loops where doing so would be cost prohibitive for example due + to required runtime checks for data dependence or alignment but + otherwise is equal to the 'dynamic' model. The default cost model + depends on other optimization flags and is either 'dynamic' or + 'cheap'. + +'-fsimd-cost-model=MODEL' + Alter the cost model used for vectorization of loops marked with + the OpenMP or Cilk Plus simd directive. The MODEL argument should + be one of 'unlimited', 'dynamic', 'cheap'. All values of MODEL + have the same meaning as described in '-fvect-cost-model' and by + default a cost model defined with '-fvect-cost-model' is used. + +'-ftree-vrp' + Perform Value Range Propagation on trees. This is similar to the + constant propagation pass, but instead of values, ranges of values + are propagated. This allows the optimizers to remove unnecessary + range checks like array bound checks and null pointer checks. This + is enabled by default at '-O2' and higher. Null pointer check + elimination is only done if '-fdelete-null-pointer-checks' is + enabled. + +'-ftracer' + Perform tail duplication to enlarge superblock size. This + transformation simplifies the control flow of the function allowing + other optimizations to do a better job. + +'-funroll-loops' + Unroll loops whose number of iterations can be determined at + compile time or upon entry to the loop. '-funroll-loops' implies + '-frerun-cse-after-loop'. This option makes code larger, and may + or may not make it run faster. + +'-funroll-all-loops' + Unroll all loops, even if their number of iterations is uncertain + when the loop is entered. This usually makes programs run more + slowly. '-funroll-all-loops' implies the same options as + '-funroll-loops', + +'-fsplit-ivs-in-unroller' + Enables expression of values of induction variables in later + iterations of the unrolled loop using the value in the first + iteration. This breaks long dependency chains, thus improving + efficiency of the scheduling passes. + + A combination of '-fweb' and CSE is often sufficient to obtain the + same effect. However, that is not reliable in cases where the loop + body is more complicated than a single basic block. It also does + not work at all on some architectures due to restrictions in the + CSE pass. + + This optimization is enabled by default. + +'-fvariable-expansion-in-unroller' + With this option, the compiler creates multiple copies of some + local variables when unrolling a loop, which can result in superior + code. + +'-fpartial-inlining' + Inline parts of functions. This option has any effect only when + inlining itself is turned on by the '-finline-functions' or + '-finline-small-functions' options. + + Enabled at level '-O2'. + +'-fpredictive-commoning' + Perform predictive commoning optimization, i.e., reusing + computations (especially memory loads and stores) performed in + previous iterations of loops. + + This option is enabled at level '-O3'. + +'-fprefetch-loop-arrays' + If supported by the target machine, generate instructions to + prefetch memory to improve the performance of loops that access + large arrays. + + This option may generate better or worse code; results are highly + dependent on the structure of loops within the source code. + + Disabled at level '-Os'. + +'-fno-peephole' +'-fno-peephole2' + Disable any machine-specific peephole optimizations. The + difference between '-fno-peephole' and '-fno-peephole2' is in how + they are implemented in the compiler; some targets use one, some + use the other, a few use both. + + '-fpeephole' is enabled by default. '-fpeephole2' enabled at + levels '-O2', '-O3', '-Os'. + +'-fno-guess-branch-probability' + Do not guess branch probabilities using heuristics. + + GCC uses heuristics to guess branch probabilities if they are not + provided by profiling feedback ('-fprofile-arcs'). These + heuristics are based on the control flow graph. If some branch + probabilities are specified by '__builtin_expect', then the + heuristics are used to guess branch probabilities for the rest of + the control flow graph, taking the '__builtin_expect' info into + account. The interactions between the heuristics and + '__builtin_expect' can be complex, and in some cases, it may be + useful to disable the heuristics so that the effects of + '__builtin_expect' are easier to understand. + + The default is '-fguess-branch-probability' at levels '-O', '-O2', + '-O3', '-Os'. + +'-freorder-blocks' + Reorder basic blocks in the compiled function in order to reduce + number of taken branches and improve code locality. + + Enabled at levels '-O2', '-O3'. + +'-freorder-blocks-and-partition' + In addition to reordering basic blocks in the compiled function, in + order to reduce number of taken branches, partitions hot and cold + basic blocks into separate sections of the assembly and .o files, + to improve paging and cache locality performance. + + This optimization is automatically turned off in the presence of + exception handling, for linkonce sections, for functions with a + user-defined section attribute and on any architecture that does + not support named sections. + + Enabled for x86 at levels '-O2', '-O3'. + +'-freorder-functions' + Reorder functions in the object file in order to improve code + locality. This is implemented by using special subsections + '.text.hot' for most frequently executed functions and + '.text.unlikely' for unlikely executed functions. Reordering is + done by the linker so object file format must support named + sections and linker must place them in a reasonable way. + + Also profile feedback must be available to make this option + effective. See '-fprofile-arcs' for details. + + Enabled at levels '-O2', '-O3', '-Os'. + +'-fstrict-aliasing' + Allow the compiler to assume the strictest aliasing rules + applicable to the language being compiled. For C (and C++), this + activates optimizations based on the type of expressions. In + particular, an object of one type is assumed never to reside at the + same address as an object of a different type, unless the types are + almost the same. For example, an 'unsigned int' can alias an + 'int', but not a 'void*' or a 'double'. A character type may alias + any other type. + + Pay special attention to code like this: + union a_union { + int i; + double d; + }; + + int f() { + union a_union t; + t.d = 3.0; + return t.i; + } + The practice of reading from a different union member than the one + most recently written to (called "type-punning") is common. Even + with '-fstrict-aliasing', type-punning is allowed, provided the + memory is accessed through the union type. So, the code above + works as expected. *Note Structures unions enumerations and + bit-fields implementation::. However, this code might not: + int f() { + union a_union t; + int* ip; + t.d = 3.0; + ip = &t.i; + return *ip; + } + + Similarly, access by taking the address, casting the resulting + pointer and dereferencing the result has undefined behavior, even + if the cast uses a union type, e.g.: + int f() { + double d = 3.0; + return ((union a_union *) &d)->i; + } + + The '-fstrict-aliasing' option is enabled at levels '-O2', '-O3', + '-Os'. + +'-fstrict-overflow' + Allow the compiler to assume strict signed overflow rules, + depending on the language being compiled. For C (and C++) this + means that overflow when doing arithmetic with signed numbers is + undefined, which means that the compiler may assume that it does + not happen. This permits various optimizations. For example, the + compiler assumes that an expression like 'i + 10 > i' is always + true for signed 'i'. This assumption is only valid if signed + overflow is undefined, as the expression is false if 'i + 10' + overflows when using twos complement arithmetic. When this option + is in effect any attempt to determine whether an operation on + signed numbers overflows must be written carefully to not actually + involve overflow. + + This option also allows the compiler to assume strict pointer + semantics: given a pointer to an object, if adding an offset to + that pointer does not produce a pointer to the same object, the + addition is undefined. This permits the compiler to conclude that + 'p + u > p' is always true for a pointer 'p' and unsigned integer + 'u'. This assumption is only valid because pointer wraparound is + undefined, as the expression is false if 'p + u' overflows using + twos complement arithmetic. + + See also the '-fwrapv' option. Using '-fwrapv' means that integer + signed overflow is fully defined: it wraps. When '-fwrapv' is + used, there is no difference between '-fstrict-overflow' and + '-fno-strict-overflow' for integers. With '-fwrapv' certain types + of overflow are permitted. For example, if the compiler gets an + overflow when doing arithmetic on constants, the overflowed value + can still be used with '-fwrapv', but not otherwise. + + The '-fstrict-overflow' option is enabled at levels '-O2', '-O3', + '-Os'. + +'-falign-functions' +'-falign-functions=N' + Align the start of functions to the next power-of-two greater than + N, skipping up to N bytes. For instance, '-falign-functions=32' + aligns functions to the next 32-byte boundary, but + '-falign-functions=24' aligns to the next 32-byte boundary only if + this can be done by skipping 23 bytes or less. + + '-fno-align-functions' and '-falign-functions=1' are equivalent and + mean that functions are not aligned. + + Some assemblers only support this flag when N is a power of two; in + that case, it is rounded up. + + If N is not specified or is zero, use a machine-dependent default. + + Enabled at levels '-O2', '-O3'. + +'-falign-labels' +'-falign-labels=N' + Align all branch targets to a power-of-two boundary, skipping up to + N bytes like '-falign-functions'. This option can easily make code + slower, because it must insert dummy operations for when the branch + target is reached in the usual flow of the code. + + '-fno-align-labels' and '-falign-labels=1' are equivalent and mean + that labels are not aligned. + + If '-falign-loops' or '-falign-jumps' are applicable and are + greater than this value, then their values are used instead. + + If N is not specified or is zero, use a machine-dependent default + which is very likely to be '1', meaning no alignment. + + Enabled at levels '-O2', '-O3'. + +'-falign-loops' +'-falign-loops=N' + Align loops to a power-of-two boundary, skipping up to N bytes like + '-falign-functions'. If the loops are executed many times, this + makes up for any execution of the dummy operations. + + '-fno-align-loops' and '-falign-loops=1' are equivalent and mean + that loops are not aligned. + + If N is not specified or is zero, use a machine-dependent default. + + Enabled at levels '-O2', '-O3'. + +'-falign-jumps' +'-falign-jumps=N' + Align branch targets to a power-of-two boundary, for branch targets + where the targets can only be reached by jumping, skipping up to N + bytes like '-falign-functions'. In this case, no dummy operations + need be executed. + + '-fno-align-jumps' and '-falign-jumps=1' are equivalent and mean + that loops are not aligned. + + If N is not specified or is zero, use a machine-dependent default. + + Enabled at levels '-O2', '-O3'. + +'-funit-at-a-time' + This option is left for compatibility reasons. '-funit-at-a-time' + has no effect, while '-fno-unit-at-a-time' implies + '-fno-toplevel-reorder' and '-fno-section-anchors'. + + Enabled by default. + +'-fno-toplevel-reorder' + Do not reorder top-level functions, variables, and 'asm' + statements. Output them in the same order that they appear in the + input file. When this option is used, unreferenced static + variables are not removed. This option is intended to support + existing code that relies on a particular ordering. For new code, + it is better to use attributes when possible. + + Enabled at level '-O0'. When disabled explicitly, it also implies + '-fno-section-anchors', which is otherwise enabled at '-O0' on some + targets. + +'-fweb' + Constructs webs as commonly used for register allocation purposes + and assign each web individual pseudo register. This allows the + register allocation pass to operate on pseudos directly, but also + strengthens several other optimization passes, such as CSE, loop + optimizer and trivial dead code remover. It can, however, make + debugging impossible, since variables no longer stay in a "home + register". + + Enabled by default with '-funroll-loops'. + +'-fwhole-program' + Assume that the current compilation unit represents the whole + program being compiled. All public functions and variables with + the exception of 'main' and those merged by attribute + 'externally_visible' become static functions and in effect are + optimized more aggressively by interprocedural optimizers. + + This option should not be used in combination with '-flto'. + Instead relying on a linker plugin should provide safer and more + precise information. + +'-flto[=N]' + This option runs the standard link-time optimizer. When invoked + with source code, it generates GIMPLE (one of GCC's internal + representations) and writes it to special ELF sections in the + object file. When the object files are linked together, all the + function bodies are read from these ELF sections and instantiated + as if they had been part of the same translation unit. + + To use the link-time optimizer, '-flto' and optimization options + should be specified at compile time and during the final link. For + example: + + gcc -c -O2 -flto foo.c + gcc -c -O2 -flto bar.c + gcc -o myprog -flto -O2 foo.o bar.o + + The first two invocations to GCC save a bytecode representation of + GIMPLE into special ELF sections inside 'foo.o' and 'bar.o'. The + final invocation reads the GIMPLE bytecode from 'foo.o' and + 'bar.o', merges the two files into a single internal image, and + compiles the result as usual. Since both 'foo.o' and 'bar.o' are + merged into a single image, this causes all the interprocedural + analyses and optimizations in GCC to work across the two files as + if they were a single one. This means, for example, that the + inliner is able to inline functions in 'bar.o' into functions in + 'foo.o' and vice-versa. + + Another (simpler) way to enable link-time optimization is: + + gcc -o myprog -flto -O2 foo.c bar.c + + The above generates bytecode for 'foo.c' and 'bar.c', merges them + together into a single GIMPLE representation and optimizes them as + usual to produce 'myprog'. + + The only important thing to keep in mind is that to enable + link-time optimizations you need to use the GCC driver to perform + the link-step. GCC then automatically performs link-time + optimization if any of the objects involved were compiled with the + '-flto'. You generally should specify the optimization options to + be used for link-time optimization though GCC will try to be clever + at guessing an optimization level to use from the options used at + compile-time if you fail to specify one at link-time. You can + always override the automatic decision to do link-time optimization + at link-time by passing '-fno-lto' to the link command. + + To make whole program optimization effective, it is necessary to + make certain whole program assumptions. The compiler needs to know + what functions and variables can be accessed by libraries and + runtime outside of the link-time optimized unit. When supported by + the linker, the linker plugin (see '-fuse-linker-plugin') passes + information to the compiler about used and externally visible + symbols. When the linker plugin is not available, + '-fwhole-program' should be used to allow the compiler to make + these assumptions, which leads to more aggressive optimization + decisions. + + When '-fuse-linker-plugin' is not enabled then, when a file is + compiled with '-flto', the generated object file is larger than a + regular object file because it contains GIMPLE bytecodes and the + usual final code (see '-ffat-lto-objects'. This means that object + files with LTO information can be linked as normal object files; if + '-fno-lto' is passed to the linker, no interprocedural + optimizations are applied. Note that when '-fno-fat-lto-objects' + is enabled the compile-stage is faster but you cannot perform a + regular, non-LTO link on them. + + Additionally, the optimization flags used to compile individual + files are not necessarily related to those used at link time. For + instance, + + gcc -c -O0 -ffat-lto-objects -flto foo.c + gcc -c -O0 -ffat-lto-objects -flto bar.c + gcc -o myprog -O3 foo.o bar.o + + This produces individual object files with unoptimized assembler + code, but the resulting binary 'myprog' is optimized at '-O3'. If, + instead, the final binary is generated with '-fno-lto', then + 'myprog' is not optimized. + + When producing the final binary, GCC only applies link-time + optimizations to those files that contain bytecode. Therefore, you + can mix and match object files and libraries with GIMPLE bytecodes + and final object code. GCC automatically selects which files to + optimize in LTO mode and which files to link without further + processing. + + There are some code generation flags preserved by GCC when + generating bytecodes, as they need to be used during the final link + stage. Generally options specified at link-time override those + specified at compile-time. + + If you do not specify an optimization level option '-O' at + link-time then GCC will compute one based on the optimization + levels used when compiling the object files. The highest + optimization level will win here. + + Currently, the following options and their setting are take from + the first object file that explicitely specified it: '-fPIC', + '-fpic', '-fpie', '-fcommon', '-fexceptions', + '-fnon-call-exceptions', '-fgnu-tm' and all the '-m' target flags. + + Certain ABI changing flags are required to match in all + compilation-units and trying to override this at link-time with a + conflicting value is ignored. This includes options such as + '-freg-struct-return' and '-fpcc-struct-return'. + + Other options such as '-ffp-contract', '-fno-strict-overflow', + '-fwrapv', '-fno-trapv' or '-fno-strict-aliasing' are passed + through to the link stage and merged conservatively for conflicting + translation units. Specifically '-fno-strict-overflow', '-fwrapv' + and '-fno-trapv' take precedence and for example + '-ffp-contract=off' takes precedence over '-ffp-contract=fast'. + You can override them at linke-time. + + It is recommended that you compile all the files participating in + the same link with the same options and also specify those options + at link time. + + If LTO encounters objects with C linkage declared with incompatible + types in separate translation units to be linked together + (undefined behavior according to ISO C99 6.2.7), a non-fatal + diagnostic may be issued. The behavior is still undefined at run + time. Similar diagnostics may be raised for other languages. + + Another feature of LTO is that it is possible to apply + interprocedural optimizations on files written in different + languages: + + gcc -c -flto foo.c + g++ -c -flto bar.cc + gfortran -c -flto baz.f90 + g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran + + Notice that the final link is done with 'g++' to get the C++ + runtime libraries and '-lgfortran' is added to get the Fortran + runtime libraries. In general, when mixing languages in LTO mode, + you should use the same link command options as when mixing + languages in a regular (non-LTO) compilation. + + If object files containing GIMPLE bytecode are stored in a library + archive, say 'libfoo.a', it is possible to extract and use them in + an LTO link if you are using a linker with plugin support. To + create static libraries suitable for LTO, use 'gcc-ar' and + 'gcc-ranlib' instead of 'ar' and 'ranlib'; to show the symbols of + object files with GIMPLE bytecode, use 'gcc-nm'. Those commands + require that 'ar', 'ranlib' and 'nm' have been compiled with plugin + support. At link time, use the the flag '-fuse-linker-plugin' to + ensure that the library participates in the LTO optimization + process: + + gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo + + With the linker plugin enabled, the linker extracts the needed + GIMPLE files from 'libfoo.a' and passes them on to the running GCC + to make them part of the aggregated GIMPLE image to be optimized. + + If you are not using a linker with plugin support and/or do not + enable the linker plugin, then the objects inside 'libfoo.a' are + extracted and linked as usual, but they do not participate in the + LTO optimization process. In order to make a static library + suitable for both LTO optimization and usual linkage, compile its + object files with '-flto' '-ffat-lto-objects'. + + Link-time optimizations do not require the presence of the whole + program to operate. If the program does not require any symbols to + be exported, it is possible to combine '-flto' and + '-fwhole-program' to allow the interprocedural optimizers to use + more aggressive assumptions which may lead to improved optimization + opportunities. Use of '-fwhole-program' is not needed when linker + plugin is active (see '-fuse-linker-plugin'). + + The current implementation of LTO makes no attempt to generate + bytecode that is portable between different types of hosts. The + bytecode files are versioned and there is a strict version check, + so bytecode files generated in one version of GCC will not work + with an older or newer version of GCC. + + Link-time optimization does not work well with generation of + debugging information. Combining '-flto' with '-g' is currently + experimental and expected to produce unexpected results. + + If you specify the optional N, the optimization and code generation + done at link time is executed in parallel using N parallel jobs by + utilizing an installed 'make' program. The environment variable + 'MAKE' may be used to override the program used. The default value + for N is 1. + + You can also specify '-flto=jobserver' to use GNU make's job server + mode to determine the number of parallel jobs. This is useful when + the Makefile calling GCC is already executing in parallel. You + must prepend a '+' to the command recipe in the parent Makefile for + this to work. This option likely only works if 'MAKE' is GNU make. + +'-flto-partition=ALG' + Specify the partitioning algorithm used by the link-time optimizer. + The value is either '1to1' to specify a partitioning mirroring the + original source files or 'balanced' to specify partitioning into + equally sized chunks (whenever possible) or 'max' to create new + partition for every symbol where possible. Specifying 'none' as an + algorithm disables partitioning and streaming completely. The + default value is 'balanced'. While '1to1' can be used as an + workaround for various code ordering issues, the 'max' partitioning + is intended for internal testing only. + +'-flto-compression-level=N' + This option specifies the level of compression used for + intermediate language written to LTO object files, and is only + meaningful in conjunction with LTO mode ('-flto'). Valid values + are 0 (no compression) to 9 (maximum compression). Values outside + this range are clamped to either 0 or 9. If the option is not + given, a default balanced compression setting is used. + +'-flto-report' + Prints a report with internal details on the workings of the + link-time optimizer. The contents of this report vary from version + to version. It is meant to be useful to GCC developers when + processing object files in LTO mode (via '-flto'). + + Disabled by default. + +'-flto-report-wpa' + Like '-flto-report', but only print for the WPA phase of Link Time + Optimization. + +'-fuse-linker-plugin' + Enables the use of a linker plugin during link-time optimization. + This option relies on plugin support in the linker, which is + available in gold or in GNU ld 2.21 or newer. + + This option enables the extraction of object files with GIMPLE + bytecode out of library archives. This improves the quality of + optimization by exposing more code to the link-time optimizer. + This information specifies what symbols can be accessed externally + (by non-LTO object or during dynamic linking). Resulting code + quality improvements on binaries (and shared libraries that use + hidden visibility) are similar to '-fwhole-program'. See '-flto' + for a description of the effect of this flag and how to use it. + + This option is enabled by default when LTO support in GCC is + enabled and GCC was configured for use with a linker supporting + plugins (GNU ld 2.21 or newer or gold). + +'-ffat-lto-objects' + Fat LTO objects are object files that contain both the intermediate + language and the object code. This makes them usable for both LTO + linking and normal linking. This option is effective only when + compiling with '-flto' and is ignored at link time. + + '-fno-fat-lto-objects' improves compilation time over plain LTO, + but requires the complete toolchain to be aware of LTO. It requires + a linker with linker plugin support for basic functionality. + Additionally, 'nm', 'ar' and 'ranlib' need to support linker + plugins to allow a full-featured build environment (capable of + building static libraries etc). GCC provides the 'gcc-ar', + 'gcc-nm', 'gcc-ranlib' wrappers to pass the right options to these + tools. With non fat LTO makefiles need to be modified to use them. + + The default is '-fno-fat-lto-objects' on targets with linker plugin + support. + +'-fcompare-elim' + After register allocation and post-register allocation instruction + splitting, identify arithmetic instructions that compute processor + flags similar to a comparison operation based on that arithmetic. + If possible, eliminate the explicit comparison operation. + + This pass only applies to certain targets that cannot explicitly + represent the comparison operation before register allocation is + complete. + + Enabled at levels '-O', '-O2', '-O3', '-Os'. + +'-fuse-ld=bfd' + Use the 'bfd' linker instead of the default linker. + +'-fuse-ld=gold' + Use the 'gold' linker instead of the default linker. + +'-fcprop-registers' + After register allocation and post-register allocation instruction + splitting, perform a copy-propagation pass to try to reduce + scheduling dependencies and occasionally eliminate the copy. + + Enabled at levels '-O', '-O2', '-O3', '-Os'. + +'-fprofile-correction' + Profiles collected using an instrumented binary for multi-threaded + programs may be inconsistent due to missed counter updates. When + this option is specified, GCC uses heuristics to correct or smooth + out such inconsistencies. By default, GCC emits an error message + when an inconsistent profile is detected. + +'-fprofile-dir=PATH' + + Set the directory to search for the profile data files in to PATH. + This option affects only the profile data generated by + '-fprofile-generate', '-ftest-coverage', '-fprofile-arcs' and used + by '-fprofile-use' and '-fbranch-probabilities' and its related + options. Both absolute and relative paths can be used. By + default, GCC uses the current directory as PATH, thus the profile + data file appears in the same directory as the object file. + +'-fprofile-generate' +'-fprofile-generate=PATH' + + Enable options usually used for instrumenting application to + produce profile useful for later recompilation with profile + feedback based optimization. You must use '-fprofile-generate' + both when compiling and when linking your program. + + The following options are enabled: '-fprofile-arcs', + '-fprofile-values', '-fvpt'. + + If PATH is specified, GCC looks at the PATH to find the profile + feedback data files. See '-fprofile-dir'. + +'-fprofile-use' +'-fprofile-use=PATH' + Enable profile feedback directed optimizations, and optimizations + generally profitable only with profile feedback available. + + The following options are enabled: '-fbranch-probabilities', + '-fvpt', '-funroll-loops', '-fpeel-loops', '-ftracer', + '-ftree-vectorize', 'ftree-loop-distribute-patterns' + + By default, GCC emits an error message if the feedback profiles do + not match the source code. This error can be turned into a warning + by using '-Wcoverage-mismatch'. Note this may result in poorly + optimized code. + + If PATH is specified, GCC looks at the PATH to find the profile + feedback data files. See '-fprofile-dir'. + + The following options control compiler behavior regarding +floating-point arithmetic. These options trade off between speed and +correctness. All must be specifically enabled. + +'-ffloat-store' + Do not store floating-point variables in registers, and inhibit + other options that might change whether a floating-point value is + taken from a register or memory. + + This option prevents undesirable excess precision on machines such + as the 68000 where the floating registers (of the 68881) keep more + precision than a 'double' is supposed to have. Similarly for the + x86 architecture. For most programs, the excess precision does + only good, but a few programs rely on the precise definition of + IEEE floating point. Use '-ffloat-store' for such programs, after + modifying them to store all pertinent intermediate computations + into variables. + +'-fexcess-precision=STYLE' + This option allows further control over excess precision on + machines where floating-point registers have more precision than + the IEEE 'float' and 'double' types and the processor does not + support operations rounding to those types. By default, + '-fexcess-precision=fast' is in effect; this means that operations + are carried out in the precision of the registers and that it is + unpredictable when rounding to the types specified in the source + code takes place. When compiling C, if + '-fexcess-precision=standard' is specified then excess precision + follows the rules specified in ISO C99; in particular, both casts + and assignments cause values to be rounded to their semantic types + (whereas '-ffloat-store' only affects assignments). This option is + enabled by default for C if a strict conformance option such as + '-std=c99' is used. + + '-fexcess-precision=standard' is not implemented for languages + other than C, and has no effect if '-funsafe-math-optimizations' or + '-ffast-math' is specified. On the x86, it also has no effect if + '-mfpmath=sse' or '-mfpmath=sse+387' is specified; in the former + case, IEEE semantics apply without excess precision, and in the + latter, rounding is unpredictable. + +'-ffast-math' + Sets '-fno-math-errno', '-funsafe-math-optimizations', + '-ffinite-math-only', '-fno-rounding-math', '-fno-signaling-nans' + and '-fcx-limited-range'. + + This option causes the preprocessor macro '__FAST_MATH__' to be + defined. + + This option is not turned on by any '-O' option besides '-Ofast' + since it can result in incorrect output for programs that depend on + an exact implementation of IEEE or ISO rules/specifications for + math functions. It may, however, yield faster code for programs + that do not require the guarantees of these specifications. + +'-fno-math-errno' + Do not set 'errno' after calling math functions that are executed + with a single instruction, e.g., 'sqrt'. A program that relies on + IEEE exceptions for math error handling may want to use this flag + for speed while maintaining IEEE arithmetic compatibility. + + This option is not turned on by any '-O' option since it can result + in incorrect output for programs that depend on an exact + implementation of IEEE or ISO rules/specifications for math + functions. It may, however, yield faster code for programs that do + not require the guarantees of these specifications. + + The default is '-fmath-errno'. + + On Darwin systems, the math library never sets 'errno'. There is + therefore no reason for the compiler to consider the possibility + that it might, and '-fno-math-errno' is the default. + +'-funsafe-math-optimizations' + + Allow optimizations for floating-point arithmetic that (a) assume + that arguments and results are valid and (b) may violate IEEE or + ANSI standards. When used at link-time, it may include libraries + or startup files that change the default FPU control word or other + similar optimizations. + + This option is not turned on by any '-O' option since it can result + in incorrect output for programs that depend on an exact + implementation of IEEE or ISO rules/specifications for math + functions. It may, however, yield faster code for programs that do + not require the guarantees of these specifications. Enables + '-fno-signed-zeros', '-fno-trapping-math', '-fassociative-math' and + '-freciprocal-math'. + + The default is '-fno-unsafe-math-optimizations'. + +'-fassociative-math' + + Allow re-association of operands in series of floating-point + operations. This violates the ISO C and C++ language standard by + possibly changing computation result. NOTE: re-ordering may change + the sign of zero as well as ignore NaNs and inhibit or create + underflow or overflow (and thus cannot be used on code that relies + on rounding behavior like '(x + 2**52) - 2**52'. May also reorder + floating-point comparisons and thus may not be used when ordered + comparisons are required. This option requires that both + '-fno-signed-zeros' and '-fno-trapping-math' be in effect. + Moreover, it doesn't make much sense with '-frounding-math'. For + Fortran the option is automatically enabled when both + '-fno-signed-zeros' and '-fno-trapping-math' are in effect. + + The default is '-fno-associative-math'. + +'-freciprocal-math' + + Allow the reciprocal of a value to be used instead of dividing by + the value if this enables optimizations. For example 'x / y' can + be replaced with 'x * (1/y)', which is useful if '(1/y)' is subject + to common subexpression elimination. Note that this loses + precision and increases the number of flops operating on the value. + + The default is '-fno-reciprocal-math'. + +'-ffinite-math-only' + Allow optimizations for floating-point arithmetic that assume that + arguments and results are not NaNs or +-Infs. + + This option is not turned on by any '-O' option since it can result + in incorrect output for programs that depend on an exact + implementation of IEEE or ISO rules/specifications for math + functions. It may, however, yield faster code for programs that do + not require the guarantees of these specifications. + + The default is '-fno-finite-math-only'. + +'-fno-signed-zeros' + Allow optimizations for floating-point arithmetic that ignore the + signedness of zero. IEEE arithmetic specifies the behavior of + distinct +0.0 and -0.0 values, which then prohibits simplification + of expressions such as x+0.0 or 0.0*x (even with + '-ffinite-math-only'). This option implies that the sign of a zero + result isn't significant. + + The default is '-fsigned-zeros'. + +'-fno-trapping-math' + Compile code assuming that floating-point operations cannot + generate user-visible traps. These traps include division by zero, + overflow, underflow, inexact result and invalid operation. This + option requires that '-fno-signaling-nans' be in effect. Setting + this option may allow faster code if one relies on "non-stop" IEEE + arithmetic, for example. + + This option should never be turned on by any '-O' option since it + can result in incorrect output for programs that depend on an exact + implementation of IEEE or ISO rules/specifications for math + functions. + + The default is '-ftrapping-math'. + +'-frounding-math' + Disable transformations and optimizations that assume default + floating-point rounding behavior. This is round-to-zero for all + floating point to integer conversions, and round-to-nearest for all + other arithmetic truncations. This option should be specified for + programs that change the FP rounding mode dynamically, or that may + be executed with a non-default rounding mode. This option disables + constant folding of floating-point expressions at compile time + (which may be affected by rounding mode) and arithmetic + transformations that are unsafe in the presence of sign-dependent + rounding modes. + + The default is '-fno-rounding-math'. + + This option is experimental and does not currently guarantee to + disable all GCC optimizations that are affected by rounding mode. + Future versions of GCC may provide finer control of this setting + using C99's 'FENV_ACCESS' pragma. This command-line option will be + used to specify the default state for 'FENV_ACCESS'. + +'-fsignaling-nans' + Compile code assuming that IEEE signaling NaNs may generate + user-visible traps during floating-point operations. Setting this + option disables optimizations that may change the number of + exceptions visible with signaling NaNs. This option implies + '-ftrapping-math'. + + This option causes the preprocessor macro '__SUPPORT_SNAN__' to be + defined. + + The default is '-fno-signaling-nans'. + + This option is experimental and does not currently guarantee to + disable all GCC optimizations that affect signaling NaN behavior. + +'-fsingle-precision-constant' + Treat floating-point constants as single precision instead of + implicitly converting them to double-precision constants. + +'-fcx-limited-range' + When enabled, this option states that a range reduction step is not + needed when performing complex division. Also, there is no + checking whether the result of a complex multiplication or division + is 'NaN + I*NaN', with an attempt to rescue the situation in that + case. The default is '-fno-cx-limited-range', but is enabled by + '-ffast-math'. + + This option controls the default setting of the ISO C99 + 'CX_LIMITED_RANGE' pragma. Nevertheless, the option applies to all + languages. + +'-fcx-fortran-rules' + Complex multiplication and division follow Fortran rules. Range + reduction is done as part of complex division, but there is no + checking whether the result of a complex multiplication or division + is 'NaN + I*NaN', with an attempt to rescue the situation in that + case. + + The default is '-fno-cx-fortran-rules'. + + The following options control optimizations that may improve +performance, but are not enabled by any '-O' options. This section +includes experimental options that may produce broken code. + +'-fbranch-probabilities' + After running a program compiled with '-fprofile-arcs' (*note + Options for Debugging Your Program or 'gcc': Debugging Options.), + you can compile it a second time using '-fbranch-probabilities', to + improve optimizations based on the number of times each branch was + taken. When a program compiled with '-fprofile-arcs' exits, it + saves arc execution counts to a file called 'SOURCENAME.gcda' for + each source file. The information in this data file is very + dependent on the structure of the generated code, so you must use + the same source code and the same optimization options for both + compilations. + + With '-fbranch-probabilities', GCC puts a 'REG_BR_PROB' note on + each 'JUMP_INSN' and 'CALL_INSN'. These can be used to improve + optimization. Currently, they are only used in one place: in + 'reorg.c', instead of guessing which path a branch is most likely + to take, the 'REG_BR_PROB' values are used to exactly determine + which path is taken more often. + +'-fprofile-values' + If combined with '-fprofile-arcs', it adds code so that some data + about values of expressions in the program is gathered. + + With '-fbranch-probabilities', it reads back the data gathered from + profiling values of expressions for usage in optimizations. + + Enabled with '-fprofile-generate' and '-fprofile-use'. + +'-fprofile-reorder-functions' + Function reordering based on profile instrumentation collects first + time of execution of a function and orders these functions in + ascending order. + + Enabled with '-fprofile-use'. + +'-fvpt' + If combined with '-fprofile-arcs', this option instructs the + compiler to add code to gather information about values of + expressions. + + With '-fbranch-probabilities', it reads back the data gathered and + actually performs the optimizations based on them. Currently the + optimizations include specialization of division operations using + the knowledge about the value of the denominator. + +'-frename-registers' + Attempt to avoid false dependencies in scheduled code by making use + of registers left over after register allocation. This + optimization most benefits processors with lots of registers. + Depending on the debug information format adopted by the target, + however, it can make debugging impossible, since variables no + longer stay in a "home register". + + Enabled by default with '-funroll-loops' and '-fpeel-loops'. + +'-ftracer' + Perform tail duplication to enlarge superblock size. This + transformation simplifies the control flow of the function allowing + other optimizations to do a better job. + + Enabled with '-fprofile-use'. + +'-funroll-loops' + Unroll loops whose number of iterations can be determined at + compile time or upon entry to the loop. '-funroll-loops' implies + '-frerun-cse-after-loop', '-fweb' and '-frename-registers'. It + also turns on complete loop peeling (i.e. complete removal of loops + with a small constant number of iterations). This option makes + code larger, and may or may not make it run faster. + + Enabled with '-fprofile-use'. + +'-funroll-all-loops' + Unroll all loops, even if their number of iterations is uncertain + when the loop is entered. This usually makes programs run more + slowly. '-funroll-all-loops' implies the same options as + '-funroll-loops'. + +'-fpeel-loops' + Peels loops for which there is enough information that they do not + roll much (from profile feedback). It also turns on complete loop + peeling (i.e. complete removal of loops with small constant number + of iterations). + + Enabled with '-fprofile-use'. + +'-fmove-loop-invariants' + Enables the loop invariant motion pass in the RTL loop optimizer. + Enabled at level '-O1' + +'-funswitch-loops' + Move branches with loop invariant conditions out of the loop, with + duplicates of the loop on both branches (modified according to + result of the condition). + +'-ffunction-sections' +'-fdata-sections' + Place each function or data item into its own section in the output + file if the target supports arbitrary sections. The name of the + function or the name of the data item determines the section's name + in the output file. + + Use these options on systems where the linker can perform + optimizations to improve locality of reference in the instruction + space. Most systems using the ELF object format and SPARC + processors running Solaris 2 have linkers with such optimizations. + AIX may have these optimizations in the future. + + Only use these options when there are significant benefits from + doing so. When you specify these options, the assembler and linker + create larger object and executable files and are also slower. You + cannot use 'gprof' on all systems if you specify this option, and + you may have problems with debugging if you specify both this + option and '-g'. + +'-fbranch-target-load-optimize' + Perform branch target register load optimization before prologue / + epilogue threading. The use of target registers can typically be + exposed only during reload, thus hoisting loads out of loops and + doing inter-block scheduling needs a separate optimization pass. + +'-fbranch-target-load-optimize2' + Perform branch target register load optimization after prologue / + epilogue threading. + +'-fbtr-bb-exclusive' + When performing branch target register load optimization, don't + reuse branch target registers within any basic block. + +'-fstack-protector' + Emit extra code to check for buffer overflows, such as stack + smashing attacks. This is done by adding a guard variable to + functions with vulnerable objects. This includes functions that + call 'alloca', and functions with buffers larger than 8 bytes. The + guards are initialized when a function is entered and then checked + when the function exits. If a guard check fails, an error message + is printed and the program exits. + +'-fstack-protector-all' + Like '-fstack-protector' except that all functions are protected. + +'-fstack-protector-strong' + Like '-fstack-protector' but includes additional functions to be + protected -- those that have local array definitions, or have + references to local frame addresses. + +'-fsection-anchors' + Try to reduce the number of symbolic address calculations by using + shared "anchor" symbols to address nearby objects. This + transformation can help to reduce the number of GOT entries and GOT + accesses on some targets. + + For example, the implementation of the following function 'foo': + + static int a, b, c; + int foo (void) { return a + b + c; } + + usually calculates the addresses of all three variables, but if you + compile it with '-fsection-anchors', it accesses the variables from + a common anchor point instead. The effect is similar to the + following pseudocode (which isn't valid C): + + int foo (void) + { + register int *xr = &x; + return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; + } + + Not all targets support this option. + +'--param NAME=VALUE' + In some places, GCC uses various constants to control the amount of + optimization that is done. For example, GCC does not inline + functions that contain more than a certain number of instructions. + You can control some of these constants on the command line using + the '--param' option. + + The names of specific parameters, and the meaning of the values, + are tied to the internals of the compiler, and are subject to + change without notice in future releases. + + In each case, the VALUE is an integer. The allowable choices for + NAME are: + + 'predictable-branch-outcome' + When branch is predicted to be taken with probability lower + than this threshold (in percent), then it is considered well + predictable. The default is 10. + + 'max-crossjump-edges' + The maximum number of incoming edges to consider for + cross-jumping. The algorithm used by '-fcrossjumping' is + O(N^2) in the number of edges incoming to each block. + Increasing values mean more aggressive optimization, making + the compilation time increase with probably small improvement + in executable size. + + 'min-crossjump-insns' + The minimum number of instructions that must be matched at the + end of two blocks before cross-jumping is performed on them. + This value is ignored in the case where all instructions in + the block being cross-jumped from are matched. The default + value is 5. + + 'max-grow-copy-bb-insns' + The maximum code size expansion factor when copying basic + blocks instead of jumping. The expansion is relative to a + jump instruction. The default value is 8. + + 'max-goto-duplication-insns' + The maximum number of instructions to duplicate to a block + that jumps to a computed goto. To avoid O(N^2) behavior in a + number of passes, GCC factors computed gotos early in the + compilation process, and unfactors them as late as possible. + Only computed jumps at the end of a basic blocks with no more + than max-goto-duplication-insns are unfactored. The default + value is 8. + + 'max-delay-slot-insn-search' + The maximum number of instructions to consider when looking + for an instruction to fill a delay slot. If more than this + arbitrary number of instructions are searched, the time + savings from filling the delay slot are minimal, so stop + searching. Increasing values mean more aggressive + optimization, making the compilation time increase with + probably small improvement in execution time. + + 'max-delay-slot-live-search' + When trying to fill delay slots, the maximum number of + instructions to consider when searching for a block with valid + live register information. Increasing this arbitrarily chosen + value means more aggressive optimization, increasing the + compilation time. This parameter should be removed when the + delay slot code is rewritten to maintain the control-flow + graph. + + 'max-gcse-memory' + The approximate maximum amount of memory that can be allocated + in order to perform the global common subexpression + elimination optimization. If more memory than specified is + required, the optimization is not done. + + 'max-gcse-insertion-ratio' + If the ratio of expression insertions to deletions is larger + than this value for any expression, then RTL PRE inserts or + removes the expression and thus leaves partially redundant + computations in the instruction stream. The default value is + 20. + + 'max-pending-list-length' + The maximum number of pending dependencies scheduling allows + before flushing the current state and starting over. Large + functions with few branches or calls can create excessively + large lists which needlessly consume memory and resources. + + 'max-modulo-backtrack-attempts' + The maximum number of backtrack attempts the scheduler should + make when modulo scheduling a loop. Larger values can + exponentially increase compilation time. + + 'max-inline-insns-single' + Several parameters control the tree inliner used in GCC. This + number sets the maximum number of instructions (counted in + GCC's internal representation) in a single function that the + tree inliner considers for inlining. This only affects + functions declared inline and methods implemented in a class + declaration (C++). The default value is 400. + + 'max-inline-insns-auto' + When you use '-finline-functions' (included in '-O3'), a lot + of functions that would otherwise not be considered for + inlining by the compiler are investigated. To those + functions, a different (more restrictive) limit compared to + functions declared inline can be applied. The default value + is 40. + + 'inline-min-speedup' + When estimated performance improvement of caller + callee + runtime exceeds this threshold (in precent), the function can + be inlined regardless the limit on '--param + max-inline-insns-single' and '--param max-inline-insns-auto'. + + 'large-function-insns' + The limit specifying really large functions. For functions + larger than this limit after inlining, inlining is constrained + by '--param large-function-growth'. This parameter is useful + primarily to avoid extreme compilation time caused by + non-linear algorithms used by the back end. The default value + is 2700. + + 'large-function-growth' + Specifies maximal growth of large function caused by inlining + in percents. The default value is 100 which limits large + function growth to 2.0 times the original size. + + 'large-unit-insns' + The limit specifying large translation unit. Growth caused by + inlining of units larger than this limit is limited by + '--param inline-unit-growth'. For small units this might be + too tight. For example, consider a unit consisting of + function A that is inline and B that just calls A three times. + If B is small relative to A, the growth of unit is 300\% and + yet such inlining is very sane. For very large units + consisting of small inlineable functions, however, the overall + unit growth limit is needed to avoid exponential explosion of + code size. Thus for smaller units, the size is increased to + '--param large-unit-insns' before applying '--param + inline-unit-growth'. The default is 10000. + + 'inline-unit-growth' + Specifies maximal overall growth of the compilation unit + caused by inlining. The default value is 30 which limits unit + growth to 1.3 times the original size. + + 'ipcp-unit-growth' + Specifies maximal overall growth of the compilation unit + caused by interprocedural constant propagation. The default + value is 10 which limits unit growth to 1.1 times the original + size. + + 'large-stack-frame' + The limit specifying large stack frames. While inlining the + algorithm is trying to not grow past this limit too much. The + default value is 256 bytes. + + 'large-stack-frame-growth' + Specifies maximal growth of large stack frames caused by + inlining in percents. The default value is 1000 which limits + large stack frame growth to 11 times the original size. + + 'max-inline-insns-recursive' + 'max-inline-insns-recursive-auto' + Specifies the maximum number of instructions an out-of-line + copy of a self-recursive inline function can grow into by + performing recursive inlining. + + For functions declared inline, '--param + max-inline-insns-recursive' is taken into account. For + functions not declared inline, recursive inlining happens only + when '-finline-functions' (included in '-O3') is enabled and + '--param max-inline-insns-recursive-auto' is used. The + default value is 450. + + 'max-inline-recursive-depth' + 'max-inline-recursive-depth-auto' + Specifies the maximum recursion depth used for recursive + inlining. + + For functions declared inline, '--param + max-inline-recursive-depth' is taken into account. For + functions not declared inline, recursive inlining happens only + when '-finline-functions' (included in '-O3') is enabled and + '--param max-inline-recursive-depth-auto' is used. The + default value is 8. + + 'min-inline-recursive-probability' + Recursive inlining is profitable only for function having deep + recursion in average and can hurt for function having little + recursion depth by increasing the prologue size or complexity + of function body to other optimizers. + + When profile feedback is available (see '-fprofile-generate') + the actual recursion depth can be guessed from probability + that function recurses via a given call expression. This + parameter limits inlining only to call expressions whose + probability exceeds the given threshold (in percents). The + default value is 10. + + 'early-inlining-insns' + Specify growth that the early inliner can make. In effect it + increases the amount of inlining for code having a large + abstraction penalty. The default value is 10. + + 'max-early-inliner-iterations' + 'max-early-inliner-iterations' + Limit of iterations of the early inliner. This basically + bounds the number of nested indirect calls the early inliner + can resolve. Deeper chains are still handled by late + inlining. + + 'comdat-sharing-probability' + 'comdat-sharing-probability' + Probability (in percent) that C++ inline function with comdat + visibility are shared across multiple compilation units. The + default value is 20. + + 'min-vect-loop-bound' + The minimum number of iterations under which loops are not + vectorized when '-ftree-vectorize' is used. The number of + iterations after vectorization needs to be greater than the + value specified by this option to allow vectorization. The + default value is 0. + + 'gcse-cost-distance-ratio' + Scaling factor in calculation of maximum distance an + expression can be moved by GCSE optimizations. This is + currently supported only in the code hoisting pass. The + bigger the ratio, the more aggressive code hoisting is with + simple expressions, i.e., the expressions that have cost less + than 'gcse-unrestricted-cost'. Specifying 0 disables hoisting + of simple expressions. The default value is 10. + + 'gcse-unrestricted-cost' + Cost, roughly measured as the cost of a single typical machine + instruction, at which GCSE optimizations do not constrain the + distance an expression can travel. This is currently + supported only in the code hoisting pass. The lesser the + cost, the more aggressive code hoisting is. Specifying 0 + allows all expressions to travel unrestricted distances. The + default value is 3. + + 'max-hoist-depth' + The depth of search in the dominator tree for expressions to + hoist. This is used to avoid quadratic behavior in hoisting + algorithm. The value of 0 does not limit on the search, but + may slow down compilation of huge functions. The default + value is 30. + + 'max-tail-merge-comparisons' + The maximum amount of similar bbs to compare a bb with. This + is used to avoid quadratic behavior in tree tail merging. The + default value is 10. + + 'max-tail-merge-iterations' + The maximum amount of iterations of the pass over the + function. This is used to limit compilation time in tree tail + merging. The default value is 2. + + 'max-unrolled-insns' + The maximum number of instructions that a loop may have to be + unrolled. If a loop is unrolled, this parameter also + determines how many times the loop code is unrolled. + + 'max-average-unrolled-insns' + The maximum number of instructions biased by probabilities of + their execution that a loop may have to be unrolled. If a + loop is unrolled, this parameter also determines how many + times the loop code is unrolled. + + 'max-unroll-times' + The maximum number of unrollings of a single loop. + + 'max-peeled-insns' + The maximum number of instructions that a loop may have to be + peeled. If a loop is peeled, this parameter also determines + how many times the loop code is peeled. + + 'max-peel-times' + The maximum number of peelings of a single loop. + + 'max-peel-branches' + The maximum number of branches on the hot path through the + peeled sequence. + + 'max-completely-peeled-insns' + The maximum number of insns of a completely peeled loop. + + 'max-completely-peel-times' + The maximum number of iterations of a loop to be suitable for + complete peeling. + + 'max-completely-peel-loop-nest-depth' + The maximum depth of a loop nest suitable for complete + peeling. + + 'max-unswitch-insns' + The maximum number of insns of an unswitched loop. + + 'max-unswitch-level' + The maximum number of branches unswitched in a single loop. + + 'lim-expensive' + The minimum cost of an expensive expression in the loop + invariant motion. + + 'iv-consider-all-candidates-bound' + Bound on number of candidates for induction variables, below + which all candidates are considered for each use in induction + variable optimizations. If there are more candidates than + this, only the most relevant ones are considered to avoid + quadratic time complexity. + + 'iv-max-considered-uses' + The induction variable optimizations give up on loops that + contain more induction variable uses. + + 'iv-always-prune-cand-set-bound' + If the number of candidates in the set is smaller than this + value, always try to remove unnecessary ivs from the set when + adding a new one. + + 'scev-max-expr-size' + Bound on size of expressions used in the scalar evolutions + analyzer. Large expressions slow the analyzer. + + 'scev-max-expr-complexity' + Bound on the complexity of the expressions in the scalar + evolutions analyzer. Complex expressions slow the analyzer. + + 'omega-max-vars' + The maximum number of variables in an Omega constraint system. + The default value is 128. + + 'omega-max-geqs' + The maximum number of inequalities in an Omega constraint + system. The default value is 256. + + 'omega-max-eqs' + The maximum number of equalities in an Omega constraint + system. The default value is 128. + + 'omega-max-wild-cards' + The maximum number of wildcard variables that the Omega solver + is able to insert. The default value is 18. + + 'omega-hash-table-size' + The size of the hash table in the Omega solver. The default + value is 550. + + 'omega-max-keys' + The maximal number of keys used by the Omega solver. The + default value is 500. + + 'omega-eliminate-redundant-constraints' + When set to 1, use expensive methods to eliminate all + redundant constraints. The default value is 0. + + 'vect-max-version-for-alignment-checks' + The maximum number of run-time checks that can be performed + when doing loop versioning for alignment in the vectorizer. + + 'vect-max-version-for-alias-checks' + The maximum number of run-time checks that can be performed + when doing loop versioning for alias in the vectorizer. + + 'vect-max-peeling-for-alignment' + The maximum number of loop peels to enhance access alignment + for vectorizer. Value -1 means 'no limit'. + + 'max-iterations-to-track' + The maximum number of iterations of a loop the brute-force + algorithm for analysis of the number of iterations of the loop + tries to evaluate. + + 'hot-bb-count-ws-permille' + A basic block profile count is considered hot if it + contributes to the given permillage (i.e. 0...1000) of the + entire profiled execution. + + 'hot-bb-frequency-fraction' + Select fraction of the entry block frequency of executions of + basic block in function given basic block needs to have to be + considered hot. + + 'max-predicted-iterations' + The maximum number of loop iterations we predict statically. + This is useful in cases where a function contains a single + loop with known bound and another loop with unknown bound. + The known number of iterations is predicted correctly, while + the unknown number of iterations average to roughly 10. This + means that the loop without bounds appears artificially cold + relative to the other one. + + 'builtin-expect-probability' + Control the probability of the expression having the specified + value. This parameter takes a percentage (i.e. 0 ... 100) + as input. The default probability of 90 is obtained + empirically. + + 'align-threshold' + + Select fraction of the maximal frequency of executions of a + basic block in a function to align the basic block. + + 'align-loop-iterations' + + A loop expected to iterate at least the selected number of + iterations is aligned. + + 'tracer-dynamic-coverage' + 'tracer-dynamic-coverage-feedback' + + This value is used to limit superblock formation once the + given percentage of executed instructions is covered. This + limits unnecessary code size expansion. + + The 'tracer-dynamic-coverage-feedback' is used only when + profile feedback is available. The real profiles (as opposed + to statically estimated ones) are much less balanced allowing + the threshold to be larger value. + + 'tracer-max-code-growth' + Stop tail duplication once code growth has reached given + percentage. This is a rather artificial limit, as most of the + duplicates are eliminated later in cross jumping, so it may be + set to much higher values than is the desired code growth. + + 'tracer-min-branch-ratio' + + Stop reverse growth when the reverse probability of best edge + is less than this threshold (in percent). + + 'tracer-min-branch-ratio' + 'tracer-min-branch-ratio-feedback' + + Stop forward growth if the best edge has probability lower + than this threshold. + + Similarly to 'tracer-dynamic-coverage' two values are present, + one for compilation for profile feedback and one for + compilation without. The value for compilation with profile + feedback needs to be more conservative (higher) in order to + make tracer effective. + + 'max-cse-path-length' + + The maximum number of basic blocks on path that CSE considers. + The default is 10. + + 'max-cse-insns' + The maximum number of instructions CSE processes before + flushing. The default is 1000. + + 'ggc-min-expand' + + GCC uses a garbage collector to manage its own memory + allocation. This parameter specifies the minimum percentage + by which the garbage collector's heap should be allowed to + expand between collections. Tuning this may improve + compilation speed; it has no effect on code generation. + + The default is 30% + 70% * (RAM/1GB) with an upper bound of + 100% when RAM >= 1GB. If 'getrlimit' is available, the notion + of "RAM" is the smallest of actual RAM and 'RLIMIT_DATA' or + 'RLIMIT_AS'. If GCC is not able to calculate RAM on a + particular platform, the lower bound of 30% is used. Setting + this parameter and 'ggc-min-heapsize' to zero causes a full + collection to occur at every opportunity. This is extremely + slow, but can be useful for debugging. + + 'ggc-min-heapsize' + + Minimum size of the garbage collector's heap before it begins + bothering to collect garbage. The first collection occurs + after the heap expands by 'ggc-min-expand'% beyond + 'ggc-min-heapsize'. Again, tuning this may improve + compilation speed, and has no effect on code generation. + + The default is the smaller of RAM/8, RLIMIT_RSS, or a limit + that tries to ensure that RLIMIT_DATA or RLIMIT_AS are not + exceeded, but with a lower bound of 4096 (four megabytes) and + an upper bound of 131072 (128 megabytes). If GCC is not able + to calculate RAM on a particular platform, the lower bound is + used. Setting this parameter very large effectively disables + garbage collection. Setting this parameter and + 'ggc-min-expand' to zero causes a full collection to occur at + every opportunity. + + 'max-reload-search-insns' + The maximum number of instruction reload should look backward + for equivalent register. Increasing values mean more + aggressive optimization, making the compilation time increase + with probably slightly better performance. The default value + is 100. + + 'max-cselib-memory-locations' + The maximum number of memory locations cselib should take into + account. Increasing values mean more aggressive optimization, + making the compilation time increase with probably slightly + better performance. The default value is 500. + + 'reorder-blocks-duplicate' + 'reorder-blocks-duplicate-feedback' + + Used by the basic block reordering pass to decide whether to + use unconditional branch or duplicate the code on its + destination. Code is duplicated when its estimated size is + smaller than this value multiplied by the estimated size of + unconditional jump in the hot spots of the program. + + The 'reorder-block-duplicate-feedback' is used only when + profile feedback is available. It may be set to higher values + than 'reorder-block-duplicate' since information about the hot + spots is more accurate. + + 'max-sched-ready-insns' + The maximum number of instructions ready to be issued the + scheduler should consider at any given time during the first + scheduling pass. Increasing values mean more thorough + searches, making the compilation time increase with probably + little benefit. The default value is 100. + + 'max-sched-region-blocks' + The maximum number of blocks in a region to be considered for + interblock scheduling. The default value is 10. + + 'max-pipeline-region-blocks' + The maximum number of blocks in a region to be considered for + pipelining in the selective scheduler. The default value is + 15. + + 'max-sched-region-insns' + The maximum number of insns in a region to be considered for + interblock scheduling. The default value is 100. + + 'max-pipeline-region-insns' + The maximum number of insns in a region to be considered for + pipelining in the selective scheduler. The default value is + 200. + + 'min-spec-prob' + The minimum probability (in percents) of reaching a source + block for interblock speculative scheduling. The default + value is 40. + + 'max-sched-extend-regions-iters' + The maximum number of iterations through CFG to extend + regions. A value of 0 (the default) disables region + extensions. + + 'max-sched-insn-conflict-delay' + The maximum conflict delay for an insn to be considered for + speculative motion. The default value is 3. + + 'sched-spec-prob-cutoff' + The minimal probability of speculation success (in percents), + so that speculative insns are scheduled. The default value is + 40. + + 'sched-spec-state-edge-prob-cutoff' + The minimum probability an edge must have for the scheduler to + save its state across it. The default value is 10. + + 'sched-mem-true-dep-cost' + Minimal distance (in CPU cycles) between store and load + targeting same memory locations. The default value is 1. + + 'selsched-max-lookahead' + The maximum size of the lookahead window of selective + scheduling. It is a depth of search for available + instructions. The default value is 50. + + 'selsched-max-sched-times' + The maximum number of times that an instruction is scheduled + during selective scheduling. This is the limit on the number + of iterations through which the instruction may be pipelined. + The default value is 2. + + 'selsched-max-insns-to-rename' + The maximum number of best instructions in the ready list that + are considered for renaming in the selective scheduler. The + default value is 2. + + 'sms-min-sc' + The minimum value of stage count that swing modulo scheduler + generates. The default value is 2. + + 'max-last-value-rtl' + The maximum size measured as number of RTLs that can be + recorded in an expression in combiner for a pseudo register as + last known value of that register. The default is 10000. + + 'integer-share-limit' + Small integer constants can use a shared data structure, + reducing the compiler's memory usage and increasing its speed. + This sets the maximum value of a shared integer constant. The + default value is 256. + + 'ssp-buffer-size' + The minimum size of buffers (i.e. arrays) that receive stack + smashing protection when '-fstack-protection' is used. + + 'min-size-for-stack-sharing' + The minimum size of variables taking part in stack slot + sharing when not optimizing. The default value is 32. + + 'max-jump-thread-duplication-stmts' + Maximum number of statements allowed in a block that needs to + be duplicated when threading jumps. + + 'max-fields-for-field-sensitive' + Maximum number of fields in a structure treated in a field + sensitive manner during pointer analysis. The default is zero + for '-O0' and '-O1', and 100 for '-Os', '-O2', and '-O3'. + + 'prefetch-latency' + Estimate on average number of instructions that are executed + before prefetch finishes. The distance prefetched ahead is + proportional to this constant. Increasing this number may + also lead to less streams being prefetched (see + 'simultaneous-prefetches'). + + 'simultaneous-prefetches' + Maximum number of prefetches that can run at the same time. + + 'l1-cache-line-size' + The size of cache line in L1 cache, in bytes. + + 'l1-cache-size' + The size of L1 cache, in kilobytes. + + 'l2-cache-size' + The size of L2 cache, in kilobytes. + + 'min-insn-to-prefetch-ratio' + The minimum ratio between the number of instructions and the + number of prefetches to enable prefetching in a loop. + + 'prefetch-min-insn-to-mem-ratio' + The minimum ratio between the number of instructions and the + number of memory references to enable prefetching in a loop. + + 'use-canonical-types' + Whether the compiler should use the "canonical" type system. + By default, this should always be 1, which uses a more + efficient internal mechanism for comparing types in C++ and + Objective-C++. However, if bugs in the canonical type system + are causing compilation failures, set this value to 0 to + disable canonical types. + + 'switch-conversion-max-branch-ratio' + Switch initialization conversion refuses to create arrays that + are bigger than 'switch-conversion-max-branch-ratio' times the + number of branches in the switch. + + 'max-partial-antic-length' + Maximum length of the partial antic set computed during the + tree partial redundancy elimination optimization + ('-ftree-pre') when optimizing at '-O3' and above. For some + sorts of source code the enhanced partial redundancy + elimination optimization can run away, consuming all of the + memory available on the host machine. This parameter sets a + limit on the length of the sets that are computed, which + prevents the runaway behavior. Setting a value of 0 for this + parameter allows an unlimited set length. + + 'sccvn-max-scc-size' + Maximum size of a strongly connected component (SCC) during + SCCVN processing. If this limit is hit, SCCVN processing for + the whole function is not done and optimizations depending on + it are disabled. The default maximum SCC size is 10000. + + 'sccvn-max-alias-queries-per-access' + Maximum number of alias-oracle queries we perform when looking + for redundancies for loads and stores. If this limit is hit + the search is aborted and the load or store is not considered + redundant. The number of queries is algorithmically limited + to the number of stores on all paths from the load to the + function entry. The default maxmimum number of queries is + 1000. + + 'ira-max-loops-num' + IRA uses regional register allocation by default. If a + function contains more loops than the number given by this + parameter, only at most the given number of the most + frequently-executed loops form regions for regional register + allocation. The default value of the parameter is 100. + + 'ira-max-conflict-table-size' + Although IRA uses a sophisticated algorithm to compress the + conflict table, the table can still require excessive amounts + of memory for huge functions. If the conflict table for a + function could be more than the size in MB given by this + parameter, the register allocator instead uses a faster, + simpler, and lower-quality algorithm that does not require + building a pseudo-register conflict table. The default value + of the parameter is 2000. + + 'ira-loop-reserved-regs' + IRA can be used to evaluate more accurate register pressure in + loops for decisions to move loop invariants (see '-O3'). The + number of available registers reserved for some other purposes + is given by this parameter. The default value of the + parameter is 2, which is the minimal number of registers + needed by typical instructions. This value is the best found + from numerous experiments. + + 'loop-invariant-max-bbs-in-loop' + Loop invariant motion can be very expensive, both in + compilation time and in amount of needed compile-time memory, + with very large loops. Loops with more basic blocks than this + parameter won't have loop invariant motion optimization + performed on them. The default value of the parameter is 1000 + for '-O1' and 10000 for '-O2' and above. + + 'loop-max-datarefs-for-datadeps' + Building data dapendencies is expensive for very large loops. + This parameter limits the number of data references in loops + that are considered for data dependence analysis. These large + loops are no handled by the optimizations using loop data + dependencies. The default value is 1000. + + 'max-vartrack-size' + Sets a maximum number of hash table slots to use during + variable tracking dataflow analysis of any function. If this + limit is exceeded with variable tracking at assignments + enabled, analysis for that function is retried without it, + after removing all debug insns from the function. If the + limit is exceeded even without debug insns, var tracking + analysis is completely disabled for the function. Setting the + parameter to zero makes it unlimited. + + 'max-vartrack-expr-depth' + Sets a maximum number of recursion levels when attempting to + map variable names or debug temporaries to value expressions. + This trades compilation time for more complete debug + information. If this is set too low, value expressions that + are available and could be represented in debug information + may end up not being used; setting this higher may enable the + compiler to find more complex debug expressions, but compile + time and memory use may grow. The default is 12. + + 'min-nondebug-insn-uid' + Use uids starting at this parameter for nondebug insns. The + range below the parameter is reserved exclusively for debug + insns created by '-fvar-tracking-assignments', but debug insns + may get (non-overlapping) uids above it if the reserved range + is exhausted. + + 'ipa-sra-ptr-growth-factor' + IPA-SRA replaces a pointer to an aggregate with one or more + new parameters only when their cumulative size is less or + equal to 'ipa-sra-ptr-growth-factor' times the size of the + original pointer parameter. + + 'tm-max-aggregate-size' + When making copies of thread-local variables in a transaction, + this parameter specifies the size in bytes after which + variables are saved with the logging functions as opposed to + save/restore code sequence pairs. This option only applies + when using '-fgnu-tm'. + + 'graphite-max-nb-scop-params' + To avoid exponential effects in the Graphite loop transforms, + the number of parameters in a Static Control Part (SCoP) is + bounded. The default value is 10 parameters. A variable + whose value is unknown at compilation time and defined outside + a SCoP is a parameter of the SCoP. + + 'graphite-max-bbs-per-function' + To avoid exponential effects in the detection of SCoPs, the + size of the functions analyzed by Graphite is bounded. The + default value is 100 basic blocks. + + 'loop-block-tile-size' + Loop blocking or strip mining transforms, enabled with + '-floop-block' or '-floop-strip-mine', strip mine each loop in + the loop nest by a given number of iterations. The strip + length can be changed using the 'loop-block-tile-size' + parameter. The default value is 51 iterations. + + 'ipa-cp-value-list-size' + IPA-CP attempts to track all possible values and types passed + to a function's parameter in order to propagate them and + perform devirtualization. 'ipa-cp-value-list-size' is the + maximum number of values and types it stores per one formal + parameter of a function. + + 'lto-partitions' + Specify desired number of partitions produced during WHOPR + compilation. The number of partitions should exceed the + number of CPUs used for compilation. The default value is 32. + + 'lto-minpartition' + Size of minimal partition for WHOPR (in estimated + instructions). This prevents expenses of splitting very small + programs into too many partitions. + + 'cxx-max-namespaces-for-diagnostic-help' + The maximum number of namespaces to consult for suggestions + when C++ name lookup fails for an identifier. The default is + 1000. + + 'sink-frequency-threshold' + The maximum relative execution frequency (in percents) of the + target block relative to a statement's original block to allow + statement sinking of a statement. Larger numbers result in + more aggressive statement sinking. The default value is 75. + A small positive adjustment is applied for statements with + memory operands as those are even more profitable so sink. + + 'max-stores-to-sink' + The maximum number of conditional stores paires that can be + sunk. Set to 0 if either vectorization ('-ftree-vectorize') + or if-conversion ('-ftree-loop-if-convert') is disabled. The + default is 2. + + 'allow-load-data-races' + Allow optimizers to introduce new data races on loads. Set to + 1 to allow, otherwise to 0. This option is enabled by default + unless implicitly set by the '-fmemory-model=' option. + + 'allow-store-data-races' + Allow optimizers to introduce new data races on stores. Set + to 1 to allow, otherwise to 0. This option is enabled by + default unless implicitly set by the '-fmemory-model=' option. + + 'allow-packed-load-data-races' + Allow optimizers to introduce new data races on packed data + loads. Set to 1 to allow, otherwise to 0. This option is + enabled by default unless implicitly set by the + '-fmemory-model=' option. + + 'allow-packed-store-data-races' + Allow optimizers to introduce new data races on packed data + stores. Set to 1 to allow, otherwise to 0. This option is + enabled by default unless implicitly set by the + '-fmemory-model=' option. + + 'case-values-threshold' + The smallest number of different values for which it is best + to use a jump-table instead of a tree of conditional branches. + If the value is 0, use the default for the machine. The + default is 0. + + 'tree-reassoc-width' + Set the maximum number of instructions executed in parallel in + reassociated tree. This parameter overrides target dependent + heuristics used by default if has non zero value. + + 'sched-pressure-algorithm' + Choose between the two available implementations of + '-fsched-pressure'. Algorithm 1 is the original + implementation and is the more likely to prevent instructions + from being reordered. Algorithm 2 was designed to be a + compromise between the relatively conservative approach taken + by algorithm 1 and the rather aggressive approach taken by the + default scheduler. It relies more heavily on having a regular + register file and accurate register pressure classes. See + 'haifa-sched.c' in the GCC sources for more details. + + The default choice depends on the target. + + 'max-slsr-cand-scan' + Set the maximum number of existing candidates that will be + considered when seeking a basis for a new straight-line + strength reduction candidate. + + 'asan-globals' + Enable buffer overflow detection for global objects. This + kind of protection is enabled by default if you are using + '-fsanitize=address' option. To disable global objects + protection use '--param asan-globals=0'. + + 'asan-stack' + Enable buffer overflow detection for stack objects. This kind + of protection is enabled by default when + using'-fsanitize=address'. To disable stack protection use + '--param asan-stack=0' option. + + 'asan-instrument-reads' + Enable buffer overflow detection for memory reads. This kind + of protection is enabled by default when using + '-fsanitize=address'. To disable memory reads protection use + '--param asan-instrument-reads=0'. + + 'asan-instrument-writes' + Enable buffer overflow detection for memory writes. This kind + of protection is enabled by default when using + '-fsanitize=address'. To disable memory writes protection use + '--param asan-instrument-writes=0' option. + + 'asan-memintrin' + Enable detection for built-in functions. This kind of + protection is enabled by default when using + '-fsanitize=address'. To disable built-in functions + protection use '--param asan-memintrin=0'. + + 'asan-use-after-return' + Enable detection of use-after-return. This kind of protection + is enabled by default when using '-fsanitize=address' option. + To disable use-after-return detection use '--param + asan-use-after-return=0'. + + +File: gcc.info, Node: Preprocessor Options, Next: Assembler Options, Prev: Optimize Options, Up: Invoking GCC + +3.11 Options Controlling the Preprocessor +========================================= + +These options control the C preprocessor, which is run on each C source +file before actual compilation. + + If you use the '-E' option, nothing is done except preprocessing. Some +of these options make sense only together with '-E' because they cause +the preprocessor output to be unsuitable for actual compilation. + +'-Wp,OPTION' + You can use '-Wp,OPTION' to bypass the compiler driver and pass + OPTION directly through to the preprocessor. If OPTION contains + commas, it is split into multiple options at the commas. However, + many options are modified, translated or interpreted by the + compiler driver before being passed to the preprocessor, and '-Wp' + forcibly bypasses this phase. The preprocessor's direct interface + is undocumented and subject to change, so whenever possible you + should avoid using '-Wp' and let the driver handle the options + instead. + +'-Xpreprocessor OPTION' + Pass OPTION as an option to the preprocessor. You can use this to + supply system-specific preprocessor options that GCC does not + recognize. + + If you want to pass an option that takes an argument, you must use + '-Xpreprocessor' twice, once for the option and once for the + argument. + +'-no-integrated-cpp' + Perform preprocessing as a separate pass before compilation. By + default, GCC performs preprocessing as an integrated part of input + tokenization and parsing. If this option is provided, the + appropriate language front end ('cc1', 'cc1plus', or 'cc1obj' for + C, C++, and Objective-C, respectively) is instead invoked twice, + once for preprocessing only and once for actual compilation of the + preprocessed input. This option may be useful in conjunction with + the '-B' or '-wrapper' options to specify an alternate preprocessor + or perform additional processing of the program source between + normal preprocessing and compilation. + +'-D NAME' + Predefine NAME as a macro, with definition '1'. + +'-D NAME=DEFINITION' + The contents of DEFINITION are tokenized and processed as if they + appeared during translation phase three in a '#define' directive. + In particular, the definition will be truncated by embedded newline + characters. + + If you are invoking the preprocessor from a shell or shell-like + program you may need to use the shell's quoting syntax to protect + characters such as spaces that have a meaning in the shell syntax. + + If you wish to define a function-like macro on the command line, + write its argument list with surrounding parentheses before the + equals sign (if any). Parentheses are meaningful to most shells, + so you will need to quote the option. With 'sh' and 'csh', + '-D'NAME(ARGS...)=DEFINITION'' works. + + '-D' and '-U' options are processed in the order they are given on + the command line. All '-imacros FILE' and '-include FILE' options + are processed after all '-D' and '-U' options. + +'-U NAME' + Cancel any previous definition of NAME, either built in or provided + with a '-D' option. + +'-undef' + Do not predefine any system-specific or GCC-specific macros. The + standard predefined macros remain defined. + +'-I DIR' + Add the directory DIR to the list of directories to be searched for + header files. Directories named by '-I' are searched before the + standard system include directories. If the directory DIR is a + standard system include directory, the option is ignored to ensure + that the default search order for system directories and the + special treatment of system headers are not defeated . If DIR + begins with '=', then the '=' will be replaced by the sysroot + prefix; see '--sysroot' and '-isysroot'. + +'-o FILE' + Write output to FILE. This is the same as specifying FILE as the + second non-option argument to 'cpp'. 'gcc' has a different + interpretation of a second non-option argument, so you must use + '-o' to specify the output file. + +'-Wall' + Turns on all optional warnings which are desirable for normal code. + At present this is '-Wcomment', '-Wtrigraphs', '-Wmultichar' and a + warning about integer promotion causing a change of sign in '#if' + expressions. Note that many of the preprocessor's warnings are on + by default and have no options to control them. + +'-Wcomment' +'-Wcomments' + Warn whenever a comment-start sequence '/*' appears in a '/*' + comment, or whenever a backslash-newline appears in a '//' comment. + (Both forms have the same effect.) + +'-Wtrigraphs' + Most trigraphs in comments cannot affect the meaning of the + program. However, a trigraph that would form an escaped newline + ('??/' at the end of a line) can, by changing where the comment + begins or ends. Therefore, only trigraphs that would form escaped + newlines produce warnings inside a comment. + + This option is implied by '-Wall'. If '-Wall' is not given, this + option is still enabled unless trigraphs are enabled. To get + trigraph conversion without warnings, but get the other '-Wall' + warnings, use '-trigraphs -Wall -Wno-trigraphs'. + +'-Wtraditional' + Warn about certain constructs that behave differently in + traditional and ISO C. Also warn about ISO C constructs that have + no traditional C equivalent, and problematic constructs which + should be avoided. + +'-Wundef' + Warn whenever an identifier which is not a macro is encountered in + an '#if' directive, outside of 'defined'. Such identifiers are + replaced with zero. + +'-Wunused-macros' + Warn about macros defined in the main file that are unused. A + macro is "used" if it is expanded or tested for existence at least + once. The preprocessor will also warn if the macro has not been + used at the time it is redefined or undefined. + + Built-in macros, macros defined on the command line, and macros + defined in include files are not warned about. + + _Note:_ If a macro is actually used, but only used in skipped + conditional blocks, then CPP will report it as unused. To avoid + the warning in such a case, you might improve the scope of the + macro's definition by, for example, moving it into the first + skipped block. Alternatively, you could provide a dummy use with + something like: + + #if defined the_macro_causing_the_warning + #endif + +'-Wendif-labels' + Warn whenever an '#else' or an '#endif' are followed by text. This + usually happens in code of the form + + #if FOO + ... + #else FOO + ... + #endif FOO + + The second and third 'FOO' should be in comments, but often are not + in older programs. This warning is on by default. + +'-Werror' + Make all warnings into hard errors. Source code which triggers + warnings will be rejected. + +'-Wsystem-headers' + Issue warnings for code in system headers. These are normally + unhelpful in finding bugs in your own code, therefore suppressed. + If you are responsible for the system library, you may want to see + them. + +'-w' + Suppress all warnings, including those which GNU CPP issues by + default. + +'-pedantic' + Issue all the mandatory diagnostics listed in the C standard. Some + of them are left out by default, since they trigger frequently on + harmless code. + +'-pedantic-errors' + Issue all the mandatory diagnostics, and make all mandatory + diagnostics into errors. This includes mandatory diagnostics that + GCC issues without '-pedantic' but treats as warnings. + +'-M' + Instead of outputting the result of preprocessing, output a rule + suitable for 'make' describing the dependencies of the main source + file. The preprocessor outputs one 'make' rule containing the + object file name for that source file, a colon, and the names of + all the included files, including those coming from '-include' or + '-imacros' command line options. + + Unless specified explicitly (with '-MT' or '-MQ'), the object file + name consists of the name of the source file with any suffix + replaced with object file suffix and with any leading directory + parts removed. If there are many included files then the rule is + split into several lines using '\'-newline. The rule has no + commands. + + This option does not suppress the preprocessor's debug output, such + as '-dM'. To avoid mixing such debug output with the dependency + rules you should explicitly specify the dependency output file with + '-MF', or use an environment variable like 'DEPENDENCIES_OUTPUT' + (*note Environment Variables::). Debug output will still be sent + to the regular output stream as normal. + + Passing '-M' to the driver implies '-E', and suppresses warnings + with an implicit '-w'. + +'-MM' + Like '-M' but do not mention header files that are found in system + header directories, nor header files that are included, directly or + indirectly, from such a header. + + This implies that the choice of angle brackets or double quotes in + an '#include' directive does not in itself determine whether that + header will appear in '-MM' dependency output. This is a slight + change in semantics from GCC versions 3.0 and earlier. + +'-MF FILE' + When used with '-M' or '-MM', specifies a file to write the + dependencies to. If no '-MF' switch is given the preprocessor + sends the rules to the same place it would have sent preprocessed + output. + + When used with the driver options '-MD' or '-MMD', '-MF' overrides + the default dependency output file. + +'-MG' + In conjunction with an option such as '-M' requesting dependency + generation, '-MG' assumes missing header files are generated files + and adds them to the dependency list without raising an error. The + dependency filename is taken directly from the '#include' directive + without prepending any path. '-MG' also suppresses preprocessed + output, as a missing header file renders this useless. + + This feature is used in automatic updating of makefiles. + +'-MP' + This option instructs CPP to add a phony target for each dependency + other than the main file, causing each to depend on nothing. These + dummy rules work around errors 'make' gives if you remove header + files without updating the 'Makefile' to match. + + This is typical output: + + test.o: test.c test.h + + test.h: + +'-MT TARGET' + + Change the target of the rule emitted by dependency generation. By + default CPP takes the name of the main input file, deletes any + directory components and any file suffix such as '.c', and appends + the platform's usual object suffix. The result is the target. + + An '-MT' option will set the target to be exactly the string you + specify. If you want multiple targets, you can specify them as a + single argument to '-MT', or use multiple '-MT' options. + + For example, '-MT '$(objpfx)foo.o'' might give + + $(objpfx)foo.o: foo.c + +'-MQ TARGET' + + Same as '-MT', but it quotes any characters which are special to + Make. '-MQ '$(objpfx)foo.o'' gives + + $$(objpfx)foo.o: foo.c + + The default target is automatically quoted, as if it were given + with '-MQ'. + +'-MD' + '-MD' is equivalent to '-M -MF FILE', except that '-E' is not + implied. The driver determines FILE based on whether an '-o' + option is given. If it is, the driver uses its argument but with a + suffix of '.d', otherwise it takes the name of the input file, + removes any directory components and suffix, and applies a '.d' + suffix. + + If '-MD' is used in conjunction with '-E', any '-o' switch is + understood to specify the dependency output file (*note -MF: + dashMF.), but if used without '-E', each '-o' is understood to + specify a target object file. + + Since '-E' is not implied, '-MD' can be used to generate a + dependency output file as a side-effect of the compilation process. + +'-MMD' + Like '-MD' except mention only user header files, not system header + files. + +'-fpch-deps' + When using precompiled headers (*note Precompiled Headers::), this + flag will cause the dependency-output flags to also list the files + from the precompiled header's dependencies. If not specified only + the precompiled header would be listed and not the files that were + used to create it because those files are not consulted when a + precompiled header is used. + +'-fpch-preprocess' + This option allows use of a precompiled header (*note Precompiled + Headers::) together with '-E'. It inserts a special '#pragma', + '#pragma GCC pch_preprocess "FILENAME"' in the output to mark the + place where the precompiled header was found, and its FILENAME. + When '-fpreprocessed' is in use, GCC recognizes this '#pragma' and + loads the PCH. + + This option is off by default, because the resulting preprocessed + output is only really suitable as input to GCC. It is switched on + by '-save-temps'. + + You should not write this '#pragma' in your own code, but it is + safe to edit the filename if the PCH file is available in a + different location. The filename may be absolute or it may be + relative to GCC's current directory. + +'-x c' +'-x c++' +'-x objective-c' +'-x assembler-with-cpp' + Specify the source language: C, C++, Objective-C, or assembly. + This has nothing to do with standards conformance or extensions; it + merely selects which base syntax to expect. If you give none of + these options, cpp will deduce the language from the extension of + the source file: '.c', '.cc', '.m', or '.S'. Some other common + extensions for C++ and assembly are also recognized. If cpp does + not recognize the extension, it will treat the file as C; this is + the most generic mode. + + _Note:_ Previous versions of cpp accepted a '-lang' option which + selected both the language and the standards conformance level. + This option has been removed, because it conflicts with the '-l' + option. + +'-std=STANDARD' +'-ansi' + Specify the standard to which the code should conform. Currently + CPP knows about C and C++ standards; others may be added in the + future. + + STANDARD may be one of: + 'c90' + 'c89' + 'iso9899:1990' + The ISO C standard from 1990. 'c90' is the customary + shorthand for this version of the standard. + + The '-ansi' option is equivalent to '-std=c90'. + + 'iso9899:199409' + The 1990 C standard, as amended in 1994. + + 'iso9899:1999' + 'c99' + 'iso9899:199x' + 'c9x' + The revised ISO C standard, published in December 1999. + Before publication, this was known as C9X. + + 'iso9899:2011' + 'c11' + 'c1x' + The revised ISO C standard, published in December 2011. + Before publication, this was known as C1X. + + 'gnu90' + 'gnu89' + The 1990 C standard plus GNU extensions. This is the default. + + 'gnu99' + 'gnu9x' + The 1999 C standard plus GNU extensions. + + 'gnu11' + 'gnu1x' + The 2011 C standard plus GNU extensions. + + 'c++98' + The 1998 ISO C++ standard plus amendments. + + 'gnu++98' + The same as '-std=c++98' plus GNU extensions. This is the + default for C++ code. + +'-I-' + Split the include path. Any directories specified with '-I' + options before '-I-' are searched only for headers requested with + '#include "FILE"'; they are not searched for '#include <FILE>'. If + additional directories are specified with '-I' options after the + '-I-', those directories are searched for all '#include' + directives. + + In addition, '-I-' inhibits the use of the directory of the current + file directory as the first search directory for '#include "FILE"'. + This option has been deprecated. + +'-nostdinc' + Do not search the standard system directories for header files. + Only the directories you have specified with '-I' options (and the + directory of the current file, if appropriate) are searched. + +'-nostdinc++' + Do not search for header files in the C++-specific standard + directories, but do still search the other standard directories. + (This option is used when building the C++ library.) + +'-include FILE' + Process FILE as if '#include "file"' appeared as the first line of + the primary source file. However, the first directory searched for + FILE is the preprocessor's working directory _instead of_ the + directory containing the main source file. If not found there, it + is searched for in the remainder of the '#include "..."' search + chain as normal. + + If multiple '-include' options are given, the files are included in + the order they appear on the command line. + +'-imacros FILE' + Exactly like '-include', except that any output produced by + scanning FILE is thrown away. Macros it defines remain defined. + This allows you to acquire all the macros from a header without + also processing its declarations. + + All files specified by '-imacros' are processed before all files + specified by '-include'. + +'-idirafter DIR' + Search DIR for header files, but do it _after_ all directories + specified with '-I' and the standard system directories have been + exhausted. DIR is treated as a system include directory. If DIR + begins with '=', then the '=' will be replaced by the sysroot + prefix; see '--sysroot' and '-isysroot'. + +'-iprefix PREFIX' + Specify PREFIX as the prefix for subsequent '-iwithprefix' options. + If the prefix represents a directory, you should include the final + '/'. + +'-iwithprefix DIR' +'-iwithprefixbefore DIR' + Append DIR to the prefix specified previously with '-iprefix', and + add the resulting directory to the include search path. + '-iwithprefixbefore' puts it in the same place '-I' would; + '-iwithprefix' puts it where '-idirafter' would. + +'-isysroot DIR' + This option is like the '--sysroot' option, but applies only to + header files (except for Darwin targets, where it applies to both + header files and libraries). See the '--sysroot' option for more + information. + +'-imultilib DIR' + Use DIR as a subdirectory of the directory containing + target-specific C++ headers. + +'-isystem DIR' + Search DIR for header files, after all directories specified by + '-I' but before the standard system directories. Mark it as a + system directory, so that it gets the same special treatment as is + applied to the standard system directories. If DIR begins with + '=', then the '=' will be replaced by the sysroot prefix; see + '--sysroot' and '-isysroot'. + +'-iquote DIR' + Search DIR only for header files requested with '#include "FILE"'; + they are not searched for '#include <FILE>', before all directories + specified by '-I' and before the standard system directories. If + DIR begins with '=', then the '=' will be replaced by the sysroot + prefix; see '--sysroot' and '-isysroot'. + +'-fdirectives-only' + When preprocessing, handle directives, but do not expand macros. + + The option's behavior depends on the '-E' and '-fpreprocessed' + options. + + With '-E', preprocessing is limited to the handling of directives + such as '#define', '#ifdef', and '#error'. Other preprocessor + operations, such as macro expansion and trigraph conversion are not + performed. In addition, the '-dD' option is implicitly enabled. + + With '-fpreprocessed', predefinition of command line and most + builtin macros is disabled. Macros such as '__LINE__', which are + contextually dependent, are handled normally. This enables + compilation of files previously preprocessed with '-E + -fdirectives-only'. + + With both '-E' and '-fpreprocessed', the rules for '-fpreprocessed' + take precedence. This enables full preprocessing of files + previously preprocessed with '-E -fdirectives-only'. + +'-fdollars-in-identifiers' + Accept '$' in identifiers. + +'-fextended-identifiers' + Accept universal character names in identifiers. This option is + experimental; in a future version of GCC, it will be enabled by + default for C99 and C++. + +'-fno-canonical-system-headers' + When preprocessing, do not shorten system header paths with + canonicalization. + +'-fpreprocessed' + Indicate to the preprocessor that the input file has already been + preprocessed. This suppresses things like macro expansion, + trigraph conversion, escaped newline splicing, and processing of + most directives. The preprocessor still recognizes and removes + comments, so that you can pass a file preprocessed with '-C' to the + compiler without problems. In this mode the integrated + preprocessor is little more than a tokenizer for the front ends. + + '-fpreprocessed' is implicit if the input file has one of the + extensions '.i', '.ii' or '.mi'. These are the extensions that GCC + uses for preprocessed files created by '-save-temps'. + +'-ftabstop=WIDTH' + Set the distance between tab stops. This helps the preprocessor + report correct column numbers in warnings or errors, even if tabs + appear on the line. If the value is less than 1 or greater than + 100, the option is ignored. The default is 8. + +'-fdebug-cpp' + This option is only useful for debugging GCC. When used with '-E', + dumps debugging information about location maps. Every token in + the output is preceded by the dump of the map its location belongs + to. The dump of the map holding the location of a token would be: + {'P':/file/path;'F':/includer/path;'L':LINE_NUM;'C':COL_NUM;'S':SYSTEM_HEADER_P;'M':MAP_ADDRESS;'E':MACRO_EXPANSION_P,'loc':LOCATION} + + When used without '-E', this option has no effect. + +'-ftrack-macro-expansion[=LEVEL]' + Track locations of tokens across macro expansions. This allows the + compiler to emit diagnostic about the current macro expansion stack + when a compilation error occurs in a macro expansion. Using this + option makes the preprocessor and the compiler consume more memory. + The LEVEL parameter can be used to choose the level of precision of + token location tracking thus decreasing the memory consumption if + necessary. Value '0' of LEVEL de-activates this option just as if + no '-ftrack-macro-expansion' was present on the command line. + Value '1' tracks tokens locations in a degraded mode for the sake + of minimal memory overhead. In this mode all tokens resulting from + the expansion of an argument of a function-like macro have the same + location. Value '2' tracks tokens locations completely. This + value is the most memory hungry. When this option is given no + argument, the default parameter value is '2'. + + Note that -ftrack-macro-expansion=2 is activated by default. + +'-fexec-charset=CHARSET' + Set the execution character set, used for string and character + constants. The default is UTF-8. CHARSET can be any encoding + supported by the system's 'iconv' library routine. + +'-fwide-exec-charset=CHARSET' + Set the wide execution character set, used for wide string and + character constants. The default is UTF-32 or UTF-16, whichever + corresponds to the width of 'wchar_t'. As with '-fexec-charset', + CHARSET can be any encoding supported by the system's 'iconv' + library routine; however, you will have problems with encodings + that do not fit exactly in 'wchar_t'. + +'-finput-charset=CHARSET' + Set the input character set, used for translation from the + character set of the input file to the source character set used by + GCC. If the locale does not specify, or GCC cannot get this + information from the locale, the default is UTF-8. This can be + overridden by either the locale or this command line option. + Currently the command line option takes precedence if there's a + conflict. CHARSET can be any encoding supported by the system's + 'iconv' library routine. + +'-fworking-directory' + Enable generation of linemarkers in the preprocessor output that + will let the compiler know the current working directory at the + time of preprocessing. When this option is enabled, the + preprocessor will emit, after the initial linemarker, a second + linemarker with the current working directory followed by two + slashes. GCC will use this directory, when it's present in the + preprocessed input, as the directory emitted as the current working + directory in some debugging information formats. This option is + implicitly enabled if debugging information is enabled, but this + can be inhibited with the negated form '-fno-working-directory'. + If the '-P' flag is present in the command line, this option has no + effect, since no '#line' directives are emitted whatsoever. + +'-fno-show-column' + Do not print column numbers in diagnostics. This may be necessary + if diagnostics are being scanned by a program that does not + understand the column numbers, such as 'dejagnu'. + +'-A PREDICATE=ANSWER' + Make an assertion with the predicate PREDICATE and answer ANSWER. + This form is preferred to the older form '-A PREDICATE(ANSWER)', + which is still supported, because it does not use shell special + characters. + +'-A -PREDICATE=ANSWER' + Cancel an assertion with the predicate PREDICATE and answer ANSWER. + +'-dCHARS' + CHARS is a sequence of one or more of the following characters, and + must not be preceded by a space. Other characters are interpreted + by the compiler proper, or reserved for future versions of GCC, and + so are silently ignored. If you specify characters whose behavior + conflicts, the result is undefined. + + 'M' + Instead of the normal output, generate a list of '#define' + directives for all the macros defined during the execution of + the preprocessor, including predefined macros. This gives you + a way of finding out what is predefined in your version of the + preprocessor. Assuming you have no file 'foo.h', the command + + touch foo.h; cpp -dM foo.h + + will show all the predefined macros. + + If you use '-dM' without the '-E' option, '-dM' is interpreted + as a synonym for '-fdump-rtl-mach'. *Note (gcc)Debugging + Options::. + + 'D' + Like 'M' except in two respects: it does _not_ include the + predefined macros, and it outputs _both_ the '#define' + directives and the result of preprocessing. Both kinds of + output go to the standard output file. + + 'N' + Like 'D', but emit only the macro names, not their expansions. + + 'I' + Output '#include' directives in addition to the result of + preprocessing. + + 'U' + Like 'D' except that only macros that are expanded, or whose + definedness is tested in preprocessor directives, are output; + the output is delayed until the use or test of the macro; and + '#undef' directives are also output for macros tested but + undefined at the time. + +'-P' + Inhibit generation of linemarkers in the output from the + preprocessor. This might be useful when running the preprocessor + on something that is not C code, and will be sent to a program + which might be confused by the linemarkers. + +'-C' + Do not discard comments. All comments are passed through to the + output file, except for comments in processed directives, which are + deleted along with the directive. + + You should be prepared for side effects when using '-C'; it causes + the preprocessor to treat comments as tokens in their own right. + For example, comments appearing at the start of what would be a + directive line have the effect of turning that line into an + ordinary source line, since the first token on the line is no + longer a '#'. + +'-CC' + Do not discard comments, including during macro expansion. This is + like '-C', except that comments contained within macros are also + passed through to the output file where the macro is expanded. + + In addition to the side-effects of the '-C' option, the '-CC' + option causes all C++-style comments inside a macro to be converted + to C-style comments. This is to prevent later use of that macro + from inadvertently commenting out the remainder of the source line. + + The '-CC' option is generally used to support lint comments. + +'-traditional-cpp' + Try to imitate the behavior of old-fashioned C preprocessors, as + opposed to ISO C preprocessors. + +'-trigraphs' + Process trigraph sequences. These are three-character sequences, + all starting with '??', that are defined by ISO C to stand for + single characters. For example, '??/' stands for '\', so ''??/n'' + is a character constant for a newline. By default, GCC ignores + trigraphs, but in standard-conforming modes it converts them. See + the '-std' and '-ansi' options. + + The nine trigraphs and their replacements are + + Trigraph: ??( ??) ??< ??> ??= ??/ ??' ??! ??- + Replacement: [ ] { } # \ ^ | ~ + +'-remap' + Enable special code to work around file systems which only permit + very short file names, such as MS-DOS. + +'--help' +'--target-help' + Print text describing all the command line options instead of + preprocessing anything. + +'-v' + Verbose mode. Print out GNU CPP's version number at the beginning + of execution, and report the final form of the include path. + +'-H' + Print the name of each header file used, in addition to other + normal activities. Each name is indented to show how deep in the + '#include' stack it is. Precompiled header files are also printed, + even if they are found to be invalid; an invalid precompiled header + file is printed with '...x' and a valid one with '...!' . + +'-version' +'--version' + Print out GNU CPP's version number. With one dash, proceed to + preprocess as normal. With two dashes, exit immediately. + + +File: gcc.info, Node: Assembler Options, Next: Link Options, Prev: Preprocessor Options, Up: Invoking GCC + +3.12 Passing Options to the Assembler +===================================== + +You can pass options to the assembler. + +'-Wa,OPTION' + Pass OPTION as an option to the assembler. If OPTION contains + commas, it is split into multiple options at the commas. + +'-Xassembler OPTION' + Pass OPTION as an option to the assembler. You can use this to + supply system-specific assembler options that GCC does not + recognize. + + If you want to pass an option that takes an argument, you must use + '-Xassembler' twice, once for the option and once for the argument. + + +File: gcc.info, Node: Link Options, Next: Directory Options, Prev: Assembler Options, Up: Invoking GCC + +3.13 Options for Linking +======================== + +These options come into play when the compiler links object files into +an executable output file. They are meaningless if the compiler is not +doing a link step. + +'OBJECT-FILE-NAME' + A file name that does not end in a special recognized suffix is + considered to name an object file or library. (Object files are + distinguished from libraries by the linker according to the file + contents.) If linking is done, these object files are used as + input to the linker. + +'-c' +'-S' +'-E' + If any of these options is used, then the linker is not run, and + object file names should not be used as arguments. *Note Overall + Options::. + +'-lLIBRARY' +'-l LIBRARY' + Search the library named LIBRARY when linking. (The second + alternative with the library as a separate argument is only for + POSIX compliance and is not recommended.) + + It makes a difference where in the command you write this option; + the linker searches and processes libraries and object files in the + order they are specified. Thus, 'foo.o -lz bar.o' searches library + 'z' after file 'foo.o' but before 'bar.o'. If 'bar.o' refers to + functions in 'z', those functions may not be loaded. + + The linker searches a standard list of directories for the library, + which is actually a file named 'libLIBRARY.a'. The linker then + uses this file as if it had been specified precisely by name. + + The directories searched include several standard system + directories plus any that you specify with '-L'. + + Normally the files found this way are library files--archive files + whose members are object files. The linker handles an archive file + by scanning through it for members which define symbols that have + so far been referenced but not defined. But if the file that is + found is an ordinary object file, it is linked in the usual + fashion. The only difference between using an '-l' option and + specifying a file name is that '-l' surrounds LIBRARY with 'lib' + and '.a' and searches several directories. + +'-lobjc' + You need this special case of the '-l' option in order to link an + Objective-C or Objective-C++ program. + +'-nostartfiles' + Do not use the standard system startup files when linking. The + standard system libraries are used normally, unless '-nostdlib' or + '-nodefaultlibs' is used. + +'-nodefaultlibs' + Do not use the standard system libraries when linking. Only the + libraries you specify are passed to the linker, and options + specifying linkage of the system libraries, such as + '-static-libgcc' or '-shared-libgcc', are ignored. The standard + startup files are used normally, unless '-nostartfiles' is used. + + The compiler may generate calls to 'memcmp', 'memset', 'memcpy' and + 'memmove'. These entries are usually resolved by entries in libc. + These entry points should be supplied through some other mechanism + when this option is specified. + +'-nostdlib' + Do not use the standard system startup files or libraries when + linking. No startup files and only the libraries you specify are + passed to the linker, and options specifying linkage of the system + libraries, such as '-static-libgcc' or '-shared-libgcc', are + ignored. + + The compiler may generate calls to 'memcmp', 'memset', 'memcpy' and + 'memmove'. These entries are usually resolved by entries in libc. + These entry points should be supplied through some other mechanism + when this option is specified. + + One of the standard libraries bypassed by '-nostdlib' and + '-nodefaultlibs' is 'libgcc.a', a library of internal subroutines + which GCC uses to overcome shortcomings of particular machines, or + special needs for some languages. (*Note Interfacing to GCC + Output: (gccint)Interface, for more discussion of 'libgcc.a'.) In + most cases, you need 'libgcc.a' even when you want to avoid other + standard libraries. In other words, when you specify '-nostdlib' + or '-nodefaultlibs' you should usually specify '-lgcc' as well. + This ensures that you have no unresolved references to internal GCC + library subroutines. (An example of such an internal subroutine is + '__main', used to ensure C++ constructors are called; *note + 'collect2': (gccint)Collect2.) + +'-pie' + Produce a position independent executable on targets that support + it. For predictable results, you must also specify the same set of + options used for compilation ('-fpie', '-fPIE', or model + suboptions) when you specify this linker option. + +'-rdynamic' + Pass the flag '-export-dynamic' to the ELF linker, on targets that + support it. This instructs the linker to add all symbols, not only + used ones, to the dynamic symbol table. This option is needed for + some uses of 'dlopen' or to allow obtaining backtraces from within + a program. + +'-s' + Remove all symbol table and relocation information from the + executable. + +'-static' + On systems that support dynamic linking, this prevents linking with + the shared libraries. On other systems, this option has no effect. + +'-shared' + Produce a shared object which can then be linked with other objects + to form an executable. Not all systems support this option. For + predictable results, you must also specify the same set of options + used for compilation ('-fpic', '-fPIC', or model suboptions) when + you specify this linker option.(1) + +'-shared-libgcc' +'-static-libgcc' + On systems that provide 'libgcc' as a shared library, these options + force the use of either the shared or static version, respectively. + If no shared version of 'libgcc' was built when the compiler was + configured, these options have no effect. + + There are several situations in which an application should use the + shared 'libgcc' instead of the static version. The most common of + these is when the application wishes to throw and catch exceptions + across different shared libraries. In that case, each of the + libraries as well as the application itself should use the shared + 'libgcc'. + + Therefore, the G++ and GCJ drivers automatically add + '-shared-libgcc' whenever you build a shared library or a main + executable, because C++ and Java programs typically use exceptions, + so this is the right thing to do. + + If, instead, you use the GCC driver to create shared libraries, you + may find that they are not always linked with the shared 'libgcc'. + If GCC finds, at its configuration time, that you have a non-GNU + linker or a GNU linker that does not support option + '--eh-frame-hdr', it links the shared version of 'libgcc' into + shared libraries by default. Otherwise, it takes advantage of the + linker and optimizes away the linking with the shared version of + 'libgcc', linking with the static version of libgcc by default. + This allows exceptions to propagate through such shared libraries, + without incurring relocation costs at library load time. + + However, if a library or main executable is supposed to throw or + catch exceptions, you must link it using the G++ or GCJ driver, as + appropriate for the languages used in the program, or using the + option '-shared-libgcc', such that it is linked with the shared + 'libgcc'. + +'-static-libasan' + When the '-fsanitize=address' option is used to link a program, the + GCC driver automatically links against 'libasan'. If 'libasan' is + available as a shared library, and the '-static' option is not + used, then this links against the shared version of 'libasan'. The + '-static-libasan' option directs the GCC driver to link 'libasan' + statically, without necessarily linking other libraries statically. + +'-static-libtsan' + When the '-fsanitize=thread' option is used to link a program, the + GCC driver automatically links against 'libtsan'. If 'libtsan' is + available as a shared library, and the '-static' option is not + used, then this links against the shared version of 'libtsan'. The + '-static-libtsan' option directs the GCC driver to link 'libtsan' + statically, without necessarily linking other libraries statically. + +'-static-liblsan' + When the '-fsanitize=leak' option is used to link a program, the + GCC driver automatically links against 'liblsan'. If 'liblsan' is + available as a shared library, and the '-static' option is not + used, then this links against the shared version of 'liblsan'. The + '-static-liblsan' option directs the GCC driver to link 'liblsan' + statically, without necessarily linking other libraries statically. + +'-static-libubsan' + When the '-fsanitize=undefined' option is used to link a program, + the GCC driver automatically links against 'libubsan'. If + 'libubsan' is available as a shared library, and the '-static' + option is not used, then this links against the shared version of + 'libubsan'. The '-static-libubsan' option directs the GCC driver + to link 'libubsan' statically, without necessarily linking other + libraries statically. + +'-static-libstdc++' + When the 'g++' program is used to link a C++ program, it normally + automatically links against 'libstdc++'. If 'libstdc++' is + available as a shared library, and the '-static' option is not + used, then this links against the shared version of 'libstdc++'. + That is normally fine. However, it is sometimes useful to freeze + the version of 'libstdc++' used by the program without going all + the way to a fully static link. The '-static-libstdc++' option + directs the 'g++' driver to link 'libstdc++' statically, without + necessarily linking other libraries statically. + +'-symbolic' + Bind references to global symbols when building a shared object. + Warn about any unresolved references (unless overridden by the link + editor option '-Xlinker -z -Xlinker defs'). Only a few systems + support this option. + +'-T SCRIPT' + Use SCRIPT as the linker script. This option is supported by most + systems using the GNU linker. On some targets, such as bare-board + targets without an operating system, the '-T' option may be + required when linking to avoid references to undefined symbols. + +'-Xlinker OPTION' + Pass OPTION as an option to the linker. You can use this to supply + system-specific linker options that GCC does not recognize. + + If you want to pass an option that takes a separate argument, you + must use '-Xlinker' twice, once for the option and once for the + argument. For example, to pass '-assert definitions', you must + write '-Xlinker -assert -Xlinker definitions'. It does not work to + write '-Xlinker "-assert definitions"', because this passes the + entire string as a single argument, which is not what the linker + expects. + + When using the GNU linker, it is usually more convenient to pass + arguments to linker options using the 'OPTION=VALUE' syntax than as + separate arguments. For example, you can specify '-Xlinker + -Map=output.map' rather than '-Xlinker -Map -Xlinker output.map'. + Other linkers may not support this syntax for command-line options. + +'-Wl,OPTION' + Pass OPTION as an option to the linker. If OPTION contains commas, + it is split into multiple options at the commas. You can use this + syntax to pass an argument to the option. For example, + '-Wl,-Map,output.map' passes '-Map output.map' to the linker. When + using the GNU linker, you can also get the same effect with + '-Wl,-Map=output.map'. + +'-u SYMBOL' + Pretend the symbol SYMBOL is undefined, to force linking of library + modules to define it. You can use '-u' multiple times with + different symbols to force loading of additional library modules. + + ---------- Footnotes ---------- + + (1) On some systems, 'gcc -shared' needs to build supplementary stub +code for constructors to work. On multi-libbed systems, 'gcc -shared' +must select the correct support libraries to link against. Failing to +supply the correct flags may lead to subtle defects. Supplying them in +cases where they are not necessary is innocuous. + + +File: gcc.info, Node: Directory Options, Next: Spec Files, Prev: Link Options, Up: Invoking GCC + +3.14 Options for Directory Search +================================= + +These options specify directories to search for header files, for +libraries and for parts of the compiler: + +'-IDIR' + Add the directory DIR to the head of the list of directories to be + searched for header files. This can be used to override a system + header file, substituting your own version, since these directories + are searched before the system header file directories. However, + you should not use this option to add directories that contain + vendor-supplied system header files (use '-isystem' for that). If + you use more than one '-I' option, the directories are scanned in + left-to-right order; the standard system directories come after. + + If a standard system include directory, or a directory specified + with '-isystem', is also specified with '-I', the '-I' option is + ignored. The directory is still searched but as a system directory + at its normal position in the system include chain. This is to + ensure that GCC's procedure to fix buggy system headers and the + ordering for the 'include_next' directive are not inadvertently + changed. If you really need to change the search order for system + directories, use the '-nostdinc' and/or '-isystem' options. + +'-iplugindir=DIR' + Set the directory to search for plugins that are passed by + '-fplugin=NAME' instead of '-fplugin=PATH/NAME.so'. This option is + not meant to be used by the user, but only passed by the driver. + +'-iquoteDIR' + Add the directory DIR to the head of the list of directories to be + searched for header files only for the case of '#include "FILE"'; + they are not searched for '#include <FILE>', otherwise just like + '-I'. + +'-LDIR' + Add directory DIR to the list of directories to be searched for + '-l'. + +'-BPREFIX' + This option specifies where to find the executables, libraries, + include files, and data files of the compiler itself. + + The compiler driver program runs one or more of the subprograms + 'cpp', 'cc1', 'as' and 'ld'. It tries PREFIX as a prefix for each + program it tries to run, both with and without 'MACHINE/VERSION/' + (*note Target Options::). + + For each subprogram to be run, the compiler driver first tries the + '-B' prefix, if any. If that name is not found, or if '-B' is not + specified, the driver tries two standard prefixes, '/usr/lib/gcc/' + and '/usr/local/lib/gcc/'. If neither of those results in a file + name that is found, the unmodified program name is searched for + using the directories specified in your 'PATH' environment + variable. + + The compiler checks to see if the path provided by the '-B' refers + to a directory, and if necessary it adds a directory separator + character at the end of the path. + + '-B' prefixes that effectively specify directory names also apply + to libraries in the linker, because the compiler translates these + options into '-L' options for the linker. They also apply to + include files in the preprocessor, because the compiler translates + these options into '-isystem' options for the preprocessor. In + this case, the compiler appends 'include' to the prefix. + + The runtime support file 'libgcc.a' can also be searched for using + the '-B' prefix, if needed. If it is not found there, the two + standard prefixes above are tried, and that is all. The file is + left out of the link if it is not found by those means. + + Another way to specify a prefix much like the '-B' prefix is to use + the environment variable 'GCC_EXEC_PREFIX'. *Note Environment + Variables::. + + As a special kludge, if the path provided by '-B' is + '[dir/]stageN/', where N is a number in the range 0 to 9, then it + is replaced by '[dir/]include'. This is to help with + boot-strapping the compiler. + +'-specs=FILE' + Process FILE after the compiler reads in the standard 'specs' file, + in order to override the defaults which the 'gcc' driver program + uses when determining what switches to pass to 'cc1', 'cc1plus', + 'as', 'ld', etc. More than one '-specs=FILE' can be specified on + the command line, and they are processed in order, from left to + right. + +'--sysroot=DIR' + Use DIR as the logical root directory for headers and libraries. + For example, if the compiler normally searches for headers in + '/usr/include' and libraries in '/usr/lib', it instead searches + 'DIR/usr/include' and 'DIR/usr/lib'. + + If you use both this option and the '-isysroot' option, then the + '--sysroot' option applies to libraries, but the '-isysroot' option + applies to header files. + + The GNU linker (beginning with version 2.16) has the necessary + support for this option. If your linker does not support this + option, the header file aspect of '--sysroot' still works, but the + library aspect does not. + +'--no-sysroot-suffix' + For some targets, a suffix is added to the root directory specified + with '--sysroot', depending on the other options used, so that + headers may for example be found in 'DIR/SUFFIX/usr/include' + instead of 'DIR/usr/include'. This option disables the addition of + such a suffix. + +'-I-' + This option has been deprecated. Please use '-iquote' instead for + '-I' directories before the '-I-' and remove the '-I-'. Any + directories you specify with '-I' options before the '-I-' option + are searched only for the case of '#include "FILE"'; they are not + searched for '#include <FILE>'. + + If additional directories are specified with '-I' options after the + '-I-', these directories are searched for all '#include' + directives. (Ordinarily _all_ '-I' directories are used this way.) + + In addition, the '-I-' option inhibits the use of the current + directory (where the current input file came from) as the first + search directory for '#include "FILE"'. There is no way to + override this effect of '-I-'. With '-I.' you can specify + searching the directory that is current when the compiler is + invoked. That is not exactly the same as what the preprocessor + does by default, but it is often satisfactory. + + '-I-' does not inhibit the use of the standard system directories + for header files. Thus, '-I-' and '-nostdinc' are independent. + + +File: gcc.info, Node: Spec Files, Next: Target Options, Prev: Directory Options, Up: Invoking GCC + +3.15 Specifying subprocesses and the switches to pass to them +============================================================= + +'gcc' is a driver program. It performs its job by invoking a sequence +of other programs to do the work of compiling, assembling and linking. +GCC interprets its command-line parameters and uses these to deduce +which programs it should invoke, and which command-line options it ought +to place on their command lines. This behavior is controlled by "spec +strings". In most cases there is one spec string for each program that +GCC can invoke, but a few programs have multiple spec strings to control +their behavior. The spec strings built into GCC can be overridden by +using the '-specs=' command-line switch to specify a spec file. + + "Spec files" are plaintext files that are used to construct spec +strings. They consist of a sequence of directives separated by blank +lines. The type of directive is determined by the first non-whitespace +character on the line, which can be one of the following: + +'%COMMAND' + Issues a COMMAND to the spec file processor. The commands that can + appear here are: + + '%include <FILE>' + Search for FILE and insert its text at the current point in + the specs file. + + '%include_noerr <FILE>' + Just like '%include', but do not generate an error message if + the include file cannot be found. + + '%rename OLD_NAME NEW_NAME' + Rename the spec string OLD_NAME to NEW_NAME. + +'*[SPEC_NAME]:' + This tells the compiler to create, override or delete the named + spec string. All lines after this directive up to the next + directive or blank line are considered to be the text for the spec + string. If this results in an empty string then the spec is + deleted. (Or, if the spec did not exist, then nothing happens.) + Otherwise, if the spec does not currently exist a new spec is + created. If the spec does exist then its contents are overridden + by the text of this directive, unless the first character of that + text is the '+' character, in which case the text is appended to + the spec. + +'[SUFFIX]:' + Creates a new '[SUFFIX] spec' pair. All lines after this directive + and up to the next directive or blank line are considered to make + up the spec string for the indicated suffix. When the compiler + encounters an input file with the named suffix, it processes the + spec string in order to work out how to compile that file. For + example: + + .ZZ: + z-compile -input %i + + This says that any input file whose name ends in '.ZZ' should be + passed to the program 'z-compile', which should be invoked with the + command-line switch '-input' and with the result of performing the + '%i' substitution. (See below.) + + As an alternative to providing a spec string, the text following a + suffix directive can be one of the following: + + '@LANGUAGE' + This says that the suffix is an alias for a known LANGUAGE. + This is similar to using the '-x' command-line switch to GCC + to specify a language explicitly. For example: + + .ZZ: + @c++ + + Says that .ZZ files are, in fact, C++ source files. + + '#NAME' + This causes an error messages saying: + + NAME compiler not installed on this system. + + GCC already has an extensive list of suffixes built into it. This + directive adds an entry to the end of the list of suffixes, but + since the list is searched from the end backwards, it is + effectively possible to override earlier entries using this + technique. + + GCC has the following spec strings built into it. Spec files can +override these strings or create their own. Note that individual +targets can also add their own spec strings to this list. + + asm Options to pass to the assembler + asm_final Options to pass to the assembler post-processor + cpp Options to pass to the C preprocessor + cc1 Options to pass to the C compiler + cc1plus Options to pass to the C++ compiler + endfile Object files to include at the end of the link + link Options to pass to the linker + lib Libraries to include on the command line to the linker + libgcc Decides which GCC support library to pass to the linker + linker Sets the name of the linker + predefines Defines to be passed to the C preprocessor + signed_char Defines to pass to CPP to say whether char is signed + by default + startfile Object files to include at the start of the link + + Here is a small example of a spec file: + + %rename lib old_lib + + *lib: + --start-group -lgcc -lc -leval1 --end-group %(old_lib) + + This example renames the spec called 'lib' to 'old_lib' and then +overrides the previous definition of 'lib' with a new one. The new +definition adds in some extra command-line options before including the +text of the old definition. + + "Spec strings" are a list of command-line options to be passed to their +corresponding program. In addition, the spec strings can contain +'%'-prefixed sequences to substitute variable text or to conditionally +insert text into the command line. Using these constructs it is +possible to generate quite complex command lines. + + Here is a table of all defined '%'-sequences for spec strings. Note +that spaces are not generated automatically around the results of +expanding these sequences. Therefore you can concatenate them together +or combine them with constant text in a single argument. + +'%%' + Substitute one '%' into the program name or argument. + +'%i' + Substitute the name of the input file being processed. + +'%b' + Substitute the basename of the input file being processed. This is + the substring up to (and not including) the last period and not + including the directory. + +'%B' + This is the same as '%b', but include the file suffix (text after + the last period). + +'%d' + Marks the argument containing or following the '%d' as a temporary + file name, so that that file is deleted if GCC exits successfully. + Unlike '%g', this contributes no text to the argument. + +'%gSUFFIX' + Substitute a file name that has suffix SUFFIX and is chosen once + per compilation, and mark the argument in the same way as '%d'. To + reduce exposure to denial-of-service attacks, the file name is now + chosen in a way that is hard to predict even when previously chosen + file names are known. For example, '%g.s ... %g.o ... %g.s' might + turn into 'ccUVUUAU.s ccXYAXZ12.o ccUVUUAU.s'. SUFFIX matches the + regexp '[.A-Za-z]*' or the special string '%O', which is treated + exactly as if '%O' had been preprocessed. Previously, '%g' was + simply substituted with a file name chosen once per compilation, + without regard to any appended suffix (which was therefore treated + just like ordinary text), making such attacks more likely to + succeed. + +'%uSUFFIX' + Like '%g', but generates a new temporary file name each time it + appears instead of once per compilation. + +'%USUFFIX' + Substitutes the last file name generated with '%uSUFFIX', + generating a new one if there is no such last file name. In the + absence of any '%uSUFFIX', this is just like '%gSUFFIX', except + they don't share the same suffix _space_, so '%g.s ... %U.s ... + %g.s ... %U.s' involves the generation of two distinct file names, + one for each '%g.s' and another for each '%U.s'. Previously, '%U' + was simply substituted with a file name chosen for the previous + '%u', without regard to any appended suffix. + +'%jSUFFIX' + Substitutes the name of the 'HOST_BIT_BUCKET', if any, and if it is + writable, and if '-save-temps' is not used; otherwise, substitute + the name of a temporary file, just like '%u'. This temporary file + is not meant for communication between processes, but rather as a + junk disposal mechanism. + +'%|SUFFIX' +'%mSUFFIX' + Like '%g', except if '-pipe' is in effect. In that case '%|' + substitutes a single dash and '%m' substitutes nothing at all. + These are the two most common ways to instruct a program that it + should read from standard input or write to standard output. If + you need something more elaborate you can use an '%{pipe:'X'}' + construct: see for example 'f/lang-specs.h'. + +'%.SUFFIX' + Substitutes .SUFFIX for the suffixes of a matched switch's args + when it is subsequently output with '%*'. SUFFIX is terminated by + the next space or %. + +'%w' + Marks the argument containing or following the '%w' as the + designated output file of this compilation. This puts the argument + into the sequence of arguments that '%o' substitutes. + +'%o' + Substitutes the names of all the output files, with spaces + automatically placed around them. You should write spaces around + the '%o' as well or the results are undefined. '%o' is for use in + the specs for running the linker. Input files whose names have no + recognized suffix are not compiled at all, but they are included + among the output files, so they are linked. + +'%O' + Substitutes the suffix for object files. Note that this is handled + specially when it immediately follows '%g, %u, or %U', because of + the need for those to form complete file names. The handling is + such that '%O' is treated exactly as if it had already been + substituted, except that '%g, %u, and %U' do not currently support + additional SUFFIX characters following '%O' as they do following, + for example, '.o'. + +'%p' + Substitutes the standard macro predefinitions for the current + target machine. Use this when running 'cpp'. + +'%P' + Like '%p', but puts '__' before and after the name of each + predefined macro, except for macros that start with '__' or with + '_L', where L is an uppercase letter. This is for ISO C. + +'%I' + Substitute any of '-iprefix' (made from 'GCC_EXEC_PREFIX'), + '-isysroot' (made from 'TARGET_SYSTEM_ROOT'), '-isystem' (made from + 'COMPILER_PATH' and '-B' options) and '-imultilib' as necessary. + +'%s' + Current argument is the name of a library or startup file of some + sort. Search for that file in a standard list of directories and + substitute the full name found. The current working directory is + included in the list of directories scanned. + +'%T' + Current argument is the name of a linker script. Search for that + file in the current list of directories to scan for libraries. If + the file is located insert a '--script' option into the command + line followed by the full path name found. If the file is not + found then generate an error message. Note: the current working + directory is not searched. + +'%eSTR' + Print STR as an error message. STR is terminated by a newline. + Use this when inconsistent options are detected. + +'%(NAME)' + Substitute the contents of spec string NAME at this point. + +'%x{OPTION}' + Accumulate an option for '%X'. + +'%X' + Output the accumulated linker options specified by '-Wl' or a '%x' + spec string. + +'%Y' + Output the accumulated assembler options specified by '-Wa'. + +'%Z' + Output the accumulated preprocessor options specified by '-Wp'. + +'%a' + Process the 'asm' spec. This is used to compute the switches to be + passed to the assembler. + +'%A' + Process the 'asm_final' spec. This is a spec string for passing + switches to an assembler post-processor, if such a program is + needed. + +'%l' + Process the 'link' spec. This is the spec for computing the + command line passed to the linker. Typically it makes use of the + '%L %G %S %D and %E' sequences. + +'%D' + Dump out a '-L' option for each directory that GCC believes might + contain startup files. If the target supports multilibs then the + current multilib directory is prepended to each of these paths. + +'%L' + Process the 'lib' spec. This is a spec string for deciding which + libraries are included on the command line to the linker. + +'%G' + Process the 'libgcc' spec. This is a spec string for deciding + which GCC support library is included on the command line to the + linker. + +'%S' + Process the 'startfile' spec. This is a spec for deciding which + object files are the first ones passed to the linker. Typically + this might be a file named 'crt0.o'. + +'%E' + Process the 'endfile' spec. This is a spec string that specifies + the last object files that are passed to the linker. + +'%C' + Process the 'cpp' spec. This is used to construct the arguments to + be passed to the C preprocessor. + +'%1' + Process the 'cc1' spec. This is used to construct the options to + be passed to the actual C compiler ('cc1'). + +'%2' + Process the 'cc1plus' spec. This is used to construct the options + to be passed to the actual C++ compiler ('cc1plus'). + +'%*' + Substitute the variable part of a matched option. See below. Note + that each comma in the substituted string is replaced by a single + space. + +'%<S' + Remove all occurrences of '-S' from the command line. Note--this + command is position dependent. '%' commands in the spec string + before this one see '-S', '%' commands in the spec string after + this one do not. + +'%:FUNCTION(ARGS)' + Call the named function FUNCTION, passing it ARGS. ARGS is first + processed as a nested spec string, then split into an argument + vector in the usual fashion. The function returns a string which + is processed as if it had appeared literally as part of the current + spec. + + The following built-in spec functions are provided: + + 'getenv' + The 'getenv' spec function takes two arguments: an environment + variable name and a string. If the environment variable is + not defined, a fatal error is issued. Otherwise, the return + value is the value of the environment variable concatenated + with the string. For example, if 'TOPDIR' is defined as + '/path/to/top', then: + + %:getenv(TOPDIR /include) + + expands to '/path/to/top/include'. + + 'if-exists' + The 'if-exists' spec function takes one argument, an absolute + pathname to a file. If the file exists, 'if-exists' returns + the pathname. Here is a small example of its usage: + + *startfile: + crt0%O%s %:if-exists(crti%O%s) crtbegin%O%s + + 'if-exists-else' + The 'if-exists-else' spec function is similar to the + 'if-exists' spec function, except that it takes two arguments. + The first argument is an absolute pathname to a file. If the + file exists, 'if-exists-else' returns the pathname. If it + does not exist, it returns the second argument. This way, + 'if-exists-else' can be used to select one file or another, + based on the existence of the first. Here is a small example + of its usage: + + *startfile: + crt0%O%s %:if-exists(crti%O%s) \ + %:if-exists-else(crtbeginT%O%s crtbegin%O%s) + + 'replace-outfile' + The 'replace-outfile' spec function takes two arguments. It + looks for the first argument in the outfiles array and + replaces it with the second argument. Here is a small example + of its usage: + + %{fgnu-runtime:%:replace-outfile(-lobjc -lobjc-gnu)} + + 'remove-outfile' + The 'remove-outfile' spec function takes one argument. It + looks for the first argument in the outfiles array and removes + it. Here is a small example its usage: + + %:remove-outfile(-lm) + + 'pass-through-libs' + The 'pass-through-libs' spec function takes any number of + arguments. It finds any '-l' options and any non-options + ending in '.a' (which it assumes are the names of linker input + library archive files) and returns a result containing all the + found arguments each prepended by '-plugin-opt=-pass-through=' + and joined by spaces. This list is intended to be passed to + the LTO linker plugin. + + %:pass-through-libs(%G %L %G) + + 'print-asm-header' + The 'print-asm-header' function takes no arguments and simply + prints a banner like: + + Assembler options + ================= + + Use "-Wa,OPTION" to pass "OPTION" to the assembler. + + It is used to separate compiler options from assembler options + in the '--target-help' output. + +'%{S}' + Substitutes the '-S' switch, if that switch is given to GCC. If + that switch is not specified, this substitutes nothing. Note that + the leading dash is omitted when specifying this option, and it is + automatically inserted if the substitution is performed. Thus the + spec string '%{foo}' matches the command-line option '-foo' and + outputs the command-line option '-foo'. + +'%W{S}' + Like %{'S'} but mark last argument supplied within as a file to be + deleted on failure. + +'%{S*}' + Substitutes all the switches specified to GCC whose names start + with '-S', but which also take an argument. This is used for + switches like '-o', '-D', '-I', etc. GCC considers '-o foo' as + being one switch whose name starts with 'o'. %{o*} substitutes + this text, including the space. Thus two arguments are generated. + +'%{S*&T*}' + Like %{'S'*}, but preserve order of 'S' and 'T' options (the order + of 'S' and 'T' in the spec is not significant). There can be any + number of ampersand-separated variables; for each the wild card is + optional. Useful for CPP as '%{D*&U*&A*}'. + +'%{S:X}' + Substitutes 'X', if the '-S' switch is given to GCC. + +'%{!S:X}' + Substitutes 'X', if the '-S' switch is _not_ given to GCC. + +'%{S*:X}' + Substitutes 'X' if one or more switches whose names start with '-S' + are specified to GCC. Normally 'X' is substituted only once, no + matter how many such switches appeared. However, if '%*' appears + somewhere in 'X', then 'X' is substituted once for each matching + switch, with the '%*' replaced by the part of that switch matching + the '*'. + + If '%*' appears as the last part of a spec sequence then a space + will be added after the end of the last substitution. If there is + more text in the sequence however then a space will not be + generated. This allows the '%*' substitution to be used as part of + a larger string. For example, a spec string like this: + + %{mcu=*:--script=%*/memory.ld} + + when matching an option like '-mcu=newchip' will produce: + + --script=newchip/memory.ld + +'%{.S:X}' + Substitutes 'X', if processing a file with suffix 'S'. + +'%{!.S:X}' + Substitutes 'X', if _not_ processing a file with suffix 'S'. + +'%{,S:X}' + Substitutes 'X', if processing a file for language 'S'. + +'%{!,S:X}' + Substitutes 'X', if not processing a file for language 'S'. + +'%{S|P:X}' + Substitutes 'X' if either '-S' or '-P' is given to GCC. This may + be combined with '!', '.', ',', and '*' sequences as well, although + they have a stronger binding than the '|'. If '%*' appears in 'X', + all of the alternatives must be starred, and only the first + matching alternative is substituted. + + For example, a spec string like this: + + %{.c:-foo} %{!.c:-bar} %{.c|d:-baz} %{!.c|d:-boggle} + + outputs the following command-line options from the following input + command-line options: + + fred.c -foo -baz + jim.d -bar -boggle + -d fred.c -foo -baz -boggle + -d jim.d -bar -baz -boggle + +'%{S:X; T:Y; :D}' + + If 'S' is given to GCC, substitutes 'X'; else if 'T' is given to + GCC, substitutes 'Y'; else substitutes 'D'. There can be as many + clauses as you need. This may be combined with '.', ',', '!', '|', + and '*' as needed. + + The conditional text 'X' in a %{'S':'X'} or similar construct may +contain other nested '%' constructs or spaces, or even newlines. They +are processed as usual, as described above. Trailing white space in 'X' +is ignored. White space may also appear anywhere on the left side of +the colon in these constructs, except between '.' or '*' and the +corresponding word. + + The '-O', '-f', '-m', and '-W' switches are handled specifically in +these constructs. If another value of '-O' or the negated form of a +'-f', '-m', or '-W' switch is found later in the command line, the +earlier switch value is ignored, except with {'S'*} where 'S' is just +one letter, which passes all matching options. + + The character '|' at the beginning of the predicate text is used to +indicate that a command should be piped to the following command, but +only if '-pipe' is specified. + + It is built into GCC which switches take arguments and which do not. +(You might think it would be useful to generalize this to allow each +compiler's spec to say which switches take arguments. But this cannot +be done in a consistent fashion. GCC cannot even decide which input +files have been specified without knowing which switches take arguments, +and it must know which input files to compile in order to tell which +compilers to run). + + GCC also knows implicitly that arguments starting in '-l' are to be +treated as compiler output files, and passed to the linker in their +proper position among the other output files. + + +File: gcc.info, Node: Target Options, Next: Submodel Options, Prev: Spec Files, Up: Invoking GCC + +3.16 Specifying Target Machine and Compiler Version +=================================================== + +The usual way to run GCC is to run the executable called 'gcc', or +'MACHINE-gcc' when cross-compiling, or 'MACHINE-gcc-VERSION' to run a +version other than the one that was installed last. + + +File: gcc.info, Node: Submodel Options, Next: Code Gen Options, Prev: Target Options, Up: Invoking GCC + +3.17 Hardware Models and Configurations +======================================= + +Each target machine types can have its own special options, starting +with '-m', to choose among various hardware models or +configurations--for example, 68010 vs 68020, floating coprocessor or +none. A single installed version of the compiler can compile for any +model or configuration, according to the options specified. + + Some configurations of the compiler also support additional special +options, usually for compatibility with other compilers on the same +platform. + +* Menu: + +* AArch64 Options:: +* Adapteva Epiphany Options:: +* ARC Options:: +* ARM Options:: +* AVR Options:: +* Blackfin Options:: +* C6X Options:: +* CRIS Options:: +* CR16 Options:: +* Darwin Options:: +* DEC Alpha Options:: +* FR30 Options:: +* FRV Options:: +* GNU/Linux Options:: +* H8/300 Options:: +* HPPA Options:: +* i386 and x86-64 Options:: +* i386 and x86-64 Windows Options:: +* IA-64 Options:: +* LM32 Options:: +* M32C Options:: +* M32R/D Options:: +* M680x0 Options:: +* MCore Options:: +* MeP Options:: +* MicroBlaze Options:: +* MIPS Options:: +* MMIX Options:: +* MN10300 Options:: +* Moxie Options:: +* MSP430 Options:: +* NDS32 Options:: +* Nios II Options:: +* PDP-11 Options:: +* picoChip Options:: +* PowerPC Options:: +* RL78 Options:: +* RS/6000 and PowerPC Options:: +* RX Options:: +* S/390 and zSeries Options:: +* Score Options:: +* SH Options:: +* Solaris 2 Options:: +* SPARC Options:: +* SPU Options:: +* System V Options:: +* TILE-Gx Options:: +* TILEPro Options:: +* V850 Options:: +* VAX Options:: +* VMS Options:: +* VxWorks Options:: +* x86-64 Options:: +* Xstormy16 Options:: +* Xtensa Options:: +* zSeries Options:: + + +File: gcc.info, Node: AArch64 Options, Next: Adapteva Epiphany Options, Up: Submodel Options + +3.17.1 AArch64 Options +---------------------- + +These options are defined for AArch64 implementations: + +'-mabi=NAME' + Generate code for the specified data model. Permissible values are + 'ilp32' for SysV-like data model where int, long int and pointer + are 32-bit, and 'lp64' for SysV-like data model where int is + 32-bit, but long int and pointer are 64-bit. + + The default depends on the specific target configuration. Note + that the LP64 and ILP32 ABIs are not link-compatible; you must + compile your entire program with the same ABI, and link with a + compatible set of libraries. + +'-mbig-endian' + Generate big-endian code. This is the default when GCC is + configured for an 'aarch64_be-*-*' target. + +'-mgeneral-regs-only' + Generate code which uses only the general registers. + +'-mlittle-endian' + Generate little-endian code. This is the default when GCC is + configured for an 'aarch64-*-*' but not an 'aarch64_be-*-*' target. + +'-mcmodel=tiny' + Generate code for the tiny code model. The program and its + statically defined symbols must be within 1GB of each other. + Pointers are 64 bits. Programs can be statically or dynamically + linked. This model is not fully implemented and mostly treated as + 'small'. + +'-mcmodel=small' + Generate code for the small code model. The program and its + statically defined symbols must be within 4GB of each other. + Pointers are 64 bits. Programs can be statically or dynamically + linked. This is the default code model. + +'-mcmodel=large' + Generate code for the large code model. This makes no assumptions + about addresses and sizes of sections. Pointers are 64 bits. + Programs can be statically linked only. + +'-mstrict-align' + Do not assume that unaligned memory references will be handled by + the system. + +'-momit-leaf-frame-pointer' +'-mno-omit-leaf-frame-pointer' + Omit or keep the frame pointer in leaf functions. The former + behaviour is the default. + +'-mtls-dialect=desc' + Use TLS descriptors as the thread-local storage mechanism for + dynamic accesses of TLS variables. This is the default. + +'-mtls-dialect=traditional' + Use traditional TLS as the thread-local storage mechanism for + dynamic accesses of TLS variables. + +'-march=NAME' + Specify the name of the target architecture, optionally suffixed by + one or more feature modifiers. This option has the form + '-march=ARCH{+[no]FEATURE}*', where the only permissible value for + ARCH is 'armv8-a'. The permissible values for FEATURE are + documented in the sub-section below. + + Where conflicting feature modifiers are specified, the right-most + feature is used. + + GCC uses this name to determine what kind of instructions it can + emit when generating assembly code. + + Where '-march' is specified without either of '-mtune' or '-mcpu' + also being specified, the code will be tuned to perform well across + a range of target processors implementing the target architecture. + +'-mtune=NAME' + Specify the name of the target processor for which GCC should tune + the performance of the code. Permissible values for this option + are: 'generic', 'cortex-a53', 'cortex-a57'. + + Additionally, this option can specify that GCC should tune the + performance of the code for a big.LITTLE system. The only + permissible value is 'cortex-a57.cortex-a53'. + + Where none of '-mtune=', '-mcpu=' or '-march=' are specified, the + code will be tuned to perform well across a range of target + processors. + + This option cannot be suffixed by feature modifiers. + +'-mcpu=NAME' + Specify the name of the target processor, optionally suffixed by + one or more feature modifiers. This option has the form + '-mcpu=CPU{+[no]FEATURE}*', where the permissible values for CPU + are the same as those available for '-mtune'. + + The permissible values for FEATURE are documented in the + sub-section below. + + Where conflicting feature modifiers are specified, the right-most + feature is used. + + GCC uses this name to determine what kind of instructions it can + emit when generating assembly code (as if by '-march') and to + determine the target processor for which to tune for performance + (as if by '-mtune'). Where this option is used in conjunction with + '-march' or '-mtune', those options take precedence over the + appropriate part of this option. + +3.17.1.1 '-march' and '-mcpu' feature modifiers +............................................... + +Feature modifiers used with '-march' and '-mcpu' can be one the +following: + +'crc' + Enable CRC extension. +'crypto' + Enable Crypto extension. This implies Advanced SIMD is enabled. +'fp' + Enable floating-point instructions. +'simd' + Enable Advanced SIMD instructions. This implies floating-point + instructions are enabled. This is the default for all current + possible values for options '-march' and '-mcpu='. + + +File: gcc.info, Node: Adapteva Epiphany Options, Next: ARC Options, Prev: AArch64 Options, Up: Submodel Options + +3.17.2 Adapteva Epiphany Options +-------------------------------- + +These '-m' options are defined for Adapteva Epiphany: + +'-mhalf-reg-file' + Don't allocate any register in the range 'r32'...'r63'. That + allows code to run on hardware variants that lack these registers. + +'-mprefer-short-insn-regs' + Preferrentially allocate registers that allow short instruction + generation. This can result in increased instruction count, so + this may either reduce or increase overall code size. + +'-mbranch-cost=NUM' + Set the cost of branches to roughly NUM "simple" instructions. + This cost is only a heuristic and is not guaranteed to produce + consistent results across releases. + +'-mcmove' + Enable the generation of conditional moves. + +'-mnops=NUM' + Emit NUM NOPs before every other generated instruction. + +'-mno-soft-cmpsf' + For single-precision floating-point comparisons, emit an 'fsub' + instruction and test the flags. This is faster than a software + comparison, but can get incorrect results in the presence of NaNs, + or when two different small numbers are compared such that their + difference is calculated as zero. The default is '-msoft-cmpsf', + which uses slower, but IEEE-compliant, software comparisons. + +'-mstack-offset=NUM' + Set the offset between the top of the stack and the stack pointer. + E.g., a value of 8 means that the eight bytes in the range + 'sp+0...sp+7' can be used by leaf functions without stack + allocation. Values other than '8' or '16' are untested and + unlikely to work. Note also that this option changes the ABI; + compiling a program with a different stack offset than the + libraries have been compiled with generally does not work. This + option can be useful if you want to evaluate if a different stack + offset would give you better code, but to actually use a different + stack offset to build working programs, it is recommended to + configure the toolchain with the appropriate + '--with-stack-offset=NUM' option. + +'-mno-round-nearest' + Make the scheduler assume that the rounding mode has been set to + truncating. The default is '-mround-nearest'. + +'-mlong-calls' + If not otherwise specified by an attribute, assume all calls might + be beyond the offset range of the 'b' / 'bl' instructions, and + therefore load the function address into a register before + performing a (otherwise direct) call. This is the default. + +'-mshort-calls' + If not otherwise specified by an attribute, assume all direct calls + are in the range of the 'b' / 'bl' instructions, so use these + instructions for direct calls. The default is '-mlong-calls'. + +'-msmall16' + Assume addresses can be loaded as 16-bit unsigned values. This + does not apply to function addresses for which '-mlong-calls' + semantics are in effect. + +'-mfp-mode=MODE' + Set the prevailing mode of the floating-point unit. This + determines the floating-point mode that is provided and expected at + function call and return time. Making this mode match the mode you + predominantly need at function start can make your programs smaller + and faster by avoiding unnecessary mode switches. + + MODE can be set to one the following values: + + 'caller' + Any mode at function entry is valid, and retained or restored + when the function returns, and when it calls other functions. + This mode is useful for compiling libraries or other + compilation units you might want to incorporate into different + programs with different prevailing FPU modes, and the + convenience of being able to use a single object file + outweighs the size and speed overhead for any extra mode + switching that might be needed, compared with what would be + needed with a more specific choice of prevailing FPU mode. + + 'truncate' + This is the mode used for floating-point calculations with + truncating (i.e. round towards zero) rounding mode. That + includes conversion from floating point to integer. + + 'round-nearest' + This is the mode used for floating-point calculations with + round-to-nearest-or-even rounding mode. + + 'int' + This is the mode used to perform integer calculations in the + FPU, e.g. integer multiply, or integer + multiply-and-accumulate. + + The default is '-mfp-mode=caller' + +'-mnosplit-lohi' +'-mno-postinc' +'-mno-postmodify' + Code generation tweaks that disable, respectively, splitting of + 32-bit loads, generation of post-increment addresses, and + generation of post-modify addresses. The defaults are + 'msplit-lohi', '-mpost-inc', and '-mpost-modify'. + +'-mnovect-double' + Change the preferred SIMD mode to SImode. The default is + '-mvect-double', which uses DImode as preferred SIMD mode. + +'-max-vect-align=NUM' + The maximum alignment for SIMD vector mode types. NUM may be 4 or + 8. The default is 8. Note that this is an ABI change, even though + many library function interfaces are unaffected if they don't use + SIMD vector modes in places that affect size and/or alignment of + relevant types. + +'-msplit-vecmove-early' + Split vector moves into single word moves before reload. In theory + this can give better register allocation, but so far the reverse + seems to be generally the case. + +'-m1reg-REG' + Specify a register to hold the constant -1, which makes loading + small negative constants and certain bitmasks faster. Allowable + values for REG are 'r43' and 'r63', which specify use of that + register as a fixed register, and 'none', which means that no + register is used for this purpose. The default is '-m1reg-none'. + + +File: gcc.info, Node: ARC Options, Next: ARM Options, Prev: Adapteva Epiphany Options, Up: Submodel Options + +3.17.3 ARC Options +------------------ + +The following options control the architecture variant for which code is +being compiled: + +'-mbarrel-shifter' + Generate instructions supported by barrel shifter. This is the + default unless '-mcpu=ARC601' is in effect. + +'-mcpu=CPU' + Set architecture type, register usage, and instruction scheduling + parameters for CPU. There are also shortcut alias options + available for backward compatibility and convenience. Supported + values for CPU are + + 'ARC600' + Compile for ARC600. Aliases: '-mA6', '-mARC600'. + + 'ARC601' + Compile for ARC601. Alias: '-mARC601'. + + 'ARC700' + Compile for ARC700. Aliases: '-mA7', '-mARC700'. This is the + default when configured with '--with-cpu=arc700'. + +'-mdpfp' +'-mdpfp-compact' + FPX: Generate Double Precision FPX instructions, tuned for the + compact implementation. + +'-mdpfp-fast' + FPX: Generate Double Precision FPX instructions, tuned for the fast + implementation. + +'-mno-dpfp-lrsr' + Disable LR and SR instructions from using FPX extension aux + registers. + +'-mea' + Generate Extended arithmetic instructions. Currently only 'divaw', + 'adds', 'subs', and 'sat16' are supported. This is always enabled + for '-mcpu=ARC700'. + +'-mno-mpy' + Do not generate mpy instructions for ARC700. + +'-mmul32x16' + Generate 32x16 bit multiply and mac instructions. + +'-mmul64' + Generate mul64 and mulu64 instructions. Only valid for + '-mcpu=ARC600'. + +'-mnorm' + Generate norm instruction. This is the default if '-mcpu=ARC700' + is in effect. + +'-mspfp' +'-mspfp-compact' + FPX: Generate Single Precision FPX instructions, tuned for the + compact implementation. + +'-mspfp-fast' + FPX: Generate Single Precision FPX instructions, tuned for the fast + implementation. + +'-msimd' + Enable generation of ARC SIMD instructions via target-specific + builtins. Only valid for '-mcpu=ARC700'. + +'-msoft-float' + This option ignored; it is provided for compatibility purposes + only. Software floating point code is emitted by default, and this + default can overridden by FPX options; 'mspfp', 'mspfp-compact', or + 'mspfp-fast' for single precision, and 'mdpfp', 'mdpfp-compact', or + 'mdpfp-fast' for double precision. + +'-mswap' + Generate swap instructions. + + The following options are passed through to the assembler, and also +define preprocessor macro symbols. + +'-mdsp-packa' + Passed down to the assembler to enable the DSP Pack A extensions. + Also sets the preprocessor symbol '__Xdsp_packa'. + +'-mdvbf' + Passed down to the assembler to enable the dual viterbi butterfly + extension. Also sets the preprocessor symbol '__Xdvbf'. + +'-mlock' + Passed down to the assembler to enable the Locked Load/Store + Conditional extension. Also sets the preprocessor symbol + '__Xlock'. + +'-mmac-d16' + Passed down to the assembler. Also sets the preprocessor symbol + '__Xxmac_d16'. + +'-mmac-24' + Passed down to the assembler. Also sets the preprocessor symbol + '__Xxmac_24'. + +'-mrtsc' + Passed down to the assembler to enable the 64-bit Time-Stamp + Counter extension instruction. Also sets the preprocessor symbol + '__Xrtsc'. + +'-mswape' + Passed down to the assembler to enable the swap byte ordering + extension instruction. Also sets the preprocessor symbol + '__Xswape'. + +'-mtelephony' + Passed down to the assembler to enable dual and single operand + instructions for telephony. Also sets the preprocessor symbol + '__Xtelephony'. + +'-mxy' + Passed down to the assembler to enable the XY Memory extension. + Also sets the preprocessor symbol '__Xxy'. + + The following options control how the assembly code is annotated: + +'-misize' + Annotate assembler instructions with estimated addresses. + +'-mannotate-align' + Explain what alignment considerations lead to the decision to make + an instruction short or long. + + The following options are passed through to the linker: + +'-marclinux' + Passed through to the linker, to specify use of the 'arclinux' + emulation. This option is enabled by default in tool chains built + for 'arc-linux-uclibc' and 'arceb-linux-uclibc' targets when + profiling is not requested. + +'-marclinux_prof' + Passed through to the linker, to specify use of the 'arclinux_prof' + emulation. This option is enabled by default in tool chains built + for 'arc-linux-uclibc' and 'arceb-linux-uclibc' targets when + profiling is requested. + + The following options control the semantics of generated code: + +'-mepilogue-cfi' + Enable generation of call frame information for epilogues. + +'-mno-epilogue-cfi' + Disable generation of call frame information for epilogues. + +'-mlong-calls' + Generate call insns as register indirect calls, thus providing + access to the full 32-bit address range. + +'-mmedium-calls' + Don't use less than 25 bit addressing range for calls, which is the + offset available for an unconditional branch-and-link instruction. + Conditional execution of function calls is suppressed, to allow use + of the 25-bit range, rather than the 21-bit range with conditional + branch-and-link. This is the default for tool chains built for 'arc-linux-uclibc' + and 'arceb-linux-uclibc' targets. + +'-mno-sdata' + Do not generate sdata references. This is the default for tool + chains built for 'arc-linux-uclibc' and 'arceb-linux-uclibc' + targets. + +'-mucb-mcount' + Instrument with mcount calls as used in UCB code. I.e. do the + counting in the callee, not the caller. By default ARC + instrumentation counts in the caller. + +'-mvolatile-cache' + Use ordinarily cached memory accesses for volatile references. + This is the default. + +'-mno-volatile-cache' + Enable cache bypass for volatile references. + + The following options fine tune code generation: +'-malign-call' + Do alignment optimizations for call instructions. + +'-mauto-modify-reg' + Enable the use of pre/post modify with register displacement. + +'-mbbit-peephole' + Enable bbit peephole2. + +'-mno-brcc' + This option disables a target-specific pass in 'arc_reorg' to + generate 'BRcc' instructions. It has no effect on 'BRcc' + generation driven by the combiner pass. + +'-mcase-vector-pcrel' + Use pc-relative switch case tables - this enables case table + shortening. This is the default for '-Os'. + +'-mcompact-casesi' + Enable compact casesi pattern. This is the default for '-Os'. + +'-mno-cond-exec' + Disable ARCompact specific pass to generate conditional execution + instructions. Due to delay slot scheduling and interactions + between operand numbers, literal sizes, instruction lengths, and + the support for conditional execution, the target-independent pass + to generate conditional execution is often lacking, so the ARC port + has kept a special pass around that tries to find more conditional + execution generating opportunities after register allocation, + branch shortening, and delay slot scheduling have been done. This + pass generally, but not always, improves performance and code size, + at the cost of extra compilation time, which is why there is an + option to switch it off. If you have a problem with call + instructions exceeding their allowable offset range because they + are conditionalized, you should consider using '-mmedium-calls' + instead. + +'-mearly-cbranchsi' + Enable pre-reload use of the cbranchsi pattern. + +'-mexpand-adddi' + Expand 'adddi3' and 'subdi3' at rtl generation time into 'add.f', + 'adc' etc. + +'-mindexed-loads' + Enable the use of indexed loads. This can be problematic because + some optimizers will then assume the that indexed stores exist, + which is not the case. + +'-mlra' + Enable Local Register Allocation. This is still experimental for + ARC, so by default the compiler uses standard reload (i.e. + '-mno-lra'). + +'-mlra-priority-none' + Don't indicate any priority for target registers. + +'-mlra-priority-compact' + Indicate target register priority for r0..r3 / r12..r15. + +'-mlra-priority-noncompact' + Reduce target regsiter priority for r0..r3 / r12..r15. + +'-mno-millicode' + When optimizing for size (using '-Os'), prologues and epilogues + that have to save or restore a large number of registers are often + shortened by using call to a special function in libgcc; this is + referred to as a _millicode_ call. As these calls can pose + performance issues, and/or cause linking issues when linking in a + nonstandard way, this option is provided to turn off millicode call + generation. + +'-mmixed-code' + Tweak register allocation to help 16-bit instruction generation. + This generally has the effect of decreasing the average instruction + size while increasing the instruction count. + +'-mq-class' + Enable 'q' instruction alternatives. This is the default for + '-Os'. + +'-mRcq' + Enable Rcq constraint handling - most short code generation depends + on this. This is the default. + +'-mRcw' + Enable Rcw constraint handling - ccfsm condexec mostly depends on + this. This is the default. + +'-msize-level=LEVEL' + Fine-tune size optimization with regards to instruction lengths and + alignment. The recognized values for LEVEL are: + '0' + No size optimization. This level is deprecated and treated + like '1'. + + '1' + Short instructions are used opportunistically. + + '2' + In addition, alignment of loops and of code after barriers are + dropped. + + '3' + In addition, optional data alignment is dropped, and the + option 'Os' is enabled. + + This defaults to '3' when '-Os' is in effect. Otherwise, the + behavior when this is not set is equivalent to level '1'. + +'-mtune=CPU' + Set instruction scheduling parameters for CPU, overriding any + implied by '-mcpu='. + + Supported values for CPU are + + 'ARC600' + Tune for ARC600 cpu. + + 'ARC601' + Tune for ARC601 cpu. + + 'ARC700' + Tune for ARC700 cpu with standard multiplier block. + + 'ARC700-xmac' + Tune for ARC700 cpu with XMAC block. + + 'ARC725D' + Tune for ARC725D cpu. + + 'ARC750D' + Tune for ARC750D cpu. + +'-mmultcost=NUM' + Cost to assume for a multiply instruction, with '4' being equal to + a normal instruction. + +'-munalign-prob-threshold=PROBABILITY' + Set probability threshold for unaligning branches. When tuning for + 'ARC700' and optimizing for speed, branches without filled delay + slot are preferably emitted unaligned and long, unless profiling + indicates that the probability for the branch to be taken is below + PROBABILITY. *Note Cross-profiling::. The default is + (REG_BR_PROB_BASE/2), i.e. 5000. + + The following options are maintained for backward compatibility, but +are now deprecated and will be removed in a future release: + +'-margonaut' + Obsolete FPX. + +'-mbig-endian' +'-EB' + Compile code for big endian targets. Use of these options is now + deprecated. Users wanting big-endian code, should use the 'arceb-elf32' + and 'arceb-linux-uclibc' targets when building the tool chain, for + which big-endian is the default. + +'-mlittle-endian' +'-EL' + Compile code for little endian targets. Use of these options is + now deprecated. Users wanting little-endian code should use the 'arc-elf32' + and 'arc-linux-uclibc' targets when building the tool chain, for + which little-endian is the default. + +'-mbarrel_shifter' + Replaced by '-mbarrel-shifter' + +'-mdpfp_compact' + Replaced by '-mdpfp-compact' + +'-mdpfp_fast' + Replaced by '-mdpfp-fast' + +'-mdsp_packa' + Replaced by '-mdsp-packa' + +'-mEA' + Replaced by '-mea' + +'-mmac_24' + Replaced by '-mmac-24' + +'-mmac_d16' + Replaced by '-mmac-d16' + +'-mspfp_compact' + Replaced by '-mspfp-compact' + +'-mspfp_fast' + Replaced by '-mspfp-fast' + +'-mtune=CPU' + Values 'arc600', 'arc601', 'arc700' and 'arc700-xmac' for CPU are + replaced by 'ARC600', 'ARC601', 'ARC700' and 'ARC700-xmac' + respectively + +'-multcost=NUM' + Replaced by '-mmultcost'. + + +File: gcc.info, Node: ARM Options, Next: AVR Options, Prev: ARC Options, Up: Submodel Options + +3.17.4 ARM Options +------------------ + +These '-m' options are defined for Advanced RISC Machines (ARM) +architectures: + +'-mabi=NAME' + Generate code for the specified ABI. Permissible values are: + 'apcs-gnu', 'atpcs', 'aapcs', 'aapcs-linux' and 'iwmmxt'. + +'-mapcs-frame' + Generate a stack frame that is compliant with the ARM Procedure + Call Standard for all functions, even if this is not strictly + necessary for correct execution of the code. Specifying + '-fomit-frame-pointer' with this option causes the stack frames not + to be generated for leaf functions. The default is + '-mno-apcs-frame'. + +'-mapcs' + This is a synonym for '-mapcs-frame'. + +'-mthumb-interwork' + Generate code that supports calling between the ARM and Thumb + instruction sets. Without this option, on pre-v5 architectures, + the two instruction sets cannot be reliably used inside one + program. The default is '-mno-thumb-interwork', since slightly + larger code is generated when '-mthumb-interwork' is specified. In + AAPCS configurations this option is meaningless. + +'-mno-sched-prolog' + Prevent the reordering of instructions in the function prologue, or + the merging of those instruction with the instructions in the + function's body. This means that all functions start with a + recognizable set of instructions (or in fact one of a choice from a + small set of different function prologues), and this information + can be used to locate the start of functions inside an executable + piece of code. The default is '-msched-prolog'. + +'-mfloat-abi=NAME' + Specifies which floating-point ABI to use. Permissible values are: + 'soft', 'softfp' and 'hard'. + + Specifying 'soft' causes GCC to generate output containing library + calls for floating-point operations. 'softfp' allows the + generation of code using hardware floating-point instructions, but + still uses the soft-float calling conventions. 'hard' allows + generation of floating-point instructions and uses FPU-specific + calling conventions. + + The default depends on the specific target configuration. Note + that the hard-float and soft-float ABIs are not link-compatible; + you must compile your entire program with the same ABI, and link + with a compatible set of libraries. + +'-mlittle-endian' + Generate code for a processor running in little-endian mode. This + is the default for all standard configurations. + +'-mbig-endian' + Generate code for a processor running in big-endian mode; the + default is to compile code for a little-endian processor. + +'-mwords-little-endian' + This option only applies when generating code for big-endian + processors. Generate code for a little-endian word order but a + big-endian byte order. That is, a byte order of the form + '32107654'. Note: this option should only be used if you require + compatibility with code for big-endian ARM processors generated by + versions of the compiler prior to 2.8. This option is now + deprecated. + +'-march=NAME' + This specifies the name of the target ARM architecture. GCC uses + this name to determine what kind of instructions it can emit when + generating assembly code. This option can be used in conjunction + with or instead of the '-mcpu=' option. Permissible names are: + 'armv2', 'armv2a', 'armv3', 'armv3m', 'armv4', 'armv4t', 'armv5', + 'armv5t', 'armv5e', 'armv5te', 'armv6', 'armv6j', 'armv6t2', + 'armv6z', 'armv6zk', 'armv6-m', 'armv7', 'armv7-a', 'armv7-r', + 'armv7-m', 'armv7e-m', 'armv7ve', 'armv8-a', 'armv8-a+crc', + 'iwmmxt', 'iwmmxt2', 'ep9312'. + + '-march=armv7ve' is the armv7-a architecture with virtualization + extensions. + + '-march=armv8-a+crc' enables code generation for the ARMv8-A + architecture together with the optional CRC32 extensions. + + '-march=native' causes the compiler to auto-detect the architecture + of the build computer. At present, this feature is only supported + on Linux, and not all architectures are recognized. If the + auto-detect is unsuccessful the option has no effect. + +'-mtune=NAME' + This option specifies the name of the target ARM processor for + which GCC should tune the performance of the code. For some ARM + implementations better performance can be obtained by using this + option. Permissible names are: 'arm2', 'arm250', 'arm3', 'arm6', + 'arm60', 'arm600', 'arm610', 'arm620', 'arm7', 'arm7m', 'arm7d', + 'arm7dm', 'arm7di', 'arm7dmi', 'arm70', 'arm700', 'arm700i', + 'arm710', 'arm710c', 'arm7100', 'arm720', 'arm7500', 'arm7500fe', + 'arm7tdmi', 'arm7tdmi-s', 'arm710t', 'arm720t', 'arm740t', + 'strongarm', 'strongarm110', 'strongarm1100', 'strongarm1110', + 'arm8', 'arm810', 'arm9', 'arm9e', 'arm920', 'arm920t', 'arm922t', + 'arm946e-s', 'arm966e-s', 'arm968e-s', 'arm926ej-s', 'arm940t', + 'arm9tdmi', 'arm10tdmi', 'arm1020t', 'arm1026ej-s', 'arm10e', + 'arm1020e', 'arm1022e', 'arm1136j-s', 'arm1136jf-s', 'mpcore', + 'mpcorenovfp', 'arm1156t2-s', 'arm1156t2f-s', 'arm1176jz-s', + 'arm1176jzf-s', 'cortex-a5', 'cortex-a7', 'cortex-a8', 'cortex-a9', + 'cortex-a12', 'cortex-a15', 'cortex-a53', 'cortex-a57', + 'cortex-r4', 'cortex-r4f', 'cortex-r5', 'cortex-r7', 'cortex-m4', + 'cortex-m3', 'cortex-m1', 'cortex-m0', 'cortex-m0plus', + 'marvell-pj4', 'xscale', 'iwmmxt', 'iwmmxt2', 'ep9312', 'fa526', + 'fa626', 'fa606te', 'fa626te', 'fmp626', 'fa726te'. + + Additionally, this option can specify that GCC should tune the + performance of the code for a big.LITTLE system. Permissible names + are: 'cortex-a15.cortex-a7', 'cortex-a57.cortex-a53'. + + '-mtune=generic-ARCH' specifies that GCC should tune the + performance for a blend of processors within architecture ARCH. + The aim is to generate code that run well on the current most + popular processors, balancing between optimizations that benefit + some CPUs in the range, and avoiding performance pitfalls of other + CPUs. The effects of this option may change in future GCC versions + as CPU models come and go. + + '-mtune=native' causes the compiler to auto-detect the CPU of the + build computer. At present, this feature is only supported on + Linux, and not all architectures are recognized. If the + auto-detect is unsuccessful the option has no effect. + +'-mcpu=NAME' + This specifies the name of the target ARM processor. GCC uses this + name to derive the name of the target ARM architecture (as if + specified by '-march') and the ARM processor type for which to tune + for performance (as if specified by '-mtune'). Where this option + is used in conjunction with '-march' or '-mtune', those options + take precedence over the appropriate part of this option. + + Permissible names for this option are the same as those for + '-mtune'. + + '-mcpu=generic-ARCH' is also permissible, and is equivalent to + '-march=ARCH -mtune=generic-ARCH'. See '-mtune' for more + information. + + '-mcpu=native' causes the compiler to auto-detect the CPU of the + build computer. At present, this feature is only supported on + Linux, and not all architectures are recognized. If the + auto-detect is unsuccessful the option has no effect. + +'-mfpu=NAME' + This specifies what floating-point hardware (or hardware emulation) + is available on the target. Permissible names are: 'vfp', 'vfpv3', + 'vfpv3-fp16', 'vfpv3-d16', 'vfpv3-d16-fp16', 'vfpv3xd', + 'vfpv3xd-fp16', 'neon', 'neon-fp16', 'vfpv4', 'vfpv4-d16', + 'fpv4-sp-d16', 'neon-vfpv4', 'fp-armv8', 'neon-fp-armv8', and + 'crypto-neon-fp-armv8'. + + If '-msoft-float' is specified this specifies the format of + floating-point values. + + If the selected floating-point hardware includes the NEON extension + (e.g. '-mfpu'='neon'), note that floating-point operations are not + generated by GCC's auto-vectorization pass unless + '-funsafe-math-optimizations' is also specified. This is because + NEON hardware does not fully implement the IEEE 754 standard for + floating-point arithmetic (in particular denormal values are + treated as zero), so the use of NEON instructions may lead to a + loss of precision. + +'-mfp16-format=NAME' + Specify the format of the '__fp16' half-precision floating-point + type. Permissible names are 'none', 'ieee', and 'alternative'; the + default is 'none', in which case the '__fp16' type is not defined. + *Note Half-Precision::, for more information. + +'-mstructure-size-boundary=N' + The sizes of all structures and unions are rounded up to a multiple + of the number of bits set by this option. Permissible values are + 8, 32 and 64. The default value varies for different toolchains. + For the COFF targeted toolchain the default value is 8. A value of + 64 is only allowed if the underlying ABI supports it. + + Specifying a larger number can produce faster, more efficient code, + but can also increase the size of the program. Different values + are potentially incompatible. Code compiled with one value cannot + necessarily expect to work with code or libraries compiled with + another value, if they exchange information using structures or + unions. + +'-mabort-on-noreturn' + Generate a call to the function 'abort' at the end of a 'noreturn' + function. It is executed if the function tries to return. + +'-mlong-calls' +'-mno-long-calls' + Tells the compiler to perform function calls by first loading the + address of the function into a register and then performing a + subroutine call on this register. This switch is needed if the + target function lies outside of the 64-megabyte addressing range of + the offset-based version of subroutine call instruction. + + Even if this switch is enabled, not all function calls are turned + into long calls. The heuristic is that static functions, functions + that have the 'short-call' attribute, functions that are inside the + scope of a '#pragma no_long_calls' directive, and functions whose + definitions have already been compiled within the current + compilation unit are not turned into long calls. The exceptions to + this rule are that weak function definitions, functions with the + 'long-call' attribute or the 'section' attribute, and functions + that are within the scope of a '#pragma long_calls' directive are + always turned into long calls. + + This feature is not enabled by default. Specifying + '-mno-long-calls' restores the default behavior, as does placing + the function calls within the scope of a '#pragma long_calls_off' + directive. Note these switches have no effect on how the compiler + generates code to handle function calls via function pointers. + +'-msingle-pic-base' + Treat the register used for PIC addressing as read-only, rather + than loading it in the prologue for each function. The runtime + system is responsible for initializing this register with an + appropriate value before execution begins. + +'-mpic-register=REG' + Specify the register to be used for PIC addressing. For standard + PIC base case, the default will be any suitable register determined + by compiler. For single PIC base case, the default is 'R9' if + target is EABI based or stack-checking is enabled, otherwise the + default is 'R10'. + +'-mpic-data-is-text-relative' + Assume that each data segments are relative to text segment at load + time. Therefore, it permits addressing data using PC-relative + operations. This option is on by default for targets other than + VxWorks RTP. + +'-mpoke-function-name' + Write the name of each function into the text section, directly + preceding the function prologue. The generated code is similar to + this: + + t0 + .ascii "arm_poke_function_name", 0 + .align + t1 + .word 0xff000000 + (t1 - t0) + arm_poke_function_name + mov ip, sp + stmfd sp!, {fp, ip, lr, pc} + sub fp, ip, #4 + + When performing a stack backtrace, code can inspect the value of + 'pc' stored at 'fp + 0'. If the trace function then looks at + location 'pc - 12' and the top 8 bits are set, then we know that + there is a function name embedded immediately preceding this + location and has length '((pc[-3]) & 0xff000000)'. + +'-mthumb' +'-marm' + + Select between generating code that executes in ARM and Thumb + states. The default for most configurations is to generate code + that executes in ARM state, but the default can be changed by + configuring GCC with the '--with-mode='STATE configure option. + +'-mtpcs-frame' + Generate a stack frame that is compliant with the Thumb Procedure + Call Standard for all non-leaf functions. (A leaf function is one + that does not call any other functions.) The default is + '-mno-tpcs-frame'. + +'-mtpcs-leaf-frame' + Generate a stack frame that is compliant with the Thumb Procedure + Call Standard for all leaf functions. (A leaf function is one that + does not call any other functions.) The default is + '-mno-apcs-leaf-frame'. + +'-mcallee-super-interworking' + Gives all externally visible functions in the file being compiled + an ARM instruction set header which switches to Thumb mode before + executing the rest of the function. This allows these functions to + be called from non-interworking code. This option is not valid in + AAPCS configurations because interworking is enabled by default. + +'-mcaller-super-interworking' + Allows calls via function pointers (including virtual functions) to + execute correctly regardless of whether the target code has been + compiled for interworking or not. There is a small overhead in the + cost of executing a function pointer if this option is enabled. + This option is not valid in AAPCS configurations because + interworking is enabled by default. + +'-mtp=NAME' + Specify the access model for the thread local storage pointer. The + valid models are 'soft', which generates calls to + '__aeabi_read_tp', 'cp15', which fetches the thread pointer from + 'cp15' directly (supported in the arm6k architecture), and 'auto', + which uses the best available method for the selected processor. + The default setting is 'auto'. + +'-mtls-dialect=DIALECT' + Specify the dialect to use for accessing thread local storage. Two + DIALECTs are supported--'gnu' and 'gnu2'. The 'gnu' dialect + selects the original GNU scheme for supporting local and global + dynamic TLS models. The 'gnu2' dialect selects the GNU descriptor + scheme, which provides better performance for shared libraries. + The GNU descriptor scheme is compatible with the original scheme, + but does require new assembler, linker and library support. + Initial and local exec TLS models are unaffected by this option and + always use the original scheme. + +'-mword-relocations' + Only generate absolute relocations on word-sized values (i.e. + R_ARM_ABS32). This is enabled by default on targets (uClinux, + SymbianOS) where the runtime loader imposes this restriction, and + when '-fpic' or '-fPIC' is specified. + +'-mfix-cortex-m3-ldrd' + Some Cortex-M3 cores can cause data corruption when 'ldrd' + instructions with overlapping destination and base registers are + used. This option avoids generating these instructions. This + option is enabled by default when '-mcpu=cortex-m3' is specified. + +'-munaligned-access' +'-mno-unaligned-access' + Enables (or disables) reading and writing of 16- and 32- bit values + from addresses that are not 16- or 32- bit aligned. By default + unaligned access is disabled for all pre-ARMv6 and all ARMv6-M + architectures, and enabled for all other architectures. If + unaligned access is not enabled then words in packed data + structures will be accessed a byte at a time. + + The ARM attribute 'Tag_CPU_unaligned_access' will be set in the + generated object file to either true or false, depending upon the + setting of this option. If unaligned access is enabled then the + preprocessor symbol '__ARM_FEATURE_UNALIGNED' will also be defined. + +'-mneon-for-64bits' + Enables using Neon to handle scalar 64-bits operations. This is + disabled by default since the cost of moving data from core + registers to Neon is high. + +'-mslow-flash-data' + Assume loading data from flash is slower than fetching instruction. + Therefore literal load is minimized for better performance. This + option is only supported when compiling for ARMv7 M-profile and off + by default. + +'-mrestrict-it' + Restricts generation of IT blocks to conform to the rules of ARMv8. + IT blocks can only contain a single 16-bit instruction from a + select set of instructions. This option is on by default for ARMv8 + Thumb mode. + + +File: gcc.info, Node: AVR Options, Next: Blackfin Options, Prev: ARM Options, Up: Submodel Options + +3.17.5 AVR Options +------------------ + +These options are defined for AVR implementations: + +'-mmcu=MCU' + Specify Atmel AVR instruction set architectures (ISA) or MCU type. + + The default for this option is 'avr2'. + + GCC supports the following AVR devices and ISAs: + + 'avr2' + "Classic" devices with up to 8 KiB of program memory. + MCU = 'attiny22', 'attiny26', 'at90c8534', 'at90s2313', + 'at90s2323', 'at90s2333', 'at90s2343', 'at90s4414', + 'at90s4433', 'at90s4434', 'at90s8515', 'at90s8535'. + + 'avr25' + "Classic" devices with up to 8 KiB of program memory and with + the 'MOVW' instruction. + MCU = 'ata5272', 'ata6289', 'attiny13', 'attiny13a', + 'attiny2313', 'attiny2313a', 'attiny24', 'attiny24a', + 'attiny25', 'attiny261', 'attiny261a', 'attiny43u', + 'attiny4313', 'attiny44', 'attiny44a', 'attiny45', + 'attiny461', 'attiny461a', 'attiny48', 'attiny84', + 'attiny84a', 'attiny85', 'attiny861', 'attiny861a', + 'attiny87', 'attiny88', 'at86rf401'. + + 'avr3' + "Classic" devices with 16 KiB up to 64 KiB of program memory. + MCU = 'at43usb355', 'at76c711'. + + 'avr31' + "Classic" devices with 128 KiB of program memory. + MCU = 'atmega103', 'at43usb320'. + + 'avr35' + "Classic" devices with 16 KiB up to 64 KiB of program memory + and with the 'MOVW' instruction. + MCU = 'ata5505', 'atmega16u2', 'atmega32u2', 'atmega8u2', + 'attiny1634', 'attiny167', 'at90usb162', 'at90usb82'. + + 'avr4' + "Enhanced" devices with up to 8 KiB of program memory. + MCU = 'ata6285', 'ata6286', 'atmega48', 'atmega48a', + 'atmega48p', 'atmega48pa', 'atmega8', 'atmega8a', + 'atmega8hva', 'atmega8515', 'atmega8535', 'atmega88', + 'atmega88a', 'atmega88p', 'atmega88pa', 'at90pwm1', + 'at90pwm2', 'at90pwm2b', 'at90pwm3', 'at90pwm3b', 'at90pwm81'. + + 'avr5' + "Enhanced" devices with 16 KiB up to 64 KiB of program memory. + + MCU = 'ata5790', 'ata5790n', 'ata5795', 'atmega16', + 'atmega16a', 'atmega16hva', 'atmega16hva2', 'atmega16hvb', + 'atmega16hvbrevb', 'atmega16m1', 'atmega16u4', 'atmega161', + 'atmega162', 'atmega163', 'atmega164a', 'atmega164p', + 'atmega164pa', 'atmega165', 'atmega165a', 'atmega165p', + 'atmega165pa', 'atmega168', 'atmega168a', 'atmega168p', + 'atmega168pa', 'atmega169', 'atmega169a', 'atmega169p', + 'atmega169pa', 'atmega26hvg', 'atmega32', 'atmega32a', + 'atmega32c1', 'atmega32hvb', 'atmega32hvbrevb', 'atmega32m1', + 'atmega32u4', 'atmega32u6', 'atmega323', 'atmega324a', + 'atmega324p', 'atmega324pa', 'atmega325', 'atmega325a', + 'atmega325p', 'atmega3250', 'atmega3250a', 'atmega3250p', + 'atmega3250pa', 'atmega328', 'atmega328p', 'atmega329', + 'atmega329a', 'atmega329p', 'atmega329pa', 'atmega3290', + 'atmega3290a', 'atmega3290p', 'atmega3290pa', 'atmega406', + 'atmega48hvf', 'atmega64', 'atmega64a', 'atmega64c1', + 'atmega64hve', 'atmega64m1', 'atmega64rfa2', 'atmega64rfr2', + 'atmega640', 'atmega644', 'atmega644a', 'atmega644p', + 'atmega644pa', 'atmega645', 'atmega645a', 'atmega645p', + 'atmega6450', 'atmega6450a', 'atmega6450p', 'atmega649', + 'atmega649a', 'atmega649p', 'atmega6490', 'atmega6490a', + 'atmega6490p', 'at90can32', 'at90can64', 'at90pwm161', + 'at90pwm216', 'at90pwm316', 'at90scr100', 'at90usb646', + 'at90usb647', 'at94k', 'm3000'. + + 'avr51' + "Enhanced" devices with 128 KiB of program memory. + MCU = 'atmega128', 'atmega128a', 'atmega128rfa1', + 'atmega1280', 'atmega1281', 'atmega1284', 'atmega1284p', + 'at90can128', 'at90usb1286', 'at90usb1287'. + + 'avr6' + "Enhanced" devices with 3-byte PC, i.e. with more than 128 KiB + of program memory. + MCU = 'atmega2560', 'atmega2561'. + + 'avrxmega2' + "XMEGA" devices with more than 8 KiB and up to 64 KiB of + program memory. + MCU = 'atmxt112sl', 'atmxt224', 'atmxt224e', 'atmxt336s', + 'atxmega16a4', 'atxmega16a4u', 'atxmega16c4', 'atxmega16d4', + 'atxmega32a4', 'atxmega32a4u', 'atxmega32c4', 'atxmega32d4', + 'atxmega32e5', 'atxmega32x1'. + + 'avrxmega4' + "XMEGA" devices with more than 64 KiB and up to 128 KiB of + program memory. + MCU = 'atxmega64a3', 'atxmega64a3u', 'atxmega64a4u', + 'atxmega64b1', 'atxmega64b3', 'atxmega64c3', 'atxmega64d3', + 'atxmega64d4'. + + 'avrxmega5' + "XMEGA" devices with more than 64 KiB and up to 128 KiB of + program memory and more than 64 KiB of RAM. + MCU = 'atxmega64a1', 'atxmega64a1u'. + + 'avrxmega6' + "XMEGA" devices with more than 128 KiB of program memory. + MCU = 'atmxt540s', 'atmxt540sreva', 'atxmega128a3', + 'atxmega128a3u', 'atxmega128b1', 'atxmega128b3', + 'atxmega128c3', 'atxmega128d3', 'atxmega128d4', + 'atxmega192a3', 'atxmega192a3u', 'atxmega192c3', + 'atxmega192d3', 'atxmega256a3', 'atxmega256a3b', + 'atxmega256a3bu', 'atxmega256a3u', 'atxmega256c3', + 'atxmega256d3', 'atxmega384c3', 'atxmega384d3'. + + 'avrxmega7' + "XMEGA" devices with more than 128 KiB of program memory and + more than 64 KiB of RAM. + MCU = 'atxmega128a1', 'atxmega128a1u', 'atxmega128a4u'. + + 'avr1' + This ISA is implemented by the minimal AVR core and supported + for assembler only. + MCU = 'attiny11', 'attiny12', 'attiny15', 'attiny28', + 'at90s1200'. + +'-maccumulate-args' + Accumulate outgoing function arguments and acquire/release the + needed stack space for outgoing function arguments once in function + prologue/epilogue. Without this option, outgoing arguments are + pushed before calling a function and popped afterwards. + + Popping the arguments after the function call can be expensive on + AVR so that accumulating the stack space might lead to smaller + executables because arguments need not to be removed from the stack + after such a function call. + + This option can lead to reduced code size for functions that + perform several calls to functions that get their arguments on the + stack like calls to printf-like functions. + +'-mbranch-cost=COST' + Set the branch costs for conditional branch instructions to COST. + Reasonable values for COST are small, non-negative integers. The + default branch cost is 0. + +'-mcall-prologues' + Functions prologues/epilogues are expanded as calls to appropriate + subroutines. Code size is smaller. + +'-mint8' + Assume 'int' to be 8-bit integer. This affects the sizes of all + types: a 'char' is 1 byte, an 'int' is 1 byte, a 'long' is 2 bytes, + and 'long long' is 4 bytes. Please note that this option does not + conform to the C standards, but it results in smaller code size. + +'-mno-interrupts' + Generated code is not compatible with hardware interrupts. Code + size is smaller. + +'-mrelax' + Try to replace 'CALL' resp. 'JMP' instruction by the shorter + 'RCALL' resp. 'RJMP' instruction if applicable. Setting '-mrelax' + just adds the '--relax' option to the linker command line when the + linker is called. + + Jump relaxing is performed by the linker because jump offsets are + not known before code is located. Therefore, the assembler code + generated by the compiler is the same, but the instructions in the + executable may differ from instructions in the assembler code. + + Relaxing must be turned on if linker stubs are needed, see the + section on 'EIND' and linker stubs below. + +'-msp8' + Treat the stack pointer register as an 8-bit register, i.e. assume + the high byte of the stack pointer is zero. In general, you don't + need to set this option by hand. + + This option is used internally by the compiler to select and build + multilibs for architectures 'avr2' and 'avr25'. These + architectures mix devices with and without 'SPH'. For any setting + other than '-mmcu=avr2' or '-mmcu=avr25' the compiler driver will + add or remove this option from the compiler proper's command line, + because the compiler then knows if the device or architecture has + an 8-bit stack pointer and thus no 'SPH' register or not. + +'-mstrict-X' + Use address register 'X' in a way proposed by the hardware. This + means that 'X' is only used in indirect, post-increment or + pre-decrement addressing. + + Without this option, the 'X' register may be used in the same way + as 'Y' or 'Z' which then is emulated by additional instructions. + For example, loading a value with 'X+const' addressing with a small + non-negative 'const < 64' to a register RN is performed as + + adiw r26, const ; X += const + ld RN, X ; RN = *X + sbiw r26, const ; X -= const + +'-mtiny-stack' + Only change the lower 8 bits of the stack pointer. + +'-Waddr-space-convert' + Warn about conversions between address spaces in the case where the + resulting address space is not contained in the incoming address + space. + +3.17.5.1 'EIND' and Devices with more than 128 Ki Bytes of Flash +................................................................ + +Pointers in the implementation are 16 bits wide. The address of a +function or label is represented as word address so that indirect jumps +and calls can target any code address in the range of 64 Ki words. + + In order to facilitate indirect jump on devices with more than 128 Ki +bytes of program memory space, there is a special function register +called 'EIND' that serves as most significant part of the target address +when 'EICALL' or 'EIJMP' instructions are used. + + Indirect jumps and calls on these devices are handled as follows by the +compiler and are subject to some limitations: + + * The compiler never sets 'EIND'. + + * The compiler uses 'EIND' implicitely in 'EICALL'/'EIJMP' + instructions or might read 'EIND' directly in order to emulate an + indirect call/jump by means of a 'RET' instruction. + + * The compiler assumes that 'EIND' never changes during the startup + code or during the application. In particular, 'EIND' is not + saved/restored in function or interrupt service routine + prologue/epilogue. + + * For indirect calls to functions and computed goto, the linker + generates _stubs_. Stubs are jump pads sometimes also called + _trampolines_. Thus, the indirect call/jump jumps to such a stub. + The stub contains a direct jump to the desired address. + + * Linker relaxation must be turned on so that the linker will + generate the stubs correctly an all situaltion. See the compiler + option '-mrelax' and the linler option '--relax'. There are corner + cases where the linker is supposed to generate stubs but aborts + without relaxation and without a helpful error message. + + * The default linker script is arranged for code with 'EIND = 0'. If + code is supposed to work for a setup with 'EIND != 0', a custom + linker script has to be used in order to place the sections whose + name start with '.trampolines' into the segment where 'EIND' points + to. + + * The startup code from libgcc never sets 'EIND'. Notice that + startup code is a blend of code from libgcc and AVR-LibC. For the + impact of AVR-LibC on 'EIND', see the + AVR-LibC user manual (http://nongnu.org/avr-libc/user-manual/). + + * It is legitimate for user-specific startup code to set up 'EIND' + early, for example by means of initialization code located in + section '.init3'. Such code runs prior to general startup code + that initializes RAM and calls constructors, but after the bit of + startup code from AVR-LibC that sets 'EIND' to the segment where + the vector table is located. + #include <avr/io.h> + + static void + __attribute__((section(".init3"),naked,used,no_instrument_function)) + init3_set_eind (void) + { + __asm volatile ("ldi r24,pm_hh8(__trampolines_start)\n\t" + "out %i0,r24" :: "n" (&EIND) : "r24","memory"); + } + + The '__trampolines_start' symbol is defined in the linker script. + + * Stubs are generated automatically by the linker if the following + two conditions are met: + + - The address of a label is taken by means of the 'gs' modifier + (short for _generate stubs_) like so: + LDI r24, lo8(gs(FUNC)) + LDI r25, hi8(gs(FUNC)) + - The final location of that label is in a code segment + _outside_ the segment where the stubs are located. + + * The compiler emits such 'gs' modifiers for code labels in the + following situations: + - Taking address of a function or code label. + - Computed goto. + - If prologue-save function is used, see '-mcall-prologues' + command-line option. + - Switch/case dispatch tables. If you do not want such dispatch + tables you can specify the '-fno-jump-tables' command-line + option. + - C and C++ constructors/destructors called during + startup/shutdown. + - If the tools hit a 'gs()' modifier explained above. + + * Jumping to non-symbolic addresses like so is _not_ supported: + + int main (void) + { + /* Call function at word address 0x2 */ + return ((int(*)(void)) 0x2)(); + } + + Instead, a stub has to be set up, i.e. the function has to be + called through a symbol ('func_4' in the example): + + int main (void) + { + extern int func_4 (void); + + /* Call function at byte address 0x4 */ + return func_4(); + } + + and the application be linked with '-Wl,--defsym,func_4=0x4'. + Alternatively, 'func_4' can be defined in the linker script. + +3.17.5.2 Handling of the 'RAMPD', 'RAMPX', 'RAMPY' and 'RAMPZ' Special Function Registers +......................................................................................... + +Some AVR devices support memories larger than the 64 KiB range that can +be accessed with 16-bit pointers. To access memory locations outside +this 64 KiB range, the contentent of a 'RAMP' register is used as high +part of the address: The 'X', 'Y', 'Z' address register is concatenated +with the 'RAMPX', 'RAMPY', 'RAMPZ' special function register, +respectively, to get a wide address. Similarly, 'RAMPD' is used +together with direct addressing. + + * The startup code initializes the 'RAMP' special function registers + with zero. + + * If a *note named address space: AVR Named Address Spaces. other + than generic or '__flash' is used, then 'RAMPZ' is set as needed + before the operation. + + * If the device supports RAM larger than 64 KiB and the compiler + needs to change 'RAMPZ' to accomplish an operation, 'RAMPZ' is + reset to zero after the operation. + + * If the device comes with a specific 'RAMP' register, the ISR + prologue/epilogue saves/restores that SFR and initializes it with + zero in case the ISR code might (implicitly) use it. + + * RAM larger than 64 KiB is not supported by GCC for AVR targets. If + you use inline assembler to read from locations outside the 16-bit + address range and change one of the 'RAMP' registers, you must + reset it to zero after the access. + +3.17.5.3 AVR Built-in Macros +............................ + +GCC defines several built-in macros so that the user code can test for +the presence or absence of features. Almost any of the following +built-in macros are deduced from device capabilities and thus triggered +by the '-mmcu=' command-line option. + + For even more AVR-specific built-in macros see *note AVR Named Address +Spaces:: and *note AVR Built-in Functions::. + +'__AVR_ARCH__' + Build-in macro that resolves to a decimal number that identifies + the architecture and depends on the '-mmcu=MCU' option. Possible + values are: + + '2', '25', '3', '31', '35', '4', '5', '51', '6', '102', '104', + '105', '106', '107' + + for MCU='avr2', 'avr25', 'avr3', 'avr31', 'avr35', 'avr4', 'avr5', + 'avr51', 'avr6', 'avrxmega2', 'avrxmega4', 'avrxmega5', + 'avrxmega6', 'avrxmega7', respectively. If MCU specifies a device, + this built-in macro is set accordingly. For example, with + '-mmcu=atmega8' the macro will be defined to '4'. + +'__AVR_DEVICE__' + Setting '-mmcu=DEVICE' defines this built-in macro which reflects + the device's name. For example, '-mmcu=atmega8' defines the + built-in macro '__AVR_ATmega8__', '-mmcu=attiny261a' defines + '__AVR_ATtiny261A__', etc. + + The built-in macros' names follow the scheme '__AVR_DEVICE__' where + DEVICE is the device name as from the AVR user manual. The + difference between DEVICE in the built-in macro and DEVICE in + '-mmcu=DEVICE' is that the latter is always lowercase. + + If DEVICE is not a device but only a core architecture like + 'avr51', this macro will not be defined. + +'__AVR_XMEGA__' + The device / architecture belongs to the XMEGA family of devices. + +'__AVR_HAVE_ELPM__' + The device has the the 'ELPM' instruction. + +'__AVR_HAVE_ELPMX__' + The device has the 'ELPM RN,Z' and 'ELPM RN,Z+' instructions. + +'__AVR_HAVE_MOVW__' + The device has the 'MOVW' instruction to perform 16-bit + register-register moves. + +'__AVR_HAVE_LPMX__' + The device has the 'LPM RN,Z' and 'LPM RN,Z+' instructions. + +'__AVR_HAVE_MUL__' + The device has a hardware multiplier. + +'__AVR_HAVE_JMP_CALL__' + The device has the 'JMP' and 'CALL' instructions. This is the case + for devices with at least 16 KiB of program memory. + +'__AVR_HAVE_EIJMP_EICALL__' +'__AVR_3_BYTE_PC__' + The device has the 'EIJMP' and 'EICALL' instructions. This is the + case for devices with more than 128 KiB of program memory. This + also means that the program counter (PC) is 3 bytes wide. + +'__AVR_2_BYTE_PC__' + The program counter (PC) is 2 bytes wide. This is the case for + devices with up to 128 KiB of program memory. + +'__AVR_HAVE_8BIT_SP__' +'__AVR_HAVE_16BIT_SP__' + The stack pointer (SP) register is treated as 8-bit respectively + 16-bit register by the compiler. The definition of these macros is + affected by '-mtiny-stack'. + +'__AVR_HAVE_SPH__' +'__AVR_SP8__' + The device has the SPH (high part of stack pointer) special + function register or has an 8-bit stack pointer, respectively. The + definition of these macros is affected by '-mmcu=' and in the cases + of '-mmcu=avr2' and '-mmcu=avr25' also by '-msp8'. + +'__AVR_HAVE_RAMPD__' +'__AVR_HAVE_RAMPX__' +'__AVR_HAVE_RAMPY__' +'__AVR_HAVE_RAMPZ__' + The device has the 'RAMPD', 'RAMPX', 'RAMPY', 'RAMPZ' special + function register, respectively. + +'__NO_INTERRUPTS__' + This macro reflects the '-mno-interrupts' command line option. + +'__AVR_ERRATA_SKIP__' +'__AVR_ERRATA_SKIP_JMP_CALL__' + Some AVR devices (AT90S8515, ATmega103) must not skip 32-bit + instructions because of a hardware erratum. Skip instructions are + 'SBRS', 'SBRC', 'SBIS', 'SBIC' and 'CPSE'. The second macro is + only defined if '__AVR_HAVE_JMP_CALL__' is also set. + +'__AVR_ISA_RMW__' + The device has Read-Modify-Write instructions (XCH, LAC, LAS and + LAT). + +'__AVR_SFR_OFFSET__=OFFSET' + Instructions that can address I/O special function registers + directly like 'IN', 'OUT', 'SBI', etc. may use a different address + as if addressed by an instruction to access RAM like 'LD' or 'STS'. + This offset depends on the device architecture and has to be + subtracted from the RAM address in order to get the respective + I/O address. + +'__WITH_AVRLIBC__' + The compiler is configured to be used together with AVR-Libc. See + the '--with-avrlibc' configure option. + + +File: gcc.info, Node: Blackfin Options, Next: C6X Options, Prev: AVR Options, Up: Submodel Options + +3.17.6 Blackfin Options +----------------------- + +'-mcpu=CPU[-SIREVISION]' + Specifies the name of the target Blackfin processor. Currently, + CPU can be one of 'bf512', 'bf514', 'bf516', 'bf518', 'bf522', + 'bf523', 'bf524', 'bf525', 'bf526', 'bf527', 'bf531', 'bf532', + 'bf533', 'bf534', 'bf536', 'bf537', 'bf538', 'bf539', 'bf542', + 'bf544', 'bf547', 'bf548', 'bf549', 'bf542m', 'bf544m', 'bf547m', + 'bf548m', 'bf549m', 'bf561', 'bf592'. + + The optional SIREVISION specifies the silicon revision of the + target Blackfin processor. Any workarounds available for the + targeted silicon revision are enabled. If SIREVISION is 'none', no + workarounds are enabled. If SIREVISION is 'any', all workarounds + for the targeted processor are enabled. The '__SILICON_REVISION__' + macro is defined to two hexadecimal digits representing the major + and minor numbers in the silicon revision. If SIREVISION is + 'none', the '__SILICON_REVISION__' is not defined. If SIREVISION + is 'any', the '__SILICON_REVISION__' is defined to be '0xffff'. If + this optional SIREVISION is not used, GCC assumes the latest known + silicon revision of the targeted Blackfin processor. + + GCC defines a preprocessor macro for the specified CPU. For the + 'bfin-elf' toolchain, this option causes the hardware BSP provided + by libgloss to be linked in if '-msim' is not given. + + Without this option, 'bf532' is used as the processor by default. + + Note that support for 'bf561' is incomplete. For 'bf561', only the + preprocessor macro is defined. + +'-msim' + Specifies that the program will be run on the simulator. This + causes the simulator BSP provided by libgloss to be linked in. + This option has effect only for 'bfin-elf' toolchain. Certain + other options, such as '-mid-shared-library' and '-mfdpic', imply + '-msim'. + +'-momit-leaf-frame-pointer' + Don't keep the frame pointer in a register for leaf functions. + This avoids the instructions to save, set up and restore frame + pointers and makes an extra register available in leaf functions. + The option '-fomit-frame-pointer' removes the frame pointer for all + functions, which might make debugging harder. + +'-mspecld-anomaly' + When enabled, the compiler ensures that the generated code does not + contain speculative loads after jump instructions. If this option + is used, '__WORKAROUND_SPECULATIVE_LOADS' is defined. + +'-mno-specld-anomaly' + Don't generate extra code to prevent speculative loads from + occurring. + +'-mcsync-anomaly' + When enabled, the compiler ensures that the generated code does not + contain CSYNC or SSYNC instructions too soon after conditional + branches. If this option is used, '__WORKAROUND_SPECULATIVE_SYNCS' + is defined. + +'-mno-csync-anomaly' + Don't generate extra code to prevent CSYNC or SSYNC instructions + from occurring too soon after a conditional branch. + +'-mlow-64k' + When enabled, the compiler is free to take advantage of the + knowledge that the entire program fits into the low 64k of memory. + +'-mno-low-64k' + Assume that the program is arbitrarily large. This is the default. + +'-mstack-check-l1' + Do stack checking using information placed into L1 scratchpad + memory by the uClinux kernel. + +'-mid-shared-library' + Generate code that supports shared libraries via the library ID + method. This allows for execute in place and shared libraries in + an environment without virtual memory management. This option + implies '-fPIC'. With a 'bfin-elf' target, this option implies + '-msim'. + +'-mno-id-shared-library' + Generate code that doesn't assume ID-based shared libraries are + being used. This is the default. + +'-mleaf-id-shared-library' + Generate code that supports shared libraries via the library ID + method, but assumes that this library or executable won't link + against any other ID shared libraries. That allows the compiler to + use faster code for jumps and calls. + +'-mno-leaf-id-shared-library' + Do not assume that the code being compiled won't link against any + ID shared libraries. Slower code is generated for jump and call + insns. + +'-mshared-library-id=n' + Specifies the identification number of the ID-based shared library + being compiled. Specifying a value of 0 generates more compact + code; specifying other values forces the allocation of that number + to the current library but is no more space- or time-efficient than + omitting this option. + +'-msep-data' + Generate code that allows the data segment to be located in a + different area of memory from the text segment. This allows for + execute in place in an environment without virtual memory + management by eliminating relocations against the text section. + +'-mno-sep-data' + Generate code that assumes that the data segment follows the text + segment. This is the default. + +'-mlong-calls' +'-mno-long-calls' + Tells the compiler to perform function calls by first loading the + address of the function into a register and then performing a + subroutine call on this register. This switch is needed if the + target function lies outside of the 24-bit addressing range of the + offset-based version of subroutine call instruction. + + This feature is not enabled by default. Specifying + '-mno-long-calls' restores the default behavior. Note these + switches have no effect on how the compiler generates code to + handle function calls via function pointers. + +'-mfast-fp' + Link with the fast floating-point library. This library relaxes + some of the IEEE floating-point standard's rules for checking + inputs against Not-a-Number (NAN), in the interest of performance. + +'-minline-plt' + Enable inlining of PLT entries in function calls to functions that + are not known to bind locally. It has no effect without '-mfdpic'. + +'-mmulticore' + Build a standalone application for multicore Blackfin processors. + This option causes proper start files and link scripts supporting + multicore to be used, and defines the macro '__BFIN_MULTICORE'. It + can only be used with '-mcpu=bf561[-SIREVISION]'. + + This option can be used with '-mcorea' or '-mcoreb', which selects + the one-application-per-core programming model. Without '-mcorea' + or '-mcoreb', the single-application/dual-core programming model is + used. In this model, the main function of Core B should be named + as 'coreb_main'. + + If this option is not used, the single-core application programming + model is used. + +'-mcorea' + Build a standalone application for Core A of BF561 when using the + one-application-per-core programming model. Proper start files and + link scripts are used to support Core A, and the macro + '__BFIN_COREA' is defined. This option can only be used in + conjunction with '-mmulticore'. + +'-mcoreb' + Build a standalone application for Core B of BF561 when using the + one-application-per-core programming model. Proper start files and + link scripts are used to support Core B, and the macro + '__BFIN_COREB' is defined. When this option is used, 'coreb_main' + should be used instead of 'main'. This option can only be used in + conjunction with '-mmulticore'. + +'-msdram' + Build a standalone application for SDRAM. Proper start files and + link scripts are used to put the application into SDRAM, and the + macro '__BFIN_SDRAM' is defined. The loader should initialize + SDRAM before loading the application. + +'-micplb' + Assume that ICPLBs are enabled at run time. This has an effect on + certain anomaly workarounds. For Linux targets, the default is to + assume ICPLBs are enabled; for standalone applications the default + is off. + + +File: gcc.info, Node: C6X Options, Next: CRIS Options, Prev: Blackfin Options, Up: Submodel Options + +3.17.7 C6X Options +------------------ + +'-march=NAME' + This specifies the name of the target architecture. GCC uses this + name to determine what kind of instructions it can emit when + generating assembly code. Permissible names are: 'c62x', 'c64x', + 'c64x+', 'c67x', 'c67x+', 'c674x'. + +'-mbig-endian' + Generate code for a big-endian target. + +'-mlittle-endian' + Generate code for a little-endian target. This is the default. + +'-msim' + Choose startup files and linker script suitable for the simulator. + +'-msdata=default' + Put small global and static data in the '.neardata' section, which + is pointed to by register 'B14'. Put small uninitialized global + and static data in the '.bss' section, which is adjacent to the + '.neardata' section. Put small read-only data into the '.rodata' + section. The corresponding sections used for large pieces of data + are '.fardata', '.far' and '.const'. + +'-msdata=all' + Put all data, not just small objects, into the sections reserved + for small data, and use addressing relative to the 'B14' register + to access them. + +'-msdata=none' + Make no use of the sections reserved for small data, and use + absolute addresses to access all data. Put all initialized global + and static data in the '.fardata' section, and all uninitialized + data in the '.far' section. Put all constant data into the + '.const' section. + + +File: gcc.info, Node: CRIS Options, Next: CR16 Options, Prev: C6X Options, Up: Submodel Options + +3.17.8 CRIS Options +------------------- + +These options are defined specifically for the CRIS ports. + +'-march=ARCHITECTURE-TYPE' +'-mcpu=ARCHITECTURE-TYPE' + Generate code for the specified architecture. The choices for + ARCHITECTURE-TYPE are 'v3', 'v8' and 'v10' for respectively + ETRAX 4, ETRAX 100, and ETRAX 100 LX. Default is 'v0' except for + cris-axis-linux-gnu, where the default is 'v10'. + +'-mtune=ARCHITECTURE-TYPE' + Tune to ARCHITECTURE-TYPE everything applicable about the generated + code, except for the ABI and the set of available instructions. + The choices for ARCHITECTURE-TYPE are the same as for + '-march=ARCHITECTURE-TYPE'. + +'-mmax-stack-frame=N' + Warn when the stack frame of a function exceeds N bytes. + +'-metrax4' +'-metrax100' + The options '-metrax4' and '-metrax100' are synonyms for + '-march=v3' and '-march=v8' respectively. + +'-mmul-bug-workaround' +'-mno-mul-bug-workaround' + Work around a bug in the 'muls' and 'mulu' instructions for CPU + models where it applies. This option is active by default. + +'-mpdebug' + Enable CRIS-specific verbose debug-related information in the + assembly code. This option also has the effect of turning off the + '#NO_APP' formatted-code indicator to the assembler at the + beginning of the assembly file. + +'-mcc-init' + Do not use condition-code results from previous instruction; always + emit compare and test instructions before use of condition codes. + +'-mno-side-effects' + Do not emit instructions with side effects in addressing modes + other than post-increment. + +'-mstack-align' +'-mno-stack-align' +'-mdata-align' +'-mno-data-align' +'-mconst-align' +'-mno-const-align' + These options ('no-' options) arrange (eliminate arrangements) for + the stack frame, individual data and constants to be aligned for + the maximum single data access size for the chosen CPU model. The + default is to arrange for 32-bit alignment. ABI details such as + structure layout are not affected by these options. + +'-m32-bit' +'-m16-bit' +'-m8-bit' + Similar to the stack- data- and const-align options above, these + options arrange for stack frame, writable data and constants to all + be 32-bit, 16-bit or 8-bit aligned. The default is 32-bit + alignment. + +'-mno-prologue-epilogue' +'-mprologue-epilogue' + With '-mno-prologue-epilogue', the normal function prologue and + epilogue which set up the stack frame are omitted and no return + instructions or return sequences are generated in the code. Use + this option only together with visual inspection of the compiled + code: no warnings or errors are generated when call-saved registers + must be saved, or storage for local variables needs to be + allocated. + +'-mno-gotplt' +'-mgotplt' + With '-fpic' and '-fPIC', don't generate (do generate) instruction + sequences that load addresses for functions from the PLT part of + the GOT rather than (traditional on other architectures) calls to + the PLT. The default is '-mgotplt'. + +'-melf' + Legacy no-op option only recognized with the cris-axis-elf and + cris-axis-linux-gnu targets. + +'-mlinux' + Legacy no-op option only recognized with the cris-axis-linux-gnu + target. + +'-sim' + This option, recognized for the cris-axis-elf, arranges to link + with input-output functions from a simulator library. Code, + initialized data and zero-initialized data are allocated + consecutively. + +'-sim2' + Like '-sim', but pass linker options to locate initialized data at + 0x40000000 and zero-initialized data at 0x80000000. + + +File: gcc.info, Node: CR16 Options, Next: Darwin Options, Prev: CRIS Options, Up: Submodel Options + +3.17.9 CR16 Options +------------------- + +These options are defined specifically for the CR16 ports. + +'-mmac' + Enable the use of multiply-accumulate instructions. Disabled by + default. + +'-mcr16cplus' +'-mcr16c' + Generate code for CR16C or CR16C+ architecture. CR16C+ + architecture is default. + +'-msim' + Links the library libsim.a which is in compatible with simulator. + Applicable to ELF compiler only. + +'-mint32' + Choose integer type as 32-bit wide. + +'-mbit-ops' + Generates 'sbit'/'cbit' instructions for bit manipulations. + +'-mdata-model=MODEL' + Choose a data model. The choices for MODEL are 'near', 'far' or + 'medium'. 'medium' is default. However, 'far' is not valid with + '-mcr16c', as the CR16C architecture does not support the far data + model. + + +File: gcc.info, Node: Darwin Options, Next: DEC Alpha Options, Prev: CR16 Options, Up: Submodel Options + +3.17.10 Darwin Options +---------------------- + +These options are defined for all architectures running the Darwin +operating system. + + FSF GCC on Darwin does not create "fat" object files; it creates an +object file for the single architecture that GCC was built to target. +Apple's GCC on Darwin does create "fat" files if multiple '-arch' +options are used; it does so by running the compiler or linker multiple +times and joining the results together with 'lipo'. + + The subtype of the file created (like 'ppc7400' or 'ppc970' or 'i686') +is determined by the flags that specify the ISA that GCC is targeting, +like '-mcpu' or '-march'. The '-force_cpusubtype_ALL' option can be +used to override this. + + The Darwin tools vary in their behavior when presented with an ISA +mismatch. The assembler, 'as', only permits instructions to be used +that are valid for the subtype of the file it is generating, so you +cannot put 64-bit instructions in a 'ppc750' object file. The linker +for shared libraries, '/usr/bin/libtool', fails and prints an error if +asked to create a shared library with a less restrictive subtype than +its input files (for instance, trying to put a 'ppc970' object file in a +'ppc7400' library). The linker for executables, 'ld', quietly gives the +executable the most restrictive subtype of any of its input files. + +'-FDIR' + Add the framework directory DIR to the head of the list of + directories to be searched for header files. These directories are + interleaved with those specified by '-I' options and are scanned in + a left-to-right order. + + A framework directory is a directory with frameworks in it. A + framework is a directory with a 'Headers' and/or 'PrivateHeaders' + directory contained directly in it that ends in '.framework'. The + name of a framework is the name of this directory excluding the + '.framework'. Headers associated with the framework are found in + one of those two directories, with 'Headers' being searched first. + A subframework is a framework directory that is in a framework's + 'Frameworks' directory. Includes of subframework headers can only + appear in a header of a framework that contains the subframework, + or in a sibling subframework header. Two subframeworks are + siblings if they occur in the same framework. A subframework + should not have the same name as a framework; a warning is issued + if this is violated. Currently a subframework cannot have + subframeworks; in the future, the mechanism may be extended to + support this. The standard frameworks can be found in + '/System/Library/Frameworks' and '/Library/Frameworks'. An example + include looks like '#include <Framework/header.h>', where + 'Framework' denotes the name of the framework and 'header.h' is + found in the 'PrivateHeaders' or 'Headers' directory. + +'-iframeworkDIR' + Like '-F' except the directory is a treated as a system directory. + The main difference between this '-iframework' and '-F' is that + with '-iframework' the compiler does not warn about constructs + contained within header files found via DIR. This option is valid + only for the C family of languages. + +'-gused' + Emit debugging information for symbols that are used. For stabs + debugging format, this enables '-feliminate-unused-debug-symbols'. + This is by default ON. + +'-gfull' + Emit debugging information for all symbols and types. + +'-mmacosx-version-min=VERSION' + The earliest version of MacOS X that this executable will run on is + VERSION. Typical values of VERSION include '10.1', '10.2', and + '10.3.9'. + + If the compiler was built to use the system's headers by default, + then the default for this option is the system version on which the + compiler is running, otherwise the default is to make choices that + are compatible with as many systems and code bases as possible. + +'-mkernel' + Enable kernel development mode. The '-mkernel' option sets + '-static', '-fno-common', '-fno-cxa-atexit', '-fno-exceptions', + '-fno-non-call-exceptions', '-fapple-kext', '-fno-weak' and + '-fno-rtti' where applicable. This mode also sets '-mno-altivec', + '-msoft-float', '-fno-builtin' and '-mlong-branch' for PowerPC + targets. + +'-mone-byte-bool' + Override the defaults for 'bool' so that 'sizeof(bool)==1'. By + default 'sizeof(bool)' is '4' when compiling for Darwin/PowerPC and + '1' when compiling for Darwin/x86, so this option has no effect on + x86. + + *Warning:* The '-mone-byte-bool' switch causes GCC to generate code + that is not binary compatible with code generated without that + switch. Using this switch may require recompiling all other + modules in a program, including system libraries. Use this switch + to conform to a non-default data model. + +'-mfix-and-continue' +'-ffix-and-continue' +'-findirect-data' + Generate code suitable for fast turnaround development, such as to + allow GDB to dynamically load '.o' files into already-running + programs. '-findirect-data' and '-ffix-and-continue' are provided + for backwards compatibility. + +'-all_load' + Loads all members of static archive libraries. See man ld(1) for + more information. + +'-arch_errors_fatal' + Cause the errors having to do with files that have the wrong + architecture to be fatal. + +'-bind_at_load' + Causes the output file to be marked such that the dynamic linker + will bind all undefined references when the file is loaded or + launched. + +'-bundle' + Produce a Mach-o bundle format file. See man ld(1) for more + information. + +'-bundle_loader EXECUTABLE' + This option specifies the EXECUTABLE that will load the build + output file being linked. See man ld(1) for more information. + +'-dynamiclib' + When passed this option, GCC produces a dynamic library instead of + an executable when linking, using the Darwin 'libtool' command. + +'-force_cpusubtype_ALL' + This causes GCC's output file to have the ALL subtype, instead of + one controlled by the '-mcpu' or '-march' option. + +'-allowable_client CLIENT_NAME' +'-client_name' +'-compatibility_version' +'-current_version' +'-dead_strip' +'-dependency-file' +'-dylib_file' +'-dylinker_install_name' +'-dynamic' +'-exported_symbols_list' +'-filelist' +'-flat_namespace' +'-force_flat_namespace' +'-headerpad_max_install_names' +'-image_base' +'-init' +'-install_name' +'-keep_private_externs' +'-multi_module' +'-multiply_defined' +'-multiply_defined_unused' +'-noall_load' +'-no_dead_strip_inits_and_terms' +'-nofixprebinding' +'-nomultidefs' +'-noprebind' +'-noseglinkedit' +'-pagezero_size' +'-prebind' +'-prebind_all_twolevel_modules' +'-private_bundle' +'-read_only_relocs' +'-sectalign' +'-sectobjectsymbols' +'-whyload' +'-seg1addr' +'-sectcreate' +'-sectobjectsymbols' +'-sectorder' +'-segaddr' +'-segs_read_only_addr' +'-segs_read_write_addr' +'-seg_addr_table' +'-seg_addr_table_filename' +'-seglinkedit' +'-segprot' +'-segs_read_only_addr' +'-segs_read_write_addr' +'-single_module' +'-static' +'-sub_library' +'-sub_umbrella' +'-twolevel_namespace' +'-umbrella' +'-undefined' +'-unexported_symbols_list' +'-weak_reference_mismatches' +'-whatsloaded' + These options are passed to the Darwin linker. The Darwin linker + man page describes them in detail. + + +File: gcc.info, Node: DEC Alpha Options, Next: FR30 Options, Prev: Darwin Options, Up: Submodel Options + +3.17.11 DEC Alpha Options +------------------------- + +These '-m' options are defined for the DEC Alpha implementations: + +'-mno-soft-float' +'-msoft-float' + Use (do not use) the hardware floating-point instructions for + floating-point operations. When '-msoft-float' is specified, + functions in 'libgcc.a' are used to perform floating-point + operations. Unless they are replaced by routines that emulate the + floating-point operations, or compiled in such a way as to call + such emulations routines, these routines issue floating-point + operations. If you are compiling for an Alpha without + floating-point operations, you must ensure that the library is + built so as not to call them. + + Note that Alpha implementations without floating-point operations + are required to have floating-point registers. + +'-mfp-reg' +'-mno-fp-regs' + Generate code that uses (does not use) the floating-point register + set. '-mno-fp-regs' implies '-msoft-float'. If the floating-point + register set is not used, floating-point operands are passed in + integer registers as if they were integers and floating-point + results are passed in '$0' instead of '$f0'. This is a + non-standard calling sequence, so any function with a + floating-point argument or return value called by code compiled + with '-mno-fp-regs' must also be compiled with that option. + + A typical use of this option is building a kernel that does not + use, and hence need not save and restore, any floating-point + registers. + +'-mieee' + The Alpha architecture implements floating-point hardware optimized + for maximum performance. It is mostly compliant with the IEEE + floating-point standard. However, for full compliance, software + assistance is required. This option generates code fully + IEEE-compliant code _except_ that the INEXACT-FLAG is not + maintained (see below). If this option is turned on, the + preprocessor macro '_IEEE_FP' is defined during compilation. The + resulting code is less efficient but is able to correctly support + denormalized numbers and exceptional IEEE values such as + not-a-number and plus/minus infinity. Other Alpha compilers call + this option '-ieee_with_no_inexact'. + +'-mieee-with-inexact' + This is like '-mieee' except the generated code also maintains the + IEEE INEXACT-FLAG. Turning on this option causes the generated + code to implement fully-compliant IEEE math. In addition to + '_IEEE_FP', '_IEEE_FP_EXACT' is defined as a preprocessor macro. + On some Alpha implementations the resulting code may execute + significantly slower than the code generated by default. Since + there is very little code that depends on the INEXACT-FLAG, you + should normally not specify this option. Other Alpha compilers + call this option '-ieee_with_inexact'. + +'-mfp-trap-mode=TRAP-MODE' + This option controls what floating-point related traps are enabled. + Other Alpha compilers call this option '-fptm TRAP-MODE'. The trap + mode can be set to one of four values: + + 'n' + This is the default (normal) setting. The only traps that are + enabled are the ones that cannot be disabled in software + (e.g., division by zero trap). + + 'u' + In addition to the traps enabled by 'n', underflow traps are + enabled as well. + + 'su' + Like 'u', but the instructions are marked to be safe for + software completion (see Alpha architecture manual for + details). + + 'sui' + Like 'su', but inexact traps are enabled as well. + +'-mfp-rounding-mode=ROUNDING-MODE' + Selects the IEEE rounding mode. Other Alpha compilers call this + option '-fprm ROUNDING-MODE'. The ROUNDING-MODE can be one of: + + 'n' + Normal IEEE rounding mode. Floating-point numbers are rounded + towards the nearest machine number or towards the even machine + number in case of a tie. + + 'm' + Round towards minus infinity. + + 'c' + Chopped rounding mode. Floating-point numbers are rounded + towards zero. + + 'd' + Dynamic rounding mode. A field in the floating-point control + register (FPCR, see Alpha architecture reference manual) + controls the rounding mode in effect. The C library + initializes this register for rounding towards plus infinity. + Thus, unless your program modifies the FPCR, 'd' corresponds + to round towards plus infinity. + +'-mtrap-precision=TRAP-PRECISION' + In the Alpha architecture, floating-point traps are imprecise. + This means without software assistance it is impossible to recover + from a floating trap and program execution normally needs to be + terminated. GCC can generate code that can assist operating system + trap handlers in determining the exact location that caused a + floating-point trap. Depending on the requirements of an + application, different levels of precisions can be selected: + + 'p' + Program precision. This option is the default and means a + trap handler can only identify which program caused a + floating-point exception. + + 'f' + Function precision. The trap handler can determine the + function that caused a floating-point exception. + + 'i' + Instruction precision. The trap handler can determine the + exact instruction that caused a floating-point exception. + + Other Alpha compilers provide the equivalent options called + '-scope_safe' and '-resumption_safe'. + +'-mieee-conformant' + This option marks the generated code as IEEE conformant. You must + not use this option unless you also specify '-mtrap-precision=i' + and either '-mfp-trap-mode=su' or '-mfp-trap-mode=sui'. Its only + effect is to emit the line '.eflag 48' in the function prologue of + the generated assembly file. + +'-mbuild-constants' + Normally GCC examines a 32- or 64-bit integer constant to see if it + can construct it from smaller constants in two or three + instructions. If it cannot, it outputs the constant as a literal + and generates code to load it from the data segment at run time. + + Use this option to require GCC to construct _all_ integer constants + using code, even if it takes more instructions (the maximum is + six). + + You typically use this option to build a shared library dynamic + loader. Itself a shared library, it must relocate itself in memory + before it can find the variables and constants in its own data + segment. + +'-mbwx' +'-mno-bwx' +'-mcix' +'-mno-cix' +'-mfix' +'-mno-fix' +'-mmax' +'-mno-max' + Indicate whether GCC should generate code to use the optional BWX, + CIX, FIX and MAX instruction sets. The default is to use the + instruction sets supported by the CPU type specified via '-mcpu=' + option or that of the CPU on which GCC was built if none is + specified. + +'-mfloat-vax' +'-mfloat-ieee' + Generate code that uses (does not use) VAX F and G floating-point + arithmetic instead of IEEE single and double precision. + +'-mexplicit-relocs' +'-mno-explicit-relocs' + Older Alpha assemblers provided no way to generate symbol + relocations except via assembler macros. Use of these macros does + not allow optimal instruction scheduling. GNU binutils as of + version 2.12 supports a new syntax that allows the compiler to + explicitly mark which relocations should apply to which + instructions. This option is mostly useful for debugging, as GCC + detects the capabilities of the assembler when it is built and sets + the default accordingly. + +'-msmall-data' +'-mlarge-data' + When '-mexplicit-relocs' is in effect, static data is accessed via + "gp-relative" relocations. When '-msmall-data' is used, objects 8 + bytes long or smaller are placed in a "small data area" (the + '.sdata' and '.sbss' sections) and are accessed via 16-bit + relocations off of the '$gp' register. This limits the size of the + small data area to 64KB, but allows the variables to be directly + accessed via a single instruction. + + The default is '-mlarge-data'. With this option the data area is + limited to just below 2GB. Programs that require more than 2GB of + data must use 'malloc' or 'mmap' to allocate the data in the heap + instead of in the program's data segment. + + When generating code for shared libraries, '-fpic' implies + '-msmall-data' and '-fPIC' implies '-mlarge-data'. + +'-msmall-text' +'-mlarge-text' + When '-msmall-text' is used, the compiler assumes that the code of + the entire program (or shared library) fits in 4MB, and is thus + reachable with a branch instruction. When '-msmall-data' is used, + the compiler can assume that all local symbols share the same '$gp' + value, and thus reduce the number of instructions required for a + function call from 4 to 1. + + The default is '-mlarge-text'. + +'-mcpu=CPU_TYPE' + Set the instruction set and instruction scheduling parameters for + machine type CPU_TYPE. You can specify either the 'EV' style name + or the corresponding chip number. GCC supports scheduling + parameters for the EV4, EV5 and EV6 family of processors and + chooses the default values for the instruction set from the + processor you specify. If you do not specify a processor type, GCC + defaults to the processor on which the compiler was built. + + Supported values for CPU_TYPE are + + 'ev4' + 'ev45' + '21064' + Schedules as an EV4 and has no instruction set extensions. + + 'ev5' + '21164' + Schedules as an EV5 and has no instruction set extensions. + + 'ev56' + '21164a' + Schedules as an EV5 and supports the BWX extension. + + 'pca56' + '21164pc' + '21164PC' + Schedules as an EV5 and supports the BWX and MAX extensions. + + 'ev6' + '21264' + Schedules as an EV6 and supports the BWX, FIX, and MAX + extensions. + + 'ev67' + '21264a' + Schedules as an EV6 and supports the BWX, CIX, FIX, and MAX + extensions. + + Native toolchains also support the value 'native', which selects + the best architecture option for the host processor. + '-mcpu=native' has no effect if GCC does not recognize the + processor. + +'-mtune=CPU_TYPE' + Set only the instruction scheduling parameters for machine type + CPU_TYPE. The instruction set is not changed. + + Native toolchains also support the value 'native', which selects + the best architecture option for the host processor. + '-mtune=native' has no effect if GCC does not recognize the + processor. + +'-mmemory-latency=TIME' + Sets the latency the scheduler should assume for typical memory + references as seen by the application. This number is highly + dependent on the memory access patterns used by the application and + the size of the external cache on the machine. + + Valid options for TIME are + + 'NUMBER' + A decimal number representing clock cycles. + + 'L1' + 'L2' + 'L3' + 'main' + The compiler contains estimates of the number of clock cycles + for "typical" EV4 & EV5 hardware for the Level 1, 2 & 3 caches + (also called Dcache, Scache, and Bcache), as well as to main + memory. Note that L3 is only valid for EV5. + + +File: gcc.info, Node: FR30 Options, Next: FRV Options, Prev: DEC Alpha Options, Up: Submodel Options + +3.17.12 FR30 Options +-------------------- + +These options are defined specifically for the FR30 port. + +'-msmall-model' + Use the small address space model. This can produce smaller code, + but it does assume that all symbolic values and addresses fit into + a 20-bit range. + +'-mno-lsim' + Assume that runtime support has been provided and so there is no + need to include the simulator library ('libsim.a') on the linker + command line. + + +File: gcc.info, Node: FRV Options, Next: GNU/Linux Options, Prev: FR30 Options, Up: Submodel Options + +3.17.13 FRV Options +------------------- + +'-mgpr-32' + + Only use the first 32 general-purpose registers. + +'-mgpr-64' + + Use all 64 general-purpose registers. + +'-mfpr-32' + + Use only the first 32 floating-point registers. + +'-mfpr-64' + + Use all 64 floating-point registers. + +'-mhard-float' + + Use hardware instructions for floating-point operations. + +'-msoft-float' + + Use library routines for floating-point operations. + +'-malloc-cc' + + Dynamically allocate condition code registers. + +'-mfixed-cc' + + Do not try to dynamically allocate condition code registers, only + use 'icc0' and 'fcc0'. + +'-mdword' + + Change ABI to use double word insns. + +'-mno-dword' + + Do not use double word instructions. + +'-mdouble' + + Use floating-point double instructions. + +'-mno-double' + + Do not use floating-point double instructions. + +'-mmedia' + + Use media instructions. + +'-mno-media' + + Do not use media instructions. + +'-mmuladd' + + Use multiply and add/subtract instructions. + +'-mno-muladd' + + Do not use multiply and add/subtract instructions. + +'-mfdpic' + + Select the FDPIC ABI, which uses function descriptors to represent + pointers to functions. Without any PIC/PIE-related options, it + implies '-fPIE'. With '-fpic' or '-fpie', it assumes GOT entries + and small data are within a 12-bit range from the GOT base address; + with '-fPIC' or '-fPIE', GOT offsets are computed with 32 bits. + With a 'bfin-elf' target, this option implies '-msim'. + +'-minline-plt' + + Enable inlining of PLT entries in function calls to functions that + are not known to bind locally. It has no effect without '-mfdpic'. + It's enabled by default if optimizing for speed and compiling for + shared libraries (i.e., '-fPIC' or '-fpic'), or when an + optimization option such as '-O3' or above is present in the + command line. + +'-mTLS' + + Assume a large TLS segment when generating thread-local code. + +'-mtls' + + Do not assume a large TLS segment when generating thread-local + code. + +'-mgprel-ro' + + Enable the use of 'GPREL' relocations in the FDPIC ABI for data + that is known to be in read-only sections. It's enabled by + default, except for '-fpic' or '-fpie': even though it may help + make the global offset table smaller, it trades 1 instruction for + 4. With '-fPIC' or '-fPIE', it trades 3 instructions for 4, one of + which may be shared by multiple symbols, and it avoids the need for + a GOT entry for the referenced symbol, so it's more likely to be a + win. If it is not, '-mno-gprel-ro' can be used to disable it. + +'-multilib-library-pic' + + Link with the (library, not FD) pic libraries. It's implied by + '-mlibrary-pic', as well as by '-fPIC' and '-fpic' without + '-mfdpic'. You should never have to use it explicitly. + +'-mlinked-fp' + + Follow the EABI requirement of always creating a frame pointer + whenever a stack frame is allocated. This option is enabled by + default and can be disabled with '-mno-linked-fp'. + +'-mlong-calls' + + Use indirect addressing to call functions outside the current + compilation unit. This allows the functions to be placed anywhere + within the 32-bit address space. + +'-malign-labels' + + Try to align labels to an 8-byte boundary by inserting NOPs into + the previous packet. This option only has an effect when VLIW + packing is enabled. It doesn't create new packets; it merely adds + NOPs to existing ones. + +'-mlibrary-pic' + + Generate position-independent EABI code. + +'-macc-4' + + Use only the first four media accumulator registers. + +'-macc-8' + + Use all eight media accumulator registers. + +'-mpack' + + Pack VLIW instructions. + +'-mno-pack' + + Do not pack VLIW instructions. + +'-mno-eflags' + + Do not mark ABI switches in e_flags. + +'-mcond-move' + + Enable the use of conditional-move instructions (default). + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mno-cond-move' + + Disable the use of conditional-move instructions. + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mscc' + + Enable the use of conditional set instructions (default). + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mno-scc' + + Disable the use of conditional set instructions. + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mcond-exec' + + Enable the use of conditional execution (default). + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mno-cond-exec' + + Disable the use of conditional execution. + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mvliw-branch' + + Run a pass to pack branches into VLIW instructions (default). + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mno-vliw-branch' + + Do not run a pass to pack branches into VLIW instructions. + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mmulti-cond-exec' + + Enable optimization of '&&' and '||' in conditional execution + (default). + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mno-multi-cond-exec' + + Disable optimization of '&&' and '||' in conditional execution. + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mnested-cond-exec' + + Enable nested conditional execution optimizations (default). + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-mno-nested-cond-exec' + + Disable nested conditional execution optimizations. + + This switch is mainly for debugging the compiler and will likely be + removed in a future version. + +'-moptimize-membar' + + This switch removes redundant 'membar' instructions from the + compiler-generated code. It is enabled by default. + +'-mno-optimize-membar' + + This switch disables the automatic removal of redundant 'membar' + instructions from the generated code. + +'-mtomcat-stats' + + Cause gas to print out tomcat statistics. + +'-mcpu=CPU' + + Select the processor type for which to generate code. Possible + values are 'frv', 'fr550', 'tomcat', 'fr500', 'fr450', 'fr405', + 'fr400', 'fr300' and 'simple'. + + +File: gcc.info, Node: GNU/Linux Options, Next: H8/300 Options, Prev: FRV Options, Up: Submodel Options + +3.17.14 GNU/Linux Options +------------------------- + +These '-m' options are defined for GNU/Linux targets: + +'-mglibc' + Use the GNU C library. This is the default except on + '*-*-linux-*uclibc*' and '*-*-linux-*android*' targets. + +'-muclibc' + Use uClibc C library. This is the default on '*-*-linux-*uclibc*' + targets. + +'-mbionic' + Use Bionic C library. This is the default on '*-*-linux-*android*' + targets. + +'-mandroid' + Compile code compatible with Android platform. This is the default + on '*-*-linux-*android*' targets. + + When compiling, this option enables '-mbionic', '-fPIC', + '-fno-exceptions' and '-fno-rtti' by default. When linking, this + option makes the GCC driver pass Android-specific options to the + linker. Finally, this option causes the preprocessor macro + '__ANDROID__' to be defined. + +'-tno-android-cc' + Disable compilation effects of '-mandroid', i.e., do not enable + '-mbionic', '-fPIC', '-fno-exceptions' and '-fno-rtti' by default. + +'-tno-android-ld' + Disable linking effects of '-mandroid', i.e., pass standard Linux + linking options to the linker. + + +File: gcc.info, Node: H8/300 Options, Next: HPPA Options, Prev: GNU/Linux Options, Up: Submodel Options + +3.17.15 H8/300 Options +---------------------- + +These '-m' options are defined for the H8/300 implementations: + +'-mrelax' + Shorten some address references at link time, when possible; uses + the linker option '-relax'. *Note 'ld' and the H8/300: (ld)H8/300, + for a fuller description. + +'-mh' + Generate code for the H8/300H. + +'-ms' + Generate code for the H8S. + +'-mn' + Generate code for the H8S and H8/300H in the normal mode. This + switch must be used either with '-mh' or '-ms'. + +'-ms2600' + Generate code for the H8S/2600. This switch must be used with + '-ms'. + +'-mexr' + Extended registers are stored on stack before execution of function + with monitor attribute. Default option is '-mexr'. This option is + valid only for H8S targets. + +'-mno-exr' + Extended registers are not stored on stack before execution of + function with monitor attribute. Default option is '-mno-exr'. + This option is valid only for H8S targets. + +'-mint32' + Make 'int' data 32 bits by default. + +'-malign-300' + On the H8/300H and H8S, use the same alignment rules as for the + H8/300. The default for the H8/300H and H8S is to align longs and + floats on 4-byte boundaries. '-malign-300' causes them to be + aligned on 2-byte boundaries. This option has no effect on the + H8/300. + + +File: gcc.info, Node: HPPA Options, Next: i386 and x86-64 Options, Prev: H8/300 Options, Up: Submodel Options + +3.17.16 HPPA Options +-------------------- + +These '-m' options are defined for the HPPA family of computers: + +'-march=ARCHITECTURE-TYPE' + Generate code for the specified architecture. The choices for + ARCHITECTURE-TYPE are '1.0' for PA 1.0, '1.1' for PA 1.1, and '2.0' + for PA 2.0 processors. Refer to '/usr/lib/sched.models' on an + HP-UX system to determine the proper architecture option for your + machine. Code compiled for lower numbered architectures runs on + higher numbered architectures, but not the other way around. + +'-mpa-risc-1-0' +'-mpa-risc-1-1' +'-mpa-risc-2-0' + Synonyms for '-march=1.0', '-march=1.1', and '-march=2.0' + respectively. + +'-mjump-in-delay' + Fill delay slots of function calls with unconditional jump + instructions by modifying the return pointer for the function call + to be the target of the conditional jump. + +'-mdisable-fpregs' + Prevent floating-point registers from being used in any manner. + This is necessary for compiling kernels that perform lazy context + switching of floating-point registers. If you use this option and + attempt to perform floating-point operations, the compiler aborts. + +'-mdisable-indexing' + Prevent the compiler from using indexing address modes. This + avoids some rather obscure problems when compiling MIG generated + code under MACH. + +'-mno-space-regs' + Generate code that assumes the target has no space registers. This + allows GCC to generate faster indirect calls and use unscaled index + address modes. + + Such code is suitable for level 0 PA systems and kernels. + +'-mfast-indirect-calls' + Generate code that assumes calls never cross space boundaries. + This allows GCC to emit code that performs faster indirect calls. + + This option does not work in the presence of shared libraries or + nested functions. + +'-mfixed-range=REGISTER-RANGE' + Generate code treating the given register range as fixed registers. + A fixed register is one that the register allocator cannot use. + This is useful when compiling kernel code. A register range is + specified as two registers separated by a dash. Multiple register + ranges can be specified separated by a comma. + +'-mlong-load-store' + Generate 3-instruction load and store sequences as sometimes + required by the HP-UX 10 linker. This is equivalent to the '+k' + option to the HP compilers. + +'-mportable-runtime' + Use the portable calling conventions proposed by HP for ELF + systems. + +'-mgas' + Enable the use of assembler directives only GAS understands. + +'-mschedule=CPU-TYPE' + Schedule code according to the constraints for the machine type + CPU-TYPE. The choices for CPU-TYPE are '700' '7100', '7100LC', + '7200', '7300' and '8000'. Refer to '/usr/lib/sched.models' on an + HP-UX system to determine the proper scheduling option for your + machine. The default scheduling is '8000'. + +'-mlinker-opt' + Enable the optimization pass in the HP-UX linker. Note this makes + symbolic debugging impossible. It also triggers a bug in the HP-UX + 8 and HP-UX 9 linkers in which they give bogus error messages when + linking some programs. + +'-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not available for all HPPA + targets. Normally the facilities of the machine's usual C compiler + are used, but this cannot be done directly in cross-compilation. + You must make your own arrangements to provide suitable library + functions for cross-compilation. + + '-msoft-float' changes the calling convention in the output file; + therefore, it is only useful if you compile _all_ of a program with + this option. In particular, you need to compile 'libgcc.a', the + library that comes with GCC, with '-msoft-float' in order for this + to work. + +'-msio' + Generate the predefine, '_SIO', for server IO. The default is + '-mwsio'. This generates the predefines, '__hp9000s700', + '__hp9000s700__' and '_WSIO', for workstation IO. These options + are available under HP-UX and HI-UX. + +'-mgnu-ld' + Use options specific to GNU 'ld'. This passes '-shared' to 'ld' + when building a shared library. It is the default when GCC is + configured, explicitly or implicitly, with the GNU linker. This + option does not affect which 'ld' is called; it only changes what + parameters are passed to that 'ld'. The 'ld' that is called is + determined by the '--with-ld' configure option, GCC's program + search path, and finally by the user's 'PATH'. The linker used by + GCC can be printed using 'which `gcc -print-prog-name=ld`'. This + option is only available on the 64-bit HP-UX GCC, i.e. configured + with 'hppa*64*-*-hpux*'. + +'-mhp-ld' + Use options specific to HP 'ld'. This passes '-b' to 'ld' when + building a shared library and passes '+Accept TypeMismatch' to 'ld' + on all links. It is the default when GCC is configured, explicitly + or implicitly, with the HP linker. This option does not affect + which 'ld' is called; it only changes what parameters are passed to + that 'ld'. The 'ld' that is called is determined by the + '--with-ld' configure option, GCC's program search path, and + finally by the user's 'PATH'. The linker used by GCC can be + printed using 'which `gcc -print-prog-name=ld`'. This option is + only available on the 64-bit HP-UX GCC, i.e. configured with + 'hppa*64*-*-hpux*'. + +'-mlong-calls' + Generate code that uses long call sequences. This ensures that a + call is always able to reach linker generated stubs. The default + is to generate long calls only when the distance from the call site + to the beginning of the function or translation unit, as the case + may be, exceeds a predefined limit set by the branch type being + used. The limits for normal calls are 7,600,000 and 240,000 bytes, + respectively for the PA 2.0 and PA 1.X architectures. Sibcalls are + always limited at 240,000 bytes. + + Distances are measured from the beginning of functions when using + the '-ffunction-sections' option, or when using the '-mgas' and + '-mno-portable-runtime' options together under HP-UX with the SOM + linker. + + It is normally not desirable to use this option as it degrades + performance. However, it may be useful in large applications, + particularly when partial linking is used to build the application. + + The types of long calls used depends on the capabilities of the + assembler and linker, and the type of code being generated. The + impact on systems that support long absolute calls, and long pic + symbol-difference or pc-relative calls should be relatively small. + However, an indirect call is used on 32-bit ELF systems in pic code + and it is quite long. + +'-munix=UNIX-STD' + Generate compiler predefines and select a startfile for the + specified UNIX standard. The choices for UNIX-STD are '93', '95' + and '98'. '93' is supported on all HP-UX versions. '95' is + available on HP-UX 10.10 and later. '98' is available on HP-UX + 11.11 and later. The default values are '93' for HP-UX 10.00, '95' + for HP-UX 10.10 though to 11.00, and '98' for HP-UX 11.11 and + later. + + '-munix=93' provides the same predefines as GCC 3.3 and 3.4. + '-munix=95' provides additional predefines for 'XOPEN_UNIX' and + '_XOPEN_SOURCE_EXTENDED', and the startfile 'unix95.o'. + '-munix=98' provides additional predefines for '_XOPEN_UNIX', + '_XOPEN_SOURCE_EXTENDED', '_INCLUDE__STDC_A1_SOURCE' and + '_INCLUDE_XOPEN_SOURCE_500', and the startfile 'unix98.o'. + + It is _important_ to note that this option changes the interfaces + for various library routines. It also affects the operational + behavior of the C library. Thus, _extreme_ care is needed in using + this option. + + Library code that is intended to operate with more than one UNIX + standard must test, set and restore the variable + __XPG4_EXTENDED_MASK as appropriate. Most GNU software doesn't + provide this capability. + +'-nolibdld' + Suppress the generation of link options to search libdld.sl when + the '-static' option is specified on HP-UX 10 and later. + +'-static' + The HP-UX implementation of setlocale in libc has a dependency on + libdld.sl. There isn't an archive version of libdld.sl. Thus, + when the '-static' option is specified, special link options are + needed to resolve this dependency. + + On HP-UX 10 and later, the GCC driver adds the necessary options to + link with libdld.sl when the '-static' option is specified. This + causes the resulting binary to be dynamic. On the 64-bit port, the + linkers generate dynamic binaries by default in any case. The + '-nolibdld' option can be used to prevent the GCC driver from + adding these link options. + +'-threads' + Add support for multithreading with the "dce thread" library under + HP-UX. This option sets flags for both the preprocessor and + linker. + + +File: gcc.info, Node: i386 and x86-64 Options, Next: i386 and x86-64 Windows Options, Prev: HPPA Options, Up: Submodel Options + +3.17.17 Intel 386 and AMD x86-64 Options +---------------------------------------- + +These '-m' options are defined for the i386 and x86-64 family of +computers: + +'-march=CPU-TYPE' + Generate instructions for the machine type CPU-TYPE. In contrast + to '-mtune=CPU-TYPE', which merely tunes the generated code for the + specified CPU-TYPE, '-march=CPU-TYPE' allows GCC to generate code + that may not run at all on processors other than the one indicated. + Specifying '-march=CPU-TYPE' implies '-mtune=CPU-TYPE'. + + The choices for CPU-TYPE are: + + 'native' + This selects the CPU to generate code for at compilation time + by determining the processor type of the compiling machine. + Using '-march=native' enables all instruction subsets + supported by the local machine (hence the result might not run + on different machines). Using '-mtune=native' produces code + optimized for the local machine under the constraints of the + selected instruction set. + + 'i386' + Original Intel i386 CPU. + + 'i486' + Intel i486 CPU. (No scheduling is implemented for this chip.) + + 'i586' + 'pentium' + Intel Pentium CPU with no MMX support. + + 'pentium-mmx' + Intel Pentium MMX CPU, based on Pentium core with MMX + instruction set support. + + 'pentiumpro' + Intel Pentium Pro CPU. + + 'i686' + When used with '-march', the Pentium Pro instruction set is + used, so the code runs on all i686 family chips. When used + with '-mtune', it has the same meaning as 'generic'. + + 'pentium2' + Intel Pentium II CPU, based on Pentium Pro core with MMX + instruction set support. + + 'pentium3' + 'pentium3m' + Intel Pentium III CPU, based on Pentium Pro core with MMX and + SSE instruction set support. + + 'pentium-m' + Intel Pentium M; low-power version of Intel Pentium III CPU + with MMX, SSE and SSE2 instruction set support. Used by + Centrino notebooks. + + 'pentium4' + 'pentium4m' + Intel Pentium 4 CPU with MMX, SSE and SSE2 instruction set + support. + + 'prescott' + Improved version of Intel Pentium 4 CPU with MMX, SSE, SSE2 + and SSE3 instruction set support. + + 'nocona' + Improved version of Intel Pentium 4 CPU with 64-bit + extensions, MMX, SSE, SSE2 and SSE3 instruction set support. + + 'core2' + Intel Core 2 CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3 + and SSSE3 instruction set support. + + 'nehalem' + Intel Nehalem CPU with 64-bit extensions, MMX, SSE, SSE2, + SSE3, SSSE3, SSE4.1, SSE4.2 and POPCNT instruction set + support. + + 'westmere' + Intel Westmere CPU with 64-bit extensions, MMX, SSE, SSE2, + SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES and PCLMUL + instruction set support. + + 'sandybridge' + Intel Sandy Bridge CPU with 64-bit extensions, MMX, SSE, SSE2, + SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES and PCLMUL + instruction set support. + + 'ivybridge' + Intel Ivy Bridge CPU with 64-bit extensions, MMX, SSE, SSE2, + SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AES, PCLMUL, + FSGSBASE, RDRND and F16C instruction set support. + + 'haswell' + Intel Haswell CPU with 64-bit extensions, MOVBE, MMX, SSE, + SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, + PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2 and F16C instruction + set support. + + 'broadwell' + Intel Broadwell CPU with 64-bit extensions, MOVBE, MMX, SSE, + SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AVX, AVX2, AES, + PCLMUL, FSGSBASE, RDRND, FMA, BMI, BMI2, F16C, RDSEED, ADCX + and PREFETCHW instruction set support. + + 'bonnell' + Intel Bonnell CPU with 64-bit extensions, MOVBE, MMX, SSE, + SSE2, SSE3 and SSSE3 instruction set support. + + 'silvermont' + Intel Silvermont CPU with 64-bit extensions, MOVBE, MMX, SSE, + SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, POPCNT, AES, PCLMUL and + RDRND instruction set support. + + 'k6' + AMD K6 CPU with MMX instruction set support. + + 'k6-2' + 'k6-3' + Improved versions of AMD K6 CPU with MMX and 3DNow! + instruction set support. + + 'athlon' + 'athlon-tbird' + AMD Athlon CPU with MMX, 3dNOW!, enhanced 3DNow! and SSE + prefetch instructions support. + + 'athlon-4' + 'athlon-xp' + 'athlon-mp' + Improved AMD Athlon CPU with MMX, 3DNow!, enhanced 3DNow! and + full SSE instruction set support. + + 'k8' + 'opteron' + 'athlon64' + 'athlon-fx' + Processors based on the AMD K8 core with x86-64 instruction + set support, including the AMD Opteron, Athlon 64, and Athlon + 64 FX processors. (This supersets MMX, SSE, SSE2, 3DNow!, + enhanced 3DNow! and 64-bit instruction set extensions.) + + 'k8-sse3' + 'opteron-sse3' + 'athlon64-sse3' + Improved versions of AMD K8 cores with SSE3 instruction set + support. + + 'amdfam10' + 'barcelona' + CPUs based on AMD Family 10h cores with x86-64 instruction set + support. (This supersets MMX, SSE, SSE2, SSE3, SSE4A, 3DNow!, + enhanced 3DNow!, ABM and 64-bit instruction set extensions.) + + 'bdver1' + CPUs based on AMD Family 15h cores with x86-64 instruction set + support. (This supersets FMA4, AVX, XOP, LWP, AES, PCL_MUL, + CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM + and 64-bit instruction set extensions.) + 'bdver2' + AMD Family 15h core based CPUs with x86-64 instruction set + support. (This supersets BMI, TBM, F16C, FMA, FMA4, AVX, XOP, + LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, SSE4A, SSSE3, + SSE4.1, SSE4.2, ABM and 64-bit instruction set extensions.) + 'bdver3' + AMD Family 15h core based CPUs with x86-64 instruction set + support. (This supersets BMI, TBM, F16C, FMA, FMA4, FSGSBASE, + AVX, XOP, LWP, AES, PCL_MUL, CX16, MMX, SSE, SSE2, SSE3, + SSE4A, SSSE3, SSE4.1, SSE4.2, ABM and 64-bit instruction set + extensions. + 'bdver4' + AMD Family 15h core based CPUs with x86-64 instruction set + support. (This supersets BMI, BMI2, TBM, F16C, FMA, FMA4, + FSGSBASE, AVX, AVX2, XOP, LWP, AES, PCL_MUL, CX16, MOVBE, MMX, + SSE, SSE2, SSE3, SSE4A, SSSE3, SSE4.1, SSE4.2, ABM and 64-bit + instruction set extensions. + + 'btver1' + CPUs based on AMD Family 14h cores with x86-64 instruction set + support. (This supersets MMX, SSE, SSE2, SSE3, SSSE3, SSE4A, + CX16, ABM and 64-bit instruction set extensions.) + + 'btver2' + CPUs based on AMD Family 16h cores with x86-64 instruction set + support. This includes MOVBE, F16C, BMI, AVX, PCL_MUL, AES, + SSE4.2, SSE4.1, CX16, ABM, SSE4A, SSSE3, SSE3, SSE2, SSE, MMX + and 64-bit instruction set extensions. + + 'winchip-c6' + IDT WinChip C6 CPU, dealt in same way as i486 with additional + MMX instruction set support. + + 'winchip2' + IDT WinChip 2 CPU, dealt in same way as i486 with additional + MMX and 3DNow! instruction set support. + + 'c3' + VIA C3 CPU with MMX and 3DNow! instruction set support. (No + scheduling is implemented for this chip.) + + 'c3-2' + VIA C3-2 (Nehemiah/C5XL) CPU with MMX and SSE instruction set + support. (No scheduling is implemented for this chip.) + + 'geode' + AMD Geode embedded processor with MMX and 3DNow! instruction + set support. + +'-mtune=CPU-TYPE' + Tune to CPU-TYPE everything applicable about the generated code, + except for the ABI and the set of available instructions. While + picking a specific CPU-TYPE schedules things appropriately for that + particular chip, the compiler does not generate any code that + cannot run on the default machine type unless you use a + '-march=CPU-TYPE' option. For example, if GCC is configured for + i686-pc-linux-gnu then '-mtune=pentium4' generates code that is + tuned for Pentium 4 but still runs on i686 machines. + + The choices for CPU-TYPE are the same as for '-march'. In + addition, '-mtune' supports 2 extra choices for CPU-TYPE: + + 'generic' + Produce code optimized for the most common IA32/AMD64/EM64T + processors. If you know the CPU on which your code will run, + then you should use the corresponding '-mtune' or '-march' + option instead of '-mtune=generic'. But, if you do not know + exactly what CPU users of your application will have, then you + should use this option. + + As new processors are deployed in the marketplace, the + behavior of this option will change. Therefore, if you + upgrade to a newer version of GCC, code generation controlled + by this option will change to reflect the processors that are + most common at the time that version of GCC is released. + + There is no '-march=generic' option because '-march' indicates + the instruction set the compiler can use, and there is no + generic instruction set applicable to all processors. In + contrast, '-mtune' indicates the processor (or, in this case, + collection of processors) for which the code is optimized. + + 'intel' + Produce code optimized for the most current Intel processors, + which are Haswell and Silvermont for this version of GCC. If + you know the CPU on which your code will run, then you should + use the corresponding '-mtune' or '-march' option instead of + '-mtune=intel'. But, if you want your application performs + better on both Haswell and Silvermont, then you should use + this option. + + As new Intel processors are deployed in the marketplace, the + behavior of this option will change. Therefore, if you + upgrade to a newer version of GCC, code generation controlled + by this option will change to reflect the most current Intel + processors at the time that version of GCC is released. + + There is no '-march=intel' option because '-march' indicates + the instruction set the compiler can use, and there is no + common instruction set applicable to all processors. In + contrast, '-mtune' indicates the processor (or, in this case, + collection of processors) for which the code is optimized. + +'-mcpu=CPU-TYPE' + A deprecated synonym for '-mtune'. + +'-mfpmath=UNIT' + Generate floating-point arithmetic for selected unit UNIT. The + choices for UNIT are: + + '387' + Use the standard 387 floating-point coprocessor present on the + majority of chips and emulated otherwise. Code compiled with + this option runs almost everywhere. The temporary results are + computed in 80-bit precision instead of the precision + specified by the type, resulting in slightly different results + compared to most of other chips. See '-ffloat-store' for more + detailed description. + + This is the default choice for i386 compiler. + + 'sse' + Use scalar floating-point instructions present in the SSE + instruction set. This instruction set is supported by Pentium + III and newer chips, and in the AMD line by Athlon-4, Athlon + XP and Athlon MP chips. The earlier version of the SSE + instruction set supports only single-precision arithmetic, + thus the double and extended-precision arithmetic are still + done using 387. A later version, present only in Pentium 4 + and AMD x86-64 chips, supports double-precision arithmetic + too. + + For the i386 compiler, you must use '-march=CPU-TYPE', '-msse' + or '-msse2' switches to enable SSE extensions and make this + option effective. For the x86-64 compiler, these extensions + are enabled by default. + + The resulting code should be considerably faster in the + majority of cases and avoid the numerical instability problems + of 387 code, but may break some existing code that expects + temporaries to be 80 bits. + + This is the default choice for the x86-64 compiler. + + 'sse,387' + 'sse+387' + 'both' + Attempt to utilize both instruction sets at once. This + effectively doubles the amount of available registers, and on + chips with separate execution units for 387 and SSE the + execution resources too. Use this option with care, as it is + still experimental, because the GCC register allocator does + not model separate functional units well, resulting in + unstable performance. + +'-masm=DIALECT' + Output assembly instructions using selected DIALECT. Supported + choices are 'intel' or 'att' (the default). Darwin does not + support 'intel'. + +'-mieee-fp' +'-mno-ieee-fp' + Control whether or not the compiler uses IEEE floating-point + comparisons. These correctly handle the case where the result of a + comparison is unordered. + +'-msoft-float' + Generate output containing library calls for floating point. + + *Warning:* the requisite libraries are not part of GCC. Normally + the facilities of the machine's usual C compiler are used, but this + can't be done directly in cross-compilation. You must make your + own arrangements to provide suitable library functions for + cross-compilation. + + On machines where a function returns floating-point results in the + 80387 register stack, some floating-point opcodes may be emitted + even if '-msoft-float' is used. + +'-mno-fp-ret-in-387' + Do not use the FPU registers for return values of functions. + + The usual calling convention has functions return values of types + 'float' and 'double' in an FPU register, even if there is no FPU. + The idea is that the operating system should emulate an FPU. + + The option '-mno-fp-ret-in-387' causes such values to be returned + in ordinary CPU registers instead. + +'-mno-fancy-math-387' + Some 387 emulators do not support the 'sin', 'cos' and 'sqrt' + instructions for the 387. Specify this option to avoid generating + those instructions. This option is the default on FreeBSD, OpenBSD + and NetBSD. This option is overridden when '-march' indicates that + the target CPU always has an FPU and so the instruction does not + need emulation. These instructions are not generated unless you + also use the '-funsafe-math-optimizations' switch. + +'-malign-double' +'-mno-align-double' + Control whether GCC aligns 'double', 'long double', and 'long long' + variables on a two-word boundary or a one-word boundary. Aligning + 'double' variables on a two-word boundary produces code that runs + somewhat faster on a Pentium at the expense of more memory. + + On x86-64, '-malign-double' is enabled by default. + + *Warning:* if you use the '-malign-double' switch, structures + containing the above types are aligned differently than the + published application binary interface specifications for the 386 + and are not binary compatible with structures in code compiled + without that switch. + +'-m96bit-long-double' +'-m128bit-long-double' + These switches control the size of 'long double' type. The i386 + application binary interface specifies the size to be 96 bits, so + '-m96bit-long-double' is the default in 32-bit mode. + + Modern architectures (Pentium and newer) prefer 'long double' to be + aligned to an 8- or 16-byte boundary. In arrays or structures + conforming to the ABI, this is not possible. So specifying + '-m128bit-long-double' aligns 'long double' to a 16-byte boundary + by padding the 'long double' with an additional 32-bit zero. + + In the x86-64 compiler, '-m128bit-long-double' is the default + choice as its ABI specifies that 'long double' is aligned on + 16-byte boundary. + + Notice that neither of these options enable any extra precision + over the x87 standard of 80 bits for a 'long double'. + + *Warning:* if you override the default value for your target ABI, + this changes the size of structures and arrays containing 'long + double' variables, as well as modifying the function calling + convention for functions taking 'long double'. Hence they are not + binary-compatible with code compiled without that switch. + +'-mlong-double-64' +'-mlong-double-80' +'-mlong-double-128' + These switches control the size of 'long double' type. A size of + 64 bits makes the 'long double' type equivalent to the 'double' + type. This is the default for 32-bit Bionic C library. A size of + 128 bits makes the 'long double' type equivalent to the + '__float128' type. This is the default for 64-bit Bionic C + library. + + *Warning:* if you override the default value for your target ABI, + this changes the size of structures and arrays containing 'long + double' variables, as well as modifying the function calling + convention for functions taking 'long double'. Hence they are not + binary-compatible with code compiled without that switch. + +'-mlarge-data-threshold=THRESHOLD' + When '-mcmodel=medium' is specified, data objects larger than + THRESHOLD are placed in the large data section. This value must be + the same across all objects linked into the binary, and defaults to + 65535. + +'-mrtd' + Use a different function-calling convention, in which functions + that take a fixed number of arguments return with the 'ret NUM' + instruction, which pops their arguments while returning. This + saves one instruction in the caller since there is no need to pop + the arguments there. + + You can specify that an individual function is called with this + calling sequence with the function attribute 'stdcall'. You can + also override the '-mrtd' option by using the function attribute + 'cdecl'. *Note Function Attributes::. + + *Warning:* this calling convention is incompatible with the one + normally used on Unix, so you cannot use it if you need to call + libraries compiled with the Unix compiler. + + Also, you must provide function prototypes for all functions that + take variable numbers of arguments (including 'printf'); otherwise + incorrect code is generated for calls to those functions. + + In addition, seriously incorrect code results if you call a + function with too many arguments. (Normally, extra arguments are + harmlessly ignored.) + +'-mregparm=NUM' + Control how many registers are used to pass integer arguments. By + default, no registers are used to pass arguments, and at most 3 + registers can be used. You can control this behavior for a + specific function by using the function attribute 'regparm'. *Note + Function Attributes::. + + *Warning:* if you use this switch, and NUM is nonzero, then you + must build all modules with the same value, including any + libraries. This includes the system libraries and startup modules. + +'-msseregparm' + Use SSE register passing conventions for float and double arguments + and return values. You can control this behavior for a specific + function by using the function attribute 'sseregparm'. *Note + Function Attributes::. + + *Warning:* if you use this switch then you must build all modules + with the same value, including any libraries. This includes the + system libraries and startup modules. + +'-mvect8-ret-in-mem' + Return 8-byte vectors in memory instead of MMX registers. This is + the default on Solaris 8 and 9 and VxWorks to match the ABI of the + Sun Studio compilers until version 12. Later compiler versions + (starting with Studio 12 Update 1) follow the ABI used by other x86 + targets, which is the default on Solaris 10 and later. _Only_ use + this option if you need to remain compatible with existing code + produced by those previous compiler versions or older versions of + GCC. + +'-mpc32' +'-mpc64' +'-mpc80' + + Set 80387 floating-point precision to 32, 64 or 80 bits. When + '-mpc32' is specified, the significands of results of + floating-point operations are rounded to 24 bits (single + precision); '-mpc64' rounds the significands of results of + floating-point operations to 53 bits (double precision) and + '-mpc80' rounds the significands of results of floating-point + operations to 64 bits (extended double precision), which is the + default. When this option is used, floating-point operations in + higher precisions are not available to the programmer without + setting the FPU control word explicitly. + + Setting the rounding of floating-point operations to less than the + default 80 bits can speed some programs by 2% or more. Note that + some mathematical libraries assume that extended-precision (80-bit) + floating-point operations are enabled by default; routines in such + libraries could suffer significant loss of accuracy, typically + through so-called "catastrophic cancellation", when this option is + used to set the precision to less than extended precision. + +'-mstackrealign' + Realign the stack at entry. On the Intel x86, the '-mstackrealign' + option generates an alternate prologue and epilogue that realigns + the run-time stack if necessary. This supports mixing legacy codes + that keep 4-byte stack alignment with modern codes that keep + 16-byte stack alignment for SSE compatibility. See also the + attribute 'force_align_arg_pointer', applicable to individual + functions. + +'-mpreferred-stack-boundary=NUM' + Attempt to keep the stack boundary aligned to a 2 raised to NUM + byte boundary. If '-mpreferred-stack-boundary' is not specified, + the default is 4 (16 bytes or 128 bits). + + *Warning:* When generating code for the x86-64 architecture with + SSE extensions disabled, '-mpreferred-stack-boundary=3' can be used + to keep the stack boundary aligned to 8 byte boundary. Since + x86-64 ABI require 16 byte stack alignment, this is ABI + incompatible and intended to be used in controlled environment + where stack space is important limitation. This option will lead + to wrong code when functions compiled with 16 byte stack alignment + (such as functions from a standard library) are called with + misaligned stack. In this case, SSE instructions may lead to + misaligned memory access traps. In addition, variable arguments + will be handled incorrectly for 16 byte aligned objects (including + x87 long double and __int128), leading to wrong results. You must + build all modules with '-mpreferred-stack-boundary=3', including + any libraries. This includes the system libraries and startup + modules. + +'-mincoming-stack-boundary=NUM' + Assume the incoming stack is aligned to a 2 raised to NUM byte + boundary. If '-mincoming-stack-boundary' is not specified, the one + specified by '-mpreferred-stack-boundary' is used. + + On Pentium and Pentium Pro, 'double' and 'long double' values + should be aligned to an 8-byte boundary (see '-malign-double') or + suffer significant run time performance penalties. On Pentium III, + the Streaming SIMD Extension (SSE) data type '__m128' may not work + properly if it is not 16-byte aligned. + + To ensure proper alignment of this values on the stack, the stack + boundary must be as aligned as that required by any value stored on + the stack. Further, every function must be generated such that it + keeps the stack aligned. Thus calling a function compiled with a + higher preferred stack boundary from a function compiled with a + lower preferred stack boundary most likely misaligns the stack. It + is recommended that libraries that use callbacks always use the + default setting. + + This extra alignment does consume extra stack space, and generally + increases code size. Code that is sensitive to stack space usage, + such as embedded systems and operating system kernels, may want to + reduce the preferred alignment to '-mpreferred-stack-boundary=2'. + +'-mmmx' +'-mno-mmx' +'-msse' +'-mno-sse' +'-msse2' +'-mno-sse2' +'-msse3' +'-mno-sse3' +'-mssse3' +'-mno-ssse3' +'-msse4.1' +'-mno-sse4.1' +'-msse4.2' +'-mno-sse4.2' +'-msse4' +'-mno-sse4' +'-mavx' +'-mno-avx' +'-mavx2' +'-mno-avx2' +'-mavx512f' +'-mno-avx512f' +'-mavx512pf' +'-mno-avx512pf' +'-mavx512er' +'-mno-avx512er' +'-mavx512cd' +'-mno-avx512cd' +'-msha' +'-mno-sha' +'-maes' +'-mno-aes' +'-mpclmul' +'-mno-pclmul' +'-mfsgsbase' +'-mno-fsgsbase' +'-mrdrnd' +'-mno-rdrnd' +'-mf16c' +'-mno-f16c' +'-mfma' +'-mno-fma' +'-mprefetchwt1' +'-mno-prefetchwt1' +'-msse4a' +'-mno-sse4a' +'-mfma4' +'-mno-fma4' +'-mxop' +'-mno-xop' +'-mlwp' +'-mno-lwp' +'-m3dnow' +'-mno-3dnow' +'-mpopcnt' +'-mno-popcnt' +'-mabm' +'-mno-abm' +'-mbmi' +'-mbmi2' +'-mno-bmi' +'-mno-bmi2' +'-mlzcnt' +'-mno-lzcnt' +'-mfxsr' +'-mxsave' +'-mxsaveopt' +'-mrtm' +'-mtbm' +'-mno-tbm' + These switches enable or disable the use of instructions in the + MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AVX512F, AVX512PF, + AVX512ER, AVX512CD, SHA, AES, PCLMUL, FSGSBASE, RDRND, F16C, FMA, + SSE4A, FMA4, XOP, LWP, ABM, BMI, BMI2, FXSR, XSAVE, XSAVEOPT, + LZCNT, RTM, or 3DNow! extended instruction sets. These extensions + are also available as built-in functions: see *note X86 Built-in + Functions::, for details of the functions enabled and disabled by + these switches. + + To generate SSE/SSE2 instructions automatically from floating-point + code (as opposed to 387 instructions), see '-mfpmath=sse'. + + GCC depresses SSEx instructions when '-mavx' is used. Instead, it + generates new AVX instructions or AVX equivalence for all SSEx + instructions when needed. + + These options enable GCC to use these extended instructions in + generated code, even without '-mfpmath=sse'. Applications that + perform run-time CPU detection must compile separate files for each + supported architecture, using the appropriate flags. In + particular, the file containing the CPU detection code should be + compiled without these options. + +'-mdump-tune-features' + This option instructs GCC to dump the names of the x86 performance + tuning features and default settings. The names can be used in + '-mtune-ctrl=FEATURE-LIST'. + +'-mtune-ctrl=FEATURE-LIST' + This option is used to do fine grain control of x86 code generation + features. FEATURE-LIST is a comma separated list of FEATURE names. + See also '-mdump-tune-features'. When specified, the FEATURE will + be turned on if it is not preceded with '^', otherwise, it will be + turned off. '-mtune-ctrl=FEATURE-LIST' is intended to be used by + GCC developers. Using it may lead to code paths not covered by + testing and can potentially result in compiler ICEs or runtime + errors. + +'-mno-default' + This option instructs GCC to turn off all tunable features. See + also '-mtune-ctrl=FEATURE-LIST' and '-mdump-tune-features'. + +'-mcld' + This option instructs GCC to emit a 'cld' instruction in the + prologue of functions that use string instructions. String + instructions depend on the DF flag to select between autoincrement + or autodecrement mode. While the ABI specifies the DF flag to be + cleared on function entry, some operating systems violate this + specification by not clearing the DF flag in their exception + dispatchers. The exception handler can be invoked with the DF flag + set, which leads to wrong direction mode when string instructions + are used. This option can be enabled by default on 32-bit x86 + targets by configuring GCC with the '--enable-cld' configure + option. Generation of 'cld' instructions can be suppressed with + the '-mno-cld' compiler option in this case. + +'-mvzeroupper' + This option instructs GCC to emit a 'vzeroupper' instruction before + a transfer of control flow out of the function to minimize the AVX + to SSE transition penalty as well as remove unnecessary 'zeroupper' + intrinsics. + +'-mprefer-avx128' + This option instructs GCC to use 128-bit AVX instructions instead + of 256-bit AVX instructions in the auto-vectorizer. + +'-mcx16' + This option enables GCC to generate 'CMPXCHG16B' instructions. + 'CMPXCHG16B' allows for atomic operations on 128-bit double + quadword (or oword) data types. This is useful for high-resolution + counters that can be updated by multiple processors (or cores). + This instruction is generated as part of atomic built-in functions: + see *note __sync Builtins:: or *note __atomic Builtins:: for + details. + +'-msahf' + This option enables generation of 'SAHF' instructions in 64-bit + code. Early Intel Pentium 4 CPUs with Intel 64 support, prior to + the introduction of Pentium 4 G1 step in December 2005, lacked the + 'LAHF' and 'SAHF' instructions which were supported by AMD64. + These are load and store instructions, respectively, for certain + status flags. In 64-bit mode, the 'SAHF' instruction is used to + optimize 'fmod', 'drem', and 'remainder' built-in functions; see + *note Other Builtins:: for details. + +'-mmovbe' + This option enables use of the 'movbe' instruction to implement + '__builtin_bswap32' and '__builtin_bswap64'. + +'-mcrc32' + This option enables built-in functions '__builtin_ia32_crc32qi', + '__builtin_ia32_crc32hi', '__builtin_ia32_crc32si' and + '__builtin_ia32_crc32di' to generate the 'crc32' machine + instruction. + +'-mrecip' + This option enables use of 'RCPSS' and 'RSQRTSS' instructions (and + their vectorized variants 'RCPPS' and 'RSQRTPS') with an additional + Newton-Raphson step to increase precision instead of 'DIVSS' and + 'SQRTSS' (and their vectorized variants) for single-precision + floating-point arguments. These instructions are generated only + when '-funsafe-math-optimizations' is enabled together with + '-finite-math-only' and '-fno-trapping-math'. Note that while the + throughput of the sequence is higher than the throughput of the + non-reciprocal instruction, the precision of the sequence can be + decreased by up to 2 ulp (i.e. the inverse of 1.0 equals + 0.99999994). + + Note that GCC implements '1.0f/sqrtf(X)' in terms of 'RSQRTSS' (or + 'RSQRTPS') already with '-ffast-math' (or the above option + combination), and doesn't need '-mrecip'. + + Also note that GCC emits the above sequence with additional + Newton-Raphson step for vectorized single-float division and + vectorized 'sqrtf(X)' already with '-ffast-math' (or the above + option combination), and doesn't need '-mrecip'. + +'-mrecip=OPT' + This option controls which reciprocal estimate instructions may be + used. OPT is a comma-separated list of options, which may be + preceded by a '!' to invert the option: + + 'all' + Enable all estimate instructions. + + 'default' + Enable the default instructions, equivalent to '-mrecip'. + + 'none' + Disable all estimate instructions, equivalent to '-mno-recip'. + + 'div' + Enable the approximation for scalar division. + + 'vec-div' + Enable the approximation for vectorized division. + + 'sqrt' + Enable the approximation for scalar square root. + + 'vec-sqrt' + Enable the approximation for vectorized square root. + + So, for example, '-mrecip=all,!sqrt' enables all of the reciprocal + approximations, except for square root. + +'-mveclibabi=TYPE' + Specifies the ABI type to use for vectorizing intrinsics using an + external library. Supported values for TYPE are 'svml' for the + Intel short vector math library and 'acml' for the AMD math core + library. To use this option, both '-ftree-vectorize' and + '-funsafe-math-optimizations' have to be enabled, and an SVML or + ACML ABI-compatible library must be specified at link time. + + GCC currently emits calls to 'vmldExp2', 'vmldLn2', 'vmldLog102', + 'vmldLog102', 'vmldPow2', 'vmldTanh2', 'vmldTan2', 'vmldAtan2', + 'vmldAtanh2', 'vmldCbrt2', 'vmldSinh2', 'vmldSin2', 'vmldAsinh2', + 'vmldAsin2', 'vmldCosh2', 'vmldCos2', 'vmldAcosh2', 'vmldAcos2', + 'vmlsExp4', 'vmlsLn4', 'vmlsLog104', 'vmlsLog104', 'vmlsPow4', + 'vmlsTanh4', 'vmlsTan4', 'vmlsAtan4', 'vmlsAtanh4', 'vmlsCbrt4', + 'vmlsSinh4', 'vmlsSin4', 'vmlsAsinh4', 'vmlsAsin4', 'vmlsCosh4', + 'vmlsCos4', 'vmlsAcosh4' and 'vmlsAcos4' for corresponding function + type when '-mveclibabi=svml' is used, and '__vrd2_sin', + '__vrd2_cos', '__vrd2_exp', '__vrd2_log', '__vrd2_log2', + '__vrd2_log10', '__vrs4_sinf', '__vrs4_cosf', '__vrs4_expf', + '__vrs4_logf', '__vrs4_log2f', '__vrs4_log10f' and '__vrs4_powf' + for the corresponding function type when '-mveclibabi=acml' is + used. + +'-mabi=NAME' + Generate code for the specified calling convention. Permissible + values are 'sysv' for the ABI used on GNU/Linux and other systems, + and 'ms' for the Microsoft ABI. The default is to use the Microsoft + ABI when targeting Microsoft Windows and the SysV ABI on all other + systems. You can control this behavior for a specific function by + using the function attribute 'ms_abi'/'sysv_abi'. *Note Function + Attributes::. + +'-mtls-dialect=TYPE' + Generate code to access thread-local storage using the 'gnu' or + 'gnu2' conventions. 'gnu' is the conservative default; 'gnu2' is + more efficient, but it may add compile- and run-time requirements + that cannot be satisfied on all systems. + +'-mpush-args' +'-mno-push-args' + Use PUSH operations to store outgoing parameters. This method is + shorter and usually equally fast as method using SUB/MOV operations + and is enabled by default. In some cases disabling it may improve + performance because of improved scheduling and reduced + dependencies. + +'-maccumulate-outgoing-args' + If enabled, the maximum amount of space required for outgoing + arguments is computed in the function prologue. This is faster on + most modern CPUs because of reduced dependencies, improved + scheduling and reduced stack usage when the preferred stack + boundary is not equal to 2. The drawback is a notable increase in + code size. This switch implies '-mno-push-args'. + +'-mthreads' + Support thread-safe exception handling on MinGW. Programs that rely + on thread-safe exception handling must compile and link all code + with the '-mthreads' option. When compiling, '-mthreads' defines + '-D_MT'; when linking, it links in a special thread helper library + '-lmingwthrd' which cleans up per-thread exception-handling data. + +'-mno-align-stringops' + Do not align the destination of inlined string operations. This + switch reduces code size and improves performance in case the + destination is already aligned, but GCC doesn't know about it. + +'-minline-all-stringops' + By default GCC inlines string operations only when the destination + is known to be aligned to least a 4-byte boundary. This enables + more inlining and increases code size, but may improve performance + of code that depends on fast 'memcpy', 'strlen', and 'memset' for + short lengths. + +'-minline-stringops-dynamically' + For string operations of unknown size, use run-time checks with + inline code for small blocks and a library call for large blocks. + +'-mstringop-strategy=ALG' + Override the internal decision heuristic for the particular + algorithm to use for inlining string operations. The allowed + values for ALG are: + + 'rep_byte' + 'rep_4byte' + 'rep_8byte' + Expand using i386 'rep' prefix of the specified size. + + 'byte_loop' + 'loop' + 'unrolled_loop' + Expand into an inline loop. + + 'libcall' + Always use a library call. + +'-mmemcpy-strategy=STRATEGY' + Override the internal decision heuristic to decide if + '__builtin_memcpy' should be inlined and what inline algorithm to + use when the expected size of the copy operation is known. + STRATEGY is a comma-separated list of ALG:MAX_SIZE:DEST_ALIGN + triplets. ALG is specified in '-mstringop-strategy', MAX_SIZE + specifies the max byte size with which inline algorithm ALG is + allowed. For the last triplet, the MAX_SIZE must be '-1'. The + MAX_SIZE of the triplets in the list must be specified in + increasing order. The minimal byte size for ALG is '0' for the + first triplet and 'MAX_SIZE + 1' of the preceding range. + +'-mmemset-strategy=STRATEGY' + The option is similar to '-mmemcpy-strategy=' except that it is to + control '__builtin_memset' expansion. + +'-momit-leaf-frame-pointer' + Don't keep the frame pointer in a register for leaf functions. + This avoids the instructions to save, set up, and restore frame + pointers and makes an extra register available in leaf functions. + The option '-fomit-leaf-frame-pointer' removes the frame pointer + for leaf functions, which might make debugging harder. + +'-mtls-direct-seg-refs' +'-mno-tls-direct-seg-refs' + Controls whether TLS variables may be accessed with offsets from + the TLS segment register ('%gs' for 32-bit, '%fs' for 64-bit), or + whether the thread base pointer must be added. Whether or not this + is valid depends on the operating system, and whether it maps the + segment to cover the entire TLS area. + + For systems that use the GNU C Library, the default is on. + +'-msse2avx' +'-mno-sse2avx' + Specify that the assembler should encode SSE instructions with VEX + prefix. The option '-mavx' turns this on by default. + +'-mfentry' +'-mno-fentry' + If profiling is active ('-pg'), put the profiling counter call + before the prologue. Note: On x86 architectures the attribute + 'ms_hook_prologue' isn't possible at the moment for '-mfentry' and + '-pg'. + +'-m8bit-idiv' +'-mno-8bit-idiv' + On some processors, like Intel Atom, 8-bit unsigned integer divide + is much faster than 32-bit/64-bit integer divide. This option + generates a run-time check. If both dividend and divisor are + within range of 0 to 255, 8-bit unsigned integer divide is used + instead of 32-bit/64-bit integer divide. + +'-mavx256-split-unaligned-load' +'-mavx256-split-unaligned-store' + Split 32-byte AVX unaligned load and store. + +'-mstack-protector-guard=GUARD' + Generate stack protection code using canary at GUARD. Supported + locations are 'global' for global canary or 'tls' for per-thread + canary in the TLS block (the default). This option has effect only + when '-fstack-protector' or '-fstack-protector-all' is specified. + + These '-m' switches are supported in addition to the above on x86-64 +processors in 64-bit environments. + +'-m32' +'-m64' +'-mx32' +'-m16' + Generate code for a 16-bit, 32-bit or 64-bit environment. The + '-m32' option sets 'int', 'long', and pointer types to 32 bits, and + generates code that runs on any i386 system. + + The '-m64' option sets 'int' to 32 bits and 'long' and pointer + types to 64 bits, and generates code for the x86-64 architecture. + For Darwin only the '-m64' option also turns off the '-fno-pic' and + '-mdynamic-no-pic' options. + + The '-mx32' option sets 'int', 'long', and pointer types to 32 + bits, and generates code for the x86-64 architecture. + + The '-m16' option is the same as '-m32', except for that it outputs + the '.code16gcc' assembly directive at the beginning of the + assembly output so that the binary can run in 16-bit mode. + +'-mno-red-zone' + Do not use a so-called "red zone" for x86-64 code. The red zone is + mandated by the x86-64 ABI; it is a 128-byte area beyond the + location of the stack pointer that is not modified by signal or + interrupt handlers and therefore can be used for temporary data + without adjusting the stack pointer. The flag '-mno-red-zone' + disables this red zone. + +'-mcmodel=small' + Generate code for the small code model: the program and its symbols + must be linked in the lower 2 GB of the address space. Pointers + are 64 bits. Programs can be statically or dynamically linked. + This is the default code model. + +'-mcmodel=kernel' + Generate code for the kernel code model. The kernel runs in the + negative 2 GB of the address space. This model has to be used for + Linux kernel code. + +'-mcmodel=medium' + Generate code for the medium model: the program is linked in the + lower 2 GB of the address space. Small symbols are also placed + there. Symbols with sizes larger than '-mlarge-data-threshold' are + put into large data or BSS sections and can be located above 2GB. + Programs can be statically or dynamically linked. + +'-mcmodel=large' + Generate code for the large model. This model makes no assumptions + about addresses and sizes of sections. + +'-maddress-mode=long' + Generate code for long address mode. This is only supported for + 64-bit and x32 environments. It is the default address mode for + 64-bit environments. + +'-maddress-mode=short' + Generate code for short address mode. This is only supported for + 32-bit and x32 environments. It is the default address mode for + 32-bit and x32 environments. + + +File: gcc.info, Node: i386 and x86-64 Windows Options, Next: IA-64 Options, Prev: i386 and x86-64 Options, Up: Submodel Options + +3.17.18 i386 and x86-64 Windows Options +--------------------------------------- + +These additional options are available for Microsoft Windows targets: + +'-mconsole' + This option specifies that a console application is to be + generated, by instructing the linker to set the PE header subsystem + type required for console applications. This option is available + for Cygwin and MinGW targets and is enabled by default on those + targets. + +'-mdll' + This option is available for Cygwin and MinGW targets. It + specifies that a DLL--a dynamic link library--is to be generated, + enabling the selection of the required runtime startup object and + entry point. + +'-mnop-fun-dllimport' + This option is available for Cygwin and MinGW targets. It + specifies that the 'dllimport' attribute should be ignored. + +'-mthread' + This option is available for MinGW targets. It specifies that + MinGW-specific thread support is to be used. + +'-municode' + This option is available for MinGW-w64 targets. It causes the + 'UNICODE' preprocessor macro to be predefined, and chooses + Unicode-capable runtime startup code. + +'-mwin32' + This option is available for Cygwin and MinGW targets. It + specifies that the typical Microsoft Windows predefined macros are + to be set in the pre-processor, but does not influence the choice + of runtime library/startup code. + +'-mwindows' + This option is available for Cygwin and MinGW targets. It + specifies that a GUI application is to be generated by instructing + the linker to set the PE header subsystem type appropriately. + +'-fno-set-stack-executable' + This option is available for MinGW targets. It specifies that the + executable flag for the stack used by nested functions isn't set. + This is necessary for binaries running in kernel mode of Microsoft + Windows, as there the User32 API, which is used to set executable + privileges, isn't available. + +'-fwritable-relocated-rdata' + This option is available for MinGW and Cygwin targets. It + specifies that relocated-data in read-only section is put into + .data section. This is a necessary for older runtimes not + supporting modification of .rdata sections for pseudo-relocation. + +'-mpe-aligned-commons' + This option is available for Cygwin and MinGW targets. It + specifies that the GNU extension to the PE file format that permits + the correct alignment of COMMON variables should be used when + generating code. It is enabled by default if GCC detects that the + target assembler found during configuration supports the feature. + + See also under *note i386 and x86-64 Options:: for standard options. + + +File: gcc.info, Node: IA-64 Options, Next: LM32 Options, Prev: i386 and x86-64 Windows Options, Up: Submodel Options + +3.17.19 IA-64 Options +--------------------- + +These are the '-m' options defined for the Intel IA-64 architecture. + +'-mbig-endian' + Generate code for a big-endian target. This is the default for + HP-UX. + +'-mlittle-endian' + Generate code for a little-endian target. This is the default for + AIX5 and GNU/Linux. + +'-mgnu-as' +'-mno-gnu-as' + Generate (or don't) code for the GNU assembler. This is the + default. + +'-mgnu-ld' +'-mno-gnu-ld' + Generate (or don't) code for the GNU linker. This is the default. + +'-mno-pic' + Generate code that does not use a global pointer register. The + result is not position independent code, and violates the IA-64 + ABI. + +'-mvolatile-asm-stop' +'-mno-volatile-asm-stop' + Generate (or don't) a stop bit immediately before and after + volatile asm statements. + +'-mregister-names' +'-mno-register-names' + Generate (or don't) 'in', 'loc', and 'out' register names for the + stacked registers. This may make assembler output more readable. + +'-mno-sdata' +'-msdata' + Disable (or enable) optimizations that use the small data section. + This may be useful for working around optimizer bugs. + +'-mconstant-gp' + Generate code that uses a single constant global pointer value. + This is useful when compiling kernel code. + +'-mauto-pic' + Generate code that is self-relocatable. This implies + '-mconstant-gp'. This is useful when compiling firmware code. + +'-minline-float-divide-min-latency' + Generate code for inline divides of floating-point values using the + minimum latency algorithm. + +'-minline-float-divide-max-throughput' + Generate code for inline divides of floating-point values using the + maximum throughput algorithm. + +'-mno-inline-float-divide' + Do not generate inline code for divides of floating-point values. + +'-minline-int-divide-min-latency' + Generate code for inline divides of integer values using the + minimum latency algorithm. + +'-minline-int-divide-max-throughput' + Generate code for inline divides of integer values using the + maximum throughput algorithm. + +'-mno-inline-int-divide' + Do not generate inline code for divides of integer values. + +'-minline-sqrt-min-latency' + Generate code for inline square roots using the minimum latency + algorithm. + +'-minline-sqrt-max-throughput' + Generate code for inline square roots using the maximum throughput + algorithm. + +'-mno-inline-sqrt' + Do not generate inline code for 'sqrt'. + +'-mfused-madd' +'-mno-fused-madd' + Do (don't) generate code that uses the fused multiply/add or + multiply/subtract instructions. The default is to use these + instructions. + +'-mno-dwarf2-asm' +'-mdwarf2-asm' + Don't (or do) generate assembler code for the DWARF 2 line number + debugging info. This may be useful when not using the GNU + assembler. + +'-mearly-stop-bits' +'-mno-early-stop-bits' + Allow stop bits to be placed earlier than immediately preceding the + instruction that triggered the stop bit. This can improve + instruction scheduling, but does not always do so. + +'-mfixed-range=REGISTER-RANGE' + Generate code treating the given register range as fixed registers. + A fixed register is one that the register allocator cannot use. + This is useful when compiling kernel code. A register range is + specified as two registers separated by a dash. Multiple register + ranges can be specified separated by a comma. + +'-mtls-size=TLS-SIZE' + Specify bit size of immediate TLS offsets. Valid values are 14, + 22, and 64. + +'-mtune=CPU-TYPE' + Tune the instruction scheduling for a particular CPU, Valid values + are 'itanium', 'itanium1', 'merced', 'itanium2', and 'mckinley'. + +'-milp32' +'-mlp64' + Generate code for a 32-bit or 64-bit environment. The 32-bit + environment sets int, long and pointer to 32 bits. The 64-bit + environment sets int to 32 bits and long and pointer to 64 bits. + These are HP-UX specific flags. + +'-mno-sched-br-data-spec' +'-msched-br-data-spec' + (Dis/En)able data speculative scheduling before reload. This + results in generation of 'ld.a' instructions and the corresponding + check instructions ('ld.c' / 'chk.a'). The default is 'disable'. + +'-msched-ar-data-spec' +'-mno-sched-ar-data-spec' + (En/Dis)able data speculative scheduling after reload. This + results in generation of 'ld.a' instructions and the corresponding + check instructions ('ld.c' / 'chk.a'). The default is 'enable'. + +'-mno-sched-control-spec' +'-msched-control-spec' + (Dis/En)able control speculative scheduling. This feature is + available only during region scheduling (i.e. before reload). This + results in generation of the 'ld.s' instructions and the + corresponding check instructions 'chk.s'. The default is + 'disable'. + +'-msched-br-in-data-spec' +'-mno-sched-br-in-data-spec' + (En/Dis)able speculative scheduling of the instructions that are + dependent on the data speculative loads before reload. This is + effective only with '-msched-br-data-spec' enabled. The default is + 'enable'. + +'-msched-ar-in-data-spec' +'-mno-sched-ar-in-data-spec' + (En/Dis)able speculative scheduling of the instructions that are + dependent on the data speculative loads after reload. This is + effective only with '-msched-ar-data-spec' enabled. The default is + 'enable'. + +'-msched-in-control-spec' +'-mno-sched-in-control-spec' + (En/Dis)able speculative scheduling of the instructions that are + dependent on the control speculative loads. This is effective only + with '-msched-control-spec' enabled. The default is 'enable'. + +'-mno-sched-prefer-non-data-spec-insns' +'-msched-prefer-non-data-spec-insns' + If enabled, data-speculative instructions are chosen for schedule + only if there are no other choices at the moment. This makes the + use of the data speculation much more conservative. The default is + 'disable'. + +'-mno-sched-prefer-non-control-spec-insns' +'-msched-prefer-non-control-spec-insns' + If enabled, control-speculative instructions are chosen for + schedule only if there are no other choices at the moment. This + makes the use of the control speculation much more conservative. + The default is 'disable'. + +'-mno-sched-count-spec-in-critical-path' +'-msched-count-spec-in-critical-path' + If enabled, speculative dependencies are considered during + computation of the instructions priorities. This makes the use of + the speculation a bit more conservative. The default is 'disable'. + +'-msched-spec-ldc' + Use a simple data speculation check. This option is on by default. + +'-msched-control-spec-ldc' + Use a simple check for control speculation. This option is on by + default. + +'-msched-stop-bits-after-every-cycle' + Place a stop bit after every cycle when scheduling. This option is + on by default. + +'-msched-fp-mem-deps-zero-cost' + Assume that floating-point stores and loads are not likely to cause + a conflict when placed into the same instruction group. This + option is disabled by default. + +'-msel-sched-dont-check-control-spec' + Generate checks for control speculation in selective scheduling. + This flag is disabled by default. + +'-msched-max-memory-insns=MAX-INSNS' + Limit on the number of memory insns per instruction group, giving + lower priority to subsequent memory insns attempting to schedule in + the same instruction group. Frequently useful to prevent cache + bank conflicts. The default value is 1. + +'-msched-max-memory-insns-hard-limit' + Makes the limit specified by 'msched-max-memory-insns' a hard + limit, disallowing more than that number in an instruction group. + Otherwise, the limit is "soft", meaning that non-memory operations + are preferred when the limit is reached, but memory operations may + still be scheduled. + + +File: gcc.info, Node: LM32 Options, Next: M32C Options, Prev: IA-64 Options, Up: Submodel Options + +3.17.20 LM32 Options +-------------------- + +These '-m' options are defined for the LatticeMico32 architecture: + +'-mbarrel-shift-enabled' + Enable barrel-shift instructions. + +'-mdivide-enabled' + Enable divide and modulus instructions. + +'-mmultiply-enabled' + Enable multiply instructions. + +'-msign-extend-enabled' + Enable sign extend instructions. + +'-muser-enabled' + Enable user-defined instructions. + + +File: gcc.info, Node: M32C Options, Next: M32R/D Options, Prev: LM32 Options, Up: Submodel Options + +3.17.21 M32C Options +-------------------- + +'-mcpu=NAME' + Select the CPU for which code is generated. NAME may be one of + 'r8c' for the R8C/Tiny series, 'm16c' for the M16C (up to /60) + series, 'm32cm' for the M16C/80 series, or 'm32c' for the M32C/80 + series. + +'-msim' + Specifies that the program will be run on the simulator. This + causes an alternate runtime library to be linked in which supports, + for example, file I/O. You must not use this option when + generating programs that will run on real hardware; you must + provide your own runtime library for whatever I/O functions are + needed. + +'-memregs=NUMBER' + Specifies the number of memory-based pseudo-registers GCC uses + during code generation. These pseudo-registers are used like real + registers, so there is a tradeoff between GCC's ability to fit the + code into available registers, and the performance penalty of using + memory instead of registers. Note that all modules in a program + must be compiled with the same value for this option. Because of + that, you must not use this option with GCC's default runtime + libraries. + + +File: gcc.info, Node: M32R/D Options, Next: M680x0 Options, Prev: M32C Options, Up: Submodel Options + +3.17.22 M32R/D Options +---------------------- + +These '-m' options are defined for Renesas M32R/D architectures: + +'-m32r2' + Generate code for the M32R/2. + +'-m32rx' + Generate code for the M32R/X. + +'-m32r' + Generate code for the M32R. This is the default. + +'-mmodel=small' + Assume all objects live in the lower 16MB of memory (so that their + addresses can be loaded with the 'ld24' instruction), and assume + all subroutines are reachable with the 'bl' instruction. This is + the default. + + The addressability of a particular object can be set with the + 'model' attribute. + +'-mmodel=medium' + Assume objects may be anywhere in the 32-bit address space (the + compiler generates 'seth/add3' instructions to load their + addresses), and assume all subroutines are reachable with the 'bl' + instruction. + +'-mmodel=large' + Assume objects may be anywhere in the 32-bit address space (the + compiler generates 'seth/add3' instructions to load their + addresses), and assume subroutines may not be reachable with the + 'bl' instruction (the compiler generates the much slower + 'seth/add3/jl' instruction sequence). + +'-msdata=none' + Disable use of the small data area. Variables are put into one of + '.data', '.bss', or '.rodata' (unless the 'section' attribute has + been specified). This is the default. + + The small data area consists of sections '.sdata' and '.sbss'. + Objects may be explicitly put in the small data area with the + 'section' attribute using one of these sections. + +'-msdata=sdata' + Put small global and static data in the small data area, but do not + generate special code to reference them. + +'-msdata=use' + Put small global and static data in the small data area, and + generate special instructions to reference them. + +'-G NUM' + Put global and static objects less than or equal to NUM bytes into + the small data or BSS sections instead of the normal data or BSS + sections. The default value of NUM is 8. The '-msdata' option + must be set to one of 'sdata' or 'use' for this option to have any + effect. + + All modules should be compiled with the same '-G NUM' value. + Compiling with different values of NUM may or may not work; if it + doesn't the linker gives an error message--incorrect code is not + generated. + +'-mdebug' + Makes the M32R-specific code in the compiler display some + statistics that might help in debugging programs. + +'-malign-loops' + Align all loops to a 32-byte boundary. + +'-mno-align-loops' + Do not enforce a 32-byte alignment for loops. This is the default. + +'-missue-rate=NUMBER' + Issue NUMBER instructions per cycle. NUMBER can only be 1 or 2. + +'-mbranch-cost=NUMBER' + NUMBER can only be 1 or 2. If it is 1 then branches are preferred + over conditional code, if it is 2, then the opposite applies. + +'-mflush-trap=NUMBER' + Specifies the trap number to use to flush the cache. The default + is 12. Valid numbers are between 0 and 15 inclusive. + +'-mno-flush-trap' + Specifies that the cache cannot be flushed by using a trap. + +'-mflush-func=NAME' + Specifies the name of the operating system function to call to + flush the cache. The default is __flush_cache_, but a function + call is only used if a trap is not available. + +'-mno-flush-func' + Indicates that there is no OS function for flushing the cache. + + +File: gcc.info, Node: M680x0 Options, Next: MCore Options, Prev: M32R/D Options, Up: Submodel Options + +3.17.23 M680x0 Options +---------------------- + +These are the '-m' options defined for M680x0 and ColdFire processors. +The default settings depend on which architecture was selected when the +compiler was configured; the defaults for the most common choices are +given below. + +'-march=ARCH' + Generate code for a specific M680x0 or ColdFire instruction set + architecture. Permissible values of ARCH for M680x0 architectures + are: '68000', '68010', '68020', '68030', '68040', '68060' and + 'cpu32'. ColdFire architectures are selected according to + Freescale's ISA classification and the permissible values are: + 'isaa', 'isaaplus', 'isab' and 'isac'. + + GCC defines a macro '__mcfARCH__' whenever it is generating code + for a ColdFire target. The ARCH in this macro is one of the + '-march' arguments given above. + + When used together, '-march' and '-mtune' select code that runs on + a family of similar processors but that is optimized for a + particular microarchitecture. + +'-mcpu=CPU' + Generate code for a specific M680x0 or ColdFire processor. The + M680x0 CPUs are: '68000', '68010', '68020', '68030', '68040', + '68060', '68302', '68332' and 'cpu32'. The ColdFire CPUs are given + by the table below, which also classifies the CPUs into families: + + *Family* *'-mcpu' arguments* + '51' '51' '51ac' '51ag' '51cn' '51em' '51je' '51jf' '51jg' + '51jm' '51mm' '51qe' '51qm' + '5206' '5202' '5204' '5206' + '5206e' '5206e' + '5208' '5207' '5208' + '5211a' '5210a' '5211a' + '5213' '5211' '5212' '5213' + '5216' '5214' '5216' + '52235' '52230' '52231' '52232' '52233' '52234' '52235' + '5225' '5224' '5225' + '52259' '52252' '52254' '52255' '52256' '52258' '52259' + '5235' '5232' '5233' '5234' '5235' '523x' + '5249' '5249' + '5250' '5250' + '5271' '5270' '5271' + '5272' '5272' + '5275' '5274' '5275' + '5282' '5280' '5281' '5282' '528x' + '53017' '53011' '53012' '53013' '53014' '53015' '53016' '53017' + '5307' '5307' + '5329' '5327' '5328' '5329' '532x' + '5373' '5372' '5373' '537x' + '5407' '5407' + '5475' '5470' '5471' '5472' '5473' '5474' '5475' '547x' '5480' + '5481' '5482' '5483' '5484' '5485' + + '-mcpu=CPU' overrides '-march=ARCH' if ARCH is compatible with CPU. + Other combinations of '-mcpu' and '-march' are rejected. + + GCC defines the macro '__mcf_cpu_CPU' when ColdFire target CPU is + selected. It also defines '__mcf_family_FAMILY', where the value + of FAMILY is given by the table above. + +'-mtune=TUNE' + Tune the code for a particular microarchitecture within the + constraints set by '-march' and '-mcpu'. The M680x0 + microarchitectures are: '68000', '68010', '68020', '68030', + '68040', '68060' and 'cpu32'. The ColdFire microarchitectures are: + 'cfv1', 'cfv2', 'cfv3', 'cfv4' and 'cfv4e'. + + You can also use '-mtune=68020-40' for code that needs to run + relatively well on 68020, 68030 and 68040 targets. + '-mtune=68020-60' is similar but includes 68060 targets as well. + These two options select the same tuning decisions as '-m68020-40' + and '-m68020-60' respectively. + + GCC defines the macros '__mcARCH' and '__mcARCH__' when tuning for + 680x0 architecture ARCH. It also defines 'mcARCH' unless either + '-ansi' or a non-GNU '-std' option is used. If GCC is tuning for a + range of architectures, as selected by '-mtune=68020-40' or + '-mtune=68020-60', it defines the macros for every architecture in + the range. + + GCC also defines the macro '__mUARCH__' when tuning for ColdFire + microarchitecture UARCH, where UARCH is one of the arguments given + above. + +'-m68000' +'-mc68000' + Generate output for a 68000. This is the default when the compiler + is configured for 68000-based systems. It is equivalent to + '-march=68000'. + + Use this option for microcontrollers with a 68000 or EC000 core, + including the 68008, 68302, 68306, 68307, 68322, 68328 and 68356. + +'-m68010' + Generate output for a 68010. This is the default when the compiler + is configured for 68010-based systems. It is equivalent to + '-march=68010'. + +'-m68020' +'-mc68020' + Generate output for a 68020. This is the default when the compiler + is configured for 68020-based systems. It is equivalent to + '-march=68020'. + +'-m68030' + Generate output for a 68030. This is the default when the compiler + is configured for 68030-based systems. It is equivalent to + '-march=68030'. + +'-m68040' + Generate output for a 68040. This is the default when the compiler + is configured for 68040-based systems. It is equivalent to + '-march=68040'. + + This option inhibits the use of 68881/68882 instructions that have + to be emulated by software on the 68040. Use this option if your + 68040 does not have code to emulate those instructions. + +'-m68060' + Generate output for a 68060. This is the default when the compiler + is configured for 68060-based systems. It is equivalent to + '-march=68060'. + + This option inhibits the use of 68020 and 68881/68882 instructions + that have to be emulated by software on the 68060. Use this option + if your 68060 does not have code to emulate those instructions. + +'-mcpu32' + Generate output for a CPU32. This is the default when the compiler + is configured for CPU32-based systems. It is equivalent to + '-march=cpu32'. + + Use this option for microcontrollers with a CPU32 or CPU32+ core, + including the 68330, 68331, 68332, 68333, 68334, 68336, 68340, + 68341, 68349 and 68360. + +'-m5200' + Generate output for a 520X ColdFire CPU. This is the default when + the compiler is configured for 520X-based systems. It is + equivalent to '-mcpu=5206', and is now deprecated in favor of that + option. + + Use this option for microcontroller with a 5200 core, including the + MCF5202, MCF5203, MCF5204 and MCF5206. + +'-m5206e' + Generate output for a 5206e ColdFire CPU. The option is now + deprecated in favor of the equivalent '-mcpu=5206e'. + +'-m528x' + Generate output for a member of the ColdFire 528X family. The + option is now deprecated in favor of the equivalent '-mcpu=528x'. + +'-m5307' + Generate output for a ColdFire 5307 CPU. The option is now + deprecated in favor of the equivalent '-mcpu=5307'. + +'-m5407' + Generate output for a ColdFire 5407 CPU. The option is now + deprecated in favor of the equivalent '-mcpu=5407'. + +'-mcfv4e' + Generate output for a ColdFire V4e family CPU (e.g. 547x/548x). + This includes use of hardware floating-point instructions. The + option is equivalent to '-mcpu=547x', and is now deprecated in + favor of that option. + +'-m68020-40' + Generate output for a 68040, without using any of the new + instructions. This results in code that can run relatively + efficiently on either a 68020/68881 or a 68030 or a 68040. The + generated code does use the 68881 instructions that are emulated on + the 68040. + + The option is equivalent to '-march=68020' '-mtune=68020-40'. + +'-m68020-60' + Generate output for a 68060, without using any of the new + instructions. This results in code that can run relatively + efficiently on either a 68020/68881 or a 68030 or a 68040. The + generated code does use the 68881 instructions that are emulated on + the 68060. + + The option is equivalent to '-march=68020' '-mtune=68020-60'. + +'-mhard-float' +'-m68881' + Generate floating-point instructions. This is the default for + 68020 and above, and for ColdFire devices that have an FPU. It + defines the macro '__HAVE_68881__' on M680x0 targets and + '__mcffpu__' on ColdFire targets. + +'-msoft-float' + Do not generate floating-point instructions; use library calls + instead. This is the default for 68000, 68010, and 68832 targets. + It is also the default for ColdFire devices that have no FPU. + +'-mdiv' +'-mno-div' + Generate (do not generate) ColdFire hardware divide and remainder + instructions. If '-march' is used without '-mcpu', the default is + "on" for ColdFire architectures and "off" for M680x0 architectures. + Otherwise, the default is taken from the target CPU (either the + default CPU, or the one specified by '-mcpu'). For example, the + default is "off" for '-mcpu=5206' and "on" for '-mcpu=5206e'. + + GCC defines the macro '__mcfhwdiv__' when this option is enabled. + +'-mshort' + Consider type 'int' to be 16 bits wide, like 'short int'. + Additionally, parameters passed on the stack are also aligned to a + 16-bit boundary even on targets whose API mandates promotion to + 32-bit. + +'-mno-short' + Do not consider type 'int' to be 16 bits wide. This is the + default. + +'-mnobitfield' +'-mno-bitfield' + Do not use the bit-field instructions. The '-m68000', '-mcpu32' + and '-m5200' options imply '-mnobitfield'. + +'-mbitfield' + Do use the bit-field instructions. The '-m68020' option implies + '-mbitfield'. This is the default if you use a configuration + designed for a 68020. + +'-mrtd' + Use a different function-calling convention, in which functions + that take a fixed number of arguments return with the 'rtd' + instruction, which pops their arguments while returning. This + saves one instruction in the caller since there is no need to pop + the arguments there. + + This calling convention is incompatible with the one normally used + on Unix, so you cannot use it if you need to call libraries + compiled with the Unix compiler. + + Also, you must provide function prototypes for all functions that + take variable numbers of arguments (including 'printf'); otherwise + incorrect code is generated for calls to those functions. + + In addition, seriously incorrect code results if you call a + function with too many arguments. (Normally, extra arguments are + harmlessly ignored.) + + The 'rtd' instruction is supported by the 68010, 68020, 68030, + 68040, 68060 and CPU32 processors, but not by the 68000 or 5200. + +'-mno-rtd' + Do not use the calling conventions selected by '-mrtd'. This is + the default. + +'-malign-int' +'-mno-align-int' + Control whether GCC aligns 'int', 'long', 'long long', 'float', + 'double', and 'long double' variables on a 32-bit boundary + ('-malign-int') or a 16-bit boundary ('-mno-align-int'). Aligning + variables on 32-bit boundaries produces code that runs somewhat + faster on processors with 32-bit busses at the expense of more + memory. + + *Warning:* if you use the '-malign-int' switch, GCC aligns + structures containing the above types differently than most + published application binary interface specifications for the m68k. + +'-mpcrel' + Use the pc-relative addressing mode of the 68000 directly, instead + of using a global offset table. At present, this option implies + '-fpic', allowing at most a 16-bit offset for pc-relative + addressing. '-fPIC' is not presently supported with '-mpcrel', + though this could be supported for 68020 and higher processors. + +'-mno-strict-align' +'-mstrict-align' + Do not (do) assume that unaligned memory references are handled by + the system. + +'-msep-data' + Generate code that allows the data segment to be located in a + different area of memory from the text segment. This allows for + execute-in-place in an environment without virtual memory + management. This option implies '-fPIC'. + +'-mno-sep-data' + Generate code that assumes that the data segment follows the text + segment. This is the default. + +'-mid-shared-library' + Generate code that supports shared libraries via the library ID + method. This allows for execute-in-place and shared libraries in + an environment without virtual memory management. This option + implies '-fPIC'. + +'-mno-id-shared-library' + Generate code that doesn't assume ID-based shared libraries are + being used. This is the default. + +'-mshared-library-id=n' + Specifies the identification number of the ID-based shared library + being compiled. Specifying a value of 0 generates more compact + code; specifying other values forces the allocation of that number + to the current library, but is no more space- or time-efficient + than omitting this option. + +'-mxgot' +'-mno-xgot' + When generating position-independent code for ColdFire, generate + code that works if the GOT has more than 8192 entries. This code + is larger and slower than code generated without this option. On + M680x0 processors, this option is not needed; '-fPIC' suffices. + + GCC normally uses a single instruction to load values from the GOT. + While this is relatively efficient, it only works if the GOT is + smaller than about 64k. Anything larger causes the linker to + report an error such as: + + relocation truncated to fit: R_68K_GOT16O foobar + + If this happens, you should recompile your code with '-mxgot'. It + should then work with very large GOTs. However, code generated + with '-mxgot' is less efficient, since it takes 4 instructions to + fetch the value of a global symbol. + + Note that some linkers, including newer versions of the GNU linker, + can create multiple GOTs and sort GOT entries. If you have such a + linker, you should only need to use '-mxgot' when compiling a + single object file that accesses more than 8192 GOT entries. Very + few do. + + These options have no effect unless GCC is generating + position-independent code. + + +File: gcc.info, Node: MCore Options, Next: MeP Options, Prev: M680x0 Options, Up: Submodel Options + +3.17.24 MCore Options +--------------------- + +These are the '-m' options defined for the Motorola M*Core processors. + +'-mhardlit' +'-mno-hardlit' + Inline constants into the code stream if it can be done in two + instructions or less. + +'-mdiv' +'-mno-div' + Use the divide instruction. (Enabled by default). + +'-mrelax-immediate' +'-mno-relax-immediate' + Allow arbitrary-sized immediates in bit operations. + +'-mwide-bitfields' +'-mno-wide-bitfields' + Always treat bit-fields as 'int'-sized. + +'-m4byte-functions' +'-mno-4byte-functions' + Force all functions to be aligned to a 4-byte boundary. + +'-mcallgraph-data' +'-mno-callgraph-data' + Emit callgraph information. + +'-mslow-bytes' +'-mno-slow-bytes' + Prefer word access when reading byte quantities. + +'-mlittle-endian' +'-mbig-endian' + Generate code for a little-endian target. + +'-m210' +'-m340' + Generate code for the 210 processor. + +'-mno-lsim' + Assume that runtime support has been provided and so omit the + simulator library ('libsim.a)' from the linker command line. + +'-mstack-increment=SIZE' + Set the maximum amount for a single stack increment operation. + Large values can increase the speed of programs that contain + functions that need a large amount of stack space, but they can + also trigger a segmentation fault if the stack is extended too + much. The default value is 0x1000. + + +File: gcc.info, Node: MeP Options, Next: MicroBlaze Options, Prev: MCore Options, Up: Submodel Options + +3.17.25 MeP Options +------------------- + +'-mabsdiff' + Enables the 'abs' instruction, which is the absolute difference + between two registers. + +'-mall-opts' + Enables all the optional instructions--average, multiply, divide, + bit operations, leading zero, absolute difference, min/max, clip, + and saturation. + +'-maverage' + Enables the 'ave' instruction, which computes the average of two + registers. + +'-mbased=N' + Variables of size N bytes or smaller are placed in the '.based' + section by default. Based variables use the '$tp' register as a + base register, and there is a 128-byte limit to the '.based' + section. + +'-mbitops' + Enables the bit operation instructions--bit test ('btstm'), set + ('bsetm'), clear ('bclrm'), invert ('bnotm'), and test-and-set + ('tas'). + +'-mc=NAME' + Selects which section constant data is placed in. NAME may be + 'tiny', 'near', or 'far'. + +'-mclip' + Enables the 'clip' instruction. Note that '-mclip' is not useful + unless you also provide '-mminmax'. + +'-mconfig=NAME' + Selects one of the built-in core configurations. Each MeP chip has + one or more modules in it; each module has a core CPU and a variety + of coprocessors, optional instructions, and peripherals. The + 'MeP-Integrator' tool, not part of GCC, provides these + configurations through this option; using this option is the same + as using all the corresponding command-line options. The default + configuration is 'default'. + +'-mcop' + Enables the coprocessor instructions. By default, this is a 32-bit + coprocessor. Note that the coprocessor is normally enabled via the + '-mconfig=' option. + +'-mcop32' + Enables the 32-bit coprocessor's instructions. + +'-mcop64' + Enables the 64-bit coprocessor's instructions. + +'-mivc2' + Enables IVC2 scheduling. IVC2 is a 64-bit VLIW coprocessor. + +'-mdc' + Causes constant variables to be placed in the '.near' section. + +'-mdiv' + Enables the 'div' and 'divu' instructions. + +'-meb' + Generate big-endian code. + +'-mel' + Generate little-endian code. + +'-mio-volatile' + Tells the compiler that any variable marked with the 'io' attribute + is to be considered volatile. + +'-ml' + Causes variables to be assigned to the '.far' section by default. + +'-mleadz' + Enables the 'leadz' (leading zero) instruction. + +'-mm' + Causes variables to be assigned to the '.near' section by default. + +'-mminmax' + Enables the 'min' and 'max' instructions. + +'-mmult' + Enables the multiplication and multiply-accumulate instructions. + +'-mno-opts' + Disables all the optional instructions enabled by '-mall-opts'. + +'-mrepeat' + Enables the 'repeat' and 'erepeat' instructions, used for + low-overhead looping. + +'-ms' + Causes all variables to default to the '.tiny' section. Note that + there is a 65536-byte limit to this section. Accesses to these + variables use the '%gp' base register. + +'-msatur' + Enables the saturation instructions. Note that the compiler does + not currently generate these itself, but this option is included + for compatibility with other tools, like 'as'. + +'-msdram' + Link the SDRAM-based runtime instead of the default ROM-based + runtime. + +'-msim' + Link the simulator run-time libraries. + +'-msimnovec' + Link the simulator runtime libraries, excluding built-in support + for reset and exception vectors and tables. + +'-mtf' + Causes all functions to default to the '.far' section. Without + this option, functions default to the '.near' section. + +'-mtiny=N' + Variables that are N bytes or smaller are allocated to the '.tiny' + section. These variables use the '$gp' base register. The default + for this option is 4, but note that there's a 65536-byte limit to + the '.tiny' section. + + +File: gcc.info, Node: MicroBlaze Options, Next: MIPS Options, Prev: MeP Options, Up: Submodel Options + +3.17.26 MicroBlaze Options +-------------------------- + +'-msoft-float' + Use software emulation for floating point (default). + +'-mhard-float' + Use hardware floating-point instructions. + +'-mmemcpy' + Do not optimize block moves, use 'memcpy'. + +'-mno-clearbss' + This option is deprecated. Use '-fno-zero-initialized-in-bss' + instead. + +'-mcpu=CPU-TYPE' + Use features of, and schedule code for, the given CPU. Supported + values are in the format 'vX.YY.Z', where X is a major version, YY + is the minor version, and Z is compatibility code. Example values + are 'v3.00.a', 'v4.00.b', 'v5.00.a', 'v5.00.b', 'v5.00.b', + 'v6.00.a'. + +'-mxl-soft-mul' + Use software multiply emulation (default). + +'-mxl-soft-div' + Use software emulation for divides (default). + +'-mxl-barrel-shift' + Use the hardware barrel shifter. + +'-mxl-pattern-compare' + Use pattern compare instructions. + +'-msmall-divides' + Use table lookup optimization for small signed integer divisions. + +'-mxl-stack-check' + This option is deprecated. Use '-fstack-check' instead. + +'-mxl-gp-opt' + Use GP-relative '.sdata'/'.sbss' sections. + +'-mxl-multiply-high' + Use multiply high instructions for high part of 32x32 multiply. + +'-mxl-float-convert' + Use hardware floating-point conversion instructions. + +'-mxl-float-sqrt' + Use hardware floating-point square root instruction. + +'-mbig-endian' + Generate code for a big-endian target. + +'-mlittle-endian' + Generate code for a little-endian target. + +'-mxl-reorder' + Use reorder instructions (swap and byte reversed load/store). + +'-mxl-mode-APP-MODEL' + Select application model APP-MODEL. Valid models are + 'executable' + normal executable (default), uses startup code 'crt0.o'. + + 'xmdstub' + for use with Xilinx Microprocessor Debugger (XMD) based + software intrusive debug agent called xmdstub. This uses + startup file 'crt1.o' and sets the start address of the + program to 0x800. + + 'bootstrap' + for applications that are loaded using a bootloader. This + model uses startup file 'crt2.o' which does not contain a + processor reset vector handler. This is suitable for + transferring control on a processor reset to the bootloader + rather than the application. + + 'novectors' + for applications that do not require any of the MicroBlaze + vectors. This option may be useful for applications running + within a monitoring application. This model uses 'crt3.o' as + a startup file. + + Option '-xl-mode-APP-MODEL' is a deprecated alias for + '-mxl-mode-APP-MODEL'. + + +File: gcc.info, Node: MIPS Options, Next: MMIX Options, Prev: MicroBlaze Options, Up: Submodel Options + +3.17.27 MIPS Options +-------------------- + +'-EB' + Generate big-endian code. + +'-EL' + Generate little-endian code. This is the default for 'mips*el-*-*' + configurations. + +'-march=ARCH' + Generate code that runs on ARCH, which can be the name of a generic + MIPS ISA, or the name of a particular processor. The ISA names + are: 'mips1', 'mips2', 'mips3', 'mips4', 'mips32', 'mips32r2', + 'mips64' and 'mips64r2'. The processor names are: '4kc', '4km', + '4kp', '4ksc', '4kec', '4kem', '4kep', '4ksd', '5kc', '5kf', + '20kc', '24kc', '24kf2_1', '24kf1_1', '24kec', '24kef2_1', + '24kef1_1', '34kc', '34kf2_1', '34kf1_1', '34kn', '74kc', + '74kf2_1', '74kf1_1', '74kf3_2', '1004kc', '1004kf2_1', + '1004kf1_1', 'loongson2e', 'loongson2f', 'loongson3a', 'm4k', + 'm14k', 'm14kc', 'm14ke', 'm14kec', 'octeon', 'octeon+', 'octeon2', + 'orion', 'r2000', 'r3000', 'r3900', 'r4000', 'r4400', 'r4600', + 'r4650', 'r4700', 'r6000', 'r8000', 'rm7000', 'rm9000', 'r10000', + 'r12000', 'r14000', 'r16000', 'sb1', 'sr71000', 'vr4100', 'vr4111', + 'vr4120', 'vr4130', 'vr4300', 'vr5000', 'vr5400', 'vr5500', 'xlr' + and 'xlp'. The special value 'from-abi' selects the most + compatible architecture for the selected ABI (that is, 'mips1' for + 32-bit ABIs and 'mips3' for 64-bit ABIs). + + The native Linux/GNU toolchain also supports the value 'native', + which selects the best architecture option for the host processor. + '-march=native' has no effect if GCC does not recognize the + processor. + + In processor names, a final '000' can be abbreviated as 'k' (for + example, '-march=r2k'). Prefixes are optional, and 'vr' may be + written 'r'. + + Names of the form 'Nf2_1' refer to processors with FPUs clocked at + half the rate of the core, names of the form 'Nf1_1' refer to + processors with FPUs clocked at the same rate as the core, and + names of the form 'Nf3_2' refer to processors with FPUs clocked a + ratio of 3:2 with respect to the core. For compatibility reasons, + 'Nf' is accepted as a synonym for 'Nf2_1' while 'Nx' and 'Bfx' are + accepted as synonyms for 'Nf1_1'. + + GCC defines two macros based on the value of this option. The + first is '_MIPS_ARCH', which gives the name of target architecture, + as a string. The second has the form '_MIPS_ARCH_FOO', where FOO + is the capitalized value of '_MIPS_ARCH'. For example, + '-march=r2000' sets '_MIPS_ARCH' to '"r2000"' and defines the macro + '_MIPS_ARCH_R2000'. + + Note that the '_MIPS_ARCH' macro uses the processor names given + above. In other words, it has the full prefix and does not + abbreviate '000' as 'k'. In the case of 'from-abi', the macro + names the resolved architecture (either '"mips1"' or '"mips3"'). + It names the default architecture when no '-march' option is given. + +'-mtune=ARCH' + Optimize for ARCH. Among other things, this option controls the + way instructions are scheduled, and the perceived cost of + arithmetic operations. The list of ARCH values is the same as for + '-march'. + + When this option is not used, GCC optimizes for the processor + specified by '-march'. By using '-march' and '-mtune' together, it + is possible to generate code that runs on a family of processors, + but optimize the code for one particular member of that family. + + '-mtune' defines the macros '_MIPS_TUNE' and '_MIPS_TUNE_FOO', + which work in the same way as the '-march' ones described above. + +'-mips1' + Equivalent to '-march=mips1'. + +'-mips2' + Equivalent to '-march=mips2'. + +'-mips3' + Equivalent to '-march=mips3'. + +'-mips4' + Equivalent to '-march=mips4'. + +'-mips32' + Equivalent to '-march=mips32'. + +'-mips32r2' + Equivalent to '-march=mips32r2'. + +'-mips64' + Equivalent to '-march=mips64'. + +'-mips64r2' + Equivalent to '-march=mips64r2'. + +'-mips16' +'-mno-mips16' + Generate (do not generate) MIPS16 code. If GCC is targeting a + MIPS32 or MIPS64 architecture, it makes use of the MIPS16e ASE. + + MIPS16 code generation can also be controlled on a per-function + basis by means of 'mips16' and 'nomips16' attributes. *Note + Function Attributes::, for more information. + +'-mflip-mips16' + Generate MIPS16 code on alternating functions. This option is + provided for regression testing of mixed MIPS16/non-MIPS16 code + generation, and is not intended for ordinary use in compiling user + code. + +'-minterlink-compressed' +'-mno-interlink-compressed' + Require (do not require) that code using the standard + (uncompressed) MIPS ISA be link-compatible with MIPS16 and + microMIPS code, and vice versa. + + For example, code using the standard ISA encoding cannot jump + directly to MIPS16 or microMIPS code; it must either use a call or + an indirect jump. '-minterlink-compressed' therefore disables + direct jumps unless GCC knows that the target of the jump is not + compressed. + +'-minterlink-mips16' +'-mno-interlink-mips16' + Aliases of '-minterlink-compressed' and + '-mno-interlink-compressed'. These options predate the microMIPS + ASE and are retained for backwards compatibility. + +'-mabi=32' +'-mabi=o64' +'-mabi=n32' +'-mabi=64' +'-mabi=eabi' + Generate code for the given ABI. + + Note that the EABI has a 32-bit and a 64-bit variant. GCC normally + generates 64-bit code when you select a 64-bit architecture, but + you can use '-mgp32' to get 32-bit code instead. + + For information about the O64 ABI, see + <http://gcc.gnu.org/projects/mipso64-abi.html>. + + GCC supports a variant of the o32 ABI in which floating-point + registers are 64 rather than 32 bits wide. You can select this + combination with '-mabi=32' '-mfp64'. This ABI relies on the + 'mthc1' and 'mfhc1' instructions and is therefore only supported + for MIPS32R2 processors. + + The register assignments for arguments and return values remain the + same, but each scalar value is passed in a single 64-bit register + rather than a pair of 32-bit registers. For example, scalar + floating-point values are returned in '$f0' only, not a '$f0'/'$f1' + pair. The set of call-saved registers also remains the same, but + all 64 bits are saved. + +'-mabicalls' +'-mno-abicalls' + Generate (do not generate) code that is suitable for SVR4-style + dynamic objects. '-mabicalls' is the default for SVR4-based + systems. + +'-mshared' +'-mno-shared' + Generate (do not generate) code that is fully position-independent, + and that can therefore be linked into shared libraries. This + option only affects '-mabicalls'. + + All '-mabicalls' code has traditionally been position-independent, + regardless of options like '-fPIC' and '-fpic'. However, as an + extension, the GNU toolchain allows executables to use absolute + accesses for locally-binding symbols. It can also use shorter GP + initialization sequences and generate direct calls to + locally-defined functions. This mode is selected by '-mno-shared'. + + '-mno-shared' depends on binutils 2.16 or higher and generates + objects that can only be linked by the GNU linker. However, the + option does not affect the ABI of the final executable; it only + affects the ABI of relocatable objects. Using '-mno-shared' + generally makes executables both smaller and quicker. + + '-mshared' is the default. + +'-mplt' +'-mno-plt' + Assume (do not assume) that the static and dynamic linkers support + PLTs and copy relocations. This option only affects '-mno-shared + -mabicalls'. For the n64 ABI, this option has no effect without + '-msym32'. + + You can make '-mplt' the default by configuring GCC with + '--with-mips-plt'. The default is '-mno-plt' otherwise. + +'-mxgot' +'-mno-xgot' + Lift (do not lift) the usual restrictions on the size of the global + offset table. + + GCC normally uses a single instruction to load values from the GOT. + While this is relatively efficient, it only works if the GOT is + smaller than about 64k. Anything larger causes the linker to + report an error such as: + + relocation truncated to fit: R_MIPS_GOT16 foobar + + If this happens, you should recompile your code with '-mxgot'. + This works with very large GOTs, although the code is also less + efficient, since it takes three instructions to fetch the value of + a global symbol. + + Note that some linkers can create multiple GOTs. If you have such + a linker, you should only need to use '-mxgot' when a single object + file accesses more than 64k's worth of GOT entries. Very few do. + + These options have no effect unless GCC is generating position + independent code. + +'-mgp32' + Assume that general-purpose registers are 32 bits wide. + +'-mgp64' + Assume that general-purpose registers are 64 bits wide. + +'-mfp32' + Assume that floating-point registers are 32 bits wide. + +'-mfp64' + Assume that floating-point registers are 64 bits wide. + +'-mhard-float' + Use floating-point coprocessor instructions. + +'-msoft-float' + Do not use floating-point coprocessor instructions. Implement + floating-point calculations using library calls instead. + +'-mno-float' + Equivalent to '-msoft-float', but additionally asserts that the + program being compiled does not perform any floating-point + operations. This option is presently supported only by some + bare-metal MIPS configurations, where it may select a special set + of libraries that lack all floating-point support (including, for + example, the floating-point 'printf' formats). If code compiled + with '-mno-float' accidentally contains floating-point operations, + it is likely to suffer a link-time or run-time failure. + +'-msingle-float' + Assume that the floating-point coprocessor only supports + single-precision operations. + +'-mdouble-float' + Assume that the floating-point coprocessor supports + double-precision operations. This is the default. + +'-mabs=2008' +'-mabs=legacy' + These options control the treatment of the special not-a-number + (NaN) IEEE 754 floating-point data with the 'abs.fmt' and 'neg.fmt' + machine instructions. + + By default or when the '-mabs=legacy' is used the legacy treatment + is selected. In this case these instructions are considered + arithmetic and avoided where correct operation is required and the + input operand might be a NaN. A longer sequence of instructions + that manipulate the sign bit of floating-point datum manually is + used instead unless the '-ffinite-math-only' option has also been + specified. + + The '-mabs=2008' option selects the IEEE 754-2008 treatment. In + this case these instructions are considered non-arithmetic and + therefore operating correctly in all cases, including in particular + where the input operand is a NaN. These instructions are therefore + always used for the respective operations. + +'-mnan=2008' +'-mnan=legacy' + These options control the encoding of the special not-a-number + (NaN) IEEE 754 floating-point data. + + The '-mnan=legacy' option selects the legacy encoding. In this + case quiet NaNs (qNaNs) are denoted by the first bit of their + trailing significand field being 0, whereas signalling NaNs (sNaNs) + are denoted by the first bit of their trailing significand field + being 1. + + The '-mnan=2008' option selects the IEEE 754-2008 encoding. In + this case qNaNs are denoted by the first bit of their trailing + significand field being 1, whereas sNaNs are denoted by the first + bit of their trailing significand field being 0. + + The default is '-mnan=legacy' unless GCC has been configured with + '--with-nan=2008'. + +'-mllsc' +'-mno-llsc' + Use (do not use) 'll', 'sc', and 'sync' instructions to implement + atomic memory built-in functions. When neither option is + specified, GCC uses the instructions if the target architecture + supports them. + + '-mllsc' is useful if the runtime environment can emulate the + instructions and '-mno-llsc' can be useful when compiling for + nonstandard ISAs. You can make either option the default by + configuring GCC with '--with-llsc' and '--without-llsc' + respectively. '--with-llsc' is the default for some + configurations; see the installation documentation for details. + +'-mdsp' +'-mno-dsp' + Use (do not use) revision 1 of the MIPS DSP ASE. *Note MIPS DSP + Built-in Functions::. This option defines the preprocessor macro + '__mips_dsp'. It also defines '__mips_dsp_rev' to 1. + +'-mdspr2' +'-mno-dspr2' + Use (do not use) revision 2 of the MIPS DSP ASE. *Note MIPS DSP + Built-in Functions::. This option defines the preprocessor macros + '__mips_dsp' and '__mips_dspr2'. It also defines '__mips_dsp_rev' + to 2. + +'-msmartmips' +'-mno-smartmips' + Use (do not use) the MIPS SmartMIPS ASE. + +'-mpaired-single' +'-mno-paired-single' + Use (do not use) paired-single floating-point instructions. *Note + MIPS Paired-Single Support::. This option requires hardware + floating-point support to be enabled. + +'-mdmx' +'-mno-mdmx' + Use (do not use) MIPS Digital Media Extension instructions. This + option can only be used when generating 64-bit code and requires + hardware floating-point support to be enabled. + +'-mips3d' +'-mno-mips3d' + Use (do not use) the MIPS-3D ASE. *Note MIPS-3D Built-in + Functions::. The option '-mips3d' implies '-mpaired-single'. + +'-mmicromips' +'-mno-micromips' + Generate (do not generate) microMIPS code. + + MicroMIPS code generation can also be controlled on a per-function + basis by means of 'micromips' and 'nomicromips' attributes. *Note + Function Attributes::, for more information. + +'-mmt' +'-mno-mt' + Use (do not use) MT Multithreading instructions. + +'-mmcu' +'-mno-mcu' + Use (do not use) the MIPS MCU ASE instructions. + +'-meva' +'-mno-eva' + Use (do not use) the MIPS Enhanced Virtual Addressing instructions. + +'-mvirt' +'-mno-virt' + Use (do not use) the MIPS Virtualization Application Specific + instructions. + +'-mlong64' + Force 'long' types to be 64 bits wide. See '-mlong32' for an + explanation of the default and the way that the pointer size is + determined. + +'-mlong32' + Force 'long', 'int', and pointer types to be 32 bits wide. + + The default size of 'int's, 'long's and pointers depends on the + ABI. All the supported ABIs use 32-bit 'int's. The n64 ABI uses + 64-bit 'long's, as does the 64-bit EABI; the others use 32-bit + 'long's. Pointers are the same size as 'long's, or the same size + as integer registers, whichever is smaller. + +'-msym32' +'-mno-sym32' + Assume (do not assume) that all symbols have 32-bit values, + regardless of the selected ABI. This option is useful in + combination with '-mabi=64' and '-mno-abicalls' because it allows + GCC to generate shorter and faster references to symbolic + addresses. + +'-G NUM' + Put definitions of externally-visible data in a small data section + if that data is no bigger than NUM bytes. GCC can then generate + more efficient accesses to the data; see '-mgpopt' for details. + + The default '-G' option depends on the configuration. + +'-mlocal-sdata' +'-mno-local-sdata' + Extend (do not extend) the '-G' behavior to local data too, such as + to static variables in C. '-mlocal-sdata' is the default for all + configurations. + + If the linker complains that an application is using too much small + data, you might want to try rebuilding the less + performance-critical parts with '-mno-local-sdata'. You might also + want to build large libraries with '-mno-local-sdata', so that the + libraries leave more room for the main program. + +'-mextern-sdata' +'-mno-extern-sdata' + Assume (do not assume) that externally-defined data is in a small + data section if the size of that data is within the '-G' limit. + '-mextern-sdata' is the default for all configurations. + + If you compile a module MOD with '-mextern-sdata' '-G NUM' + '-mgpopt', and MOD references a variable VAR that is no bigger than + NUM bytes, you must make sure that VAR is placed in a small data + section. If VAR is defined by another module, you must either + compile that module with a high-enough '-G' setting or attach a + 'section' attribute to VAR's definition. If VAR is common, you + must link the application with a high-enough '-G' setting. + + The easiest way of satisfying these restrictions is to compile and + link every module with the same '-G' option. However, you may wish + to build a library that supports several different small data + limits. You can do this by compiling the library with the highest + supported '-G' setting and additionally using '-mno-extern-sdata' + to stop the library from making assumptions about + externally-defined data. + +'-mgpopt' +'-mno-gpopt' + Use (do not use) GP-relative accesses for symbols that are known to + be in a small data section; see '-G', '-mlocal-sdata' and + '-mextern-sdata'. '-mgpopt' is the default for all configurations. + + '-mno-gpopt' is useful for cases where the '$gp' register might not + hold the value of '_gp'. For example, if the code is part of a + library that might be used in a boot monitor, programs that call + boot monitor routines pass an unknown value in '$gp'. (In such + situations, the boot monitor itself is usually compiled with + '-G0'.) + + '-mno-gpopt' implies '-mno-local-sdata' and '-mno-extern-sdata'. + +'-membedded-data' +'-mno-embedded-data' + Allocate variables to the read-only data section first if possible, + then next in the small data section if possible, otherwise in data. + This gives slightly slower code than the default, but reduces the + amount of RAM required when executing, and thus may be preferred + for some embedded systems. + +'-muninit-const-in-rodata' +'-mno-uninit-const-in-rodata' + Put uninitialized 'const' variables in the read-only data section. + This option is only meaningful in conjunction with + '-membedded-data'. + +'-mcode-readable=SETTING' + Specify whether GCC may generate code that reads from executable + sections. There are three possible settings: + + '-mcode-readable=yes' + Instructions may freely access executable sections. This is + the default setting. + + '-mcode-readable=pcrel' + MIPS16 PC-relative load instructions can access executable + sections, but other instructions must not do so. This option + is useful on 4KSc and 4KSd processors when the code TLBs have + the Read Inhibit bit set. It is also useful on processors + that can be configured to have a dual instruction/data SRAM + interface and that, like the M4K, automatically redirect + PC-relative loads to the instruction RAM. + + '-mcode-readable=no' + Instructions must not access executable sections. This option + can be useful on targets that are configured to have a dual + instruction/data SRAM interface but that (unlike the M4K) do + not automatically redirect PC-relative loads to the + instruction RAM. + +'-msplit-addresses' +'-mno-split-addresses' + Enable (disable) use of the '%hi()' and '%lo()' assembler + relocation operators. This option has been superseded by + '-mexplicit-relocs' but is retained for backwards compatibility. + +'-mexplicit-relocs' +'-mno-explicit-relocs' + Use (do not use) assembler relocation operators when dealing with + symbolic addresses. The alternative, selected by + '-mno-explicit-relocs', is to use assembler macros instead. + + '-mexplicit-relocs' is the default if GCC was configured to use an + assembler that supports relocation operators. + +'-mcheck-zero-division' +'-mno-check-zero-division' + Trap (do not trap) on integer division by zero. + + The default is '-mcheck-zero-division'. + +'-mdivide-traps' +'-mdivide-breaks' + MIPS systems check for division by zero by generating either a + conditional trap or a break instruction. Using traps results in + smaller code, but is only supported on MIPS II and later. Also, + some versions of the Linux kernel have a bug that prevents trap + from generating the proper signal ('SIGFPE'). Use '-mdivide-traps' + to allow conditional traps on architectures that support them and + '-mdivide-breaks' to force the use of breaks. + + The default is usually '-mdivide-traps', but this can be overridden + at configure time using '--with-divide=breaks'. Divide-by-zero + checks can be completely disabled using '-mno-check-zero-division'. + +'-mmemcpy' +'-mno-memcpy' + Force (do not force) the use of 'memcpy()' for non-trivial block + moves. The default is '-mno-memcpy', which allows GCC to inline + most constant-sized copies. + +'-mlong-calls' +'-mno-long-calls' + Disable (do not disable) use of the 'jal' instruction. Calling + functions using 'jal' is more efficient but requires the caller and + callee to be in the same 256 megabyte segment. + + This option has no effect on abicalls code. The default is + '-mno-long-calls'. + +'-mmad' +'-mno-mad' + Enable (disable) use of the 'mad', 'madu' and 'mul' instructions, + as provided by the R4650 ISA. + +'-mimadd' +'-mno-imadd' + Enable (disable) use of the 'madd' and 'msub' integer instructions. + The default is '-mimadd' on architectures that support 'madd' and + 'msub' except for the 74k architecture where it was found to + generate slower code. + +'-mfused-madd' +'-mno-fused-madd' + Enable (disable) use of the floating-point multiply-accumulate + instructions, when they are available. The default is + '-mfused-madd'. + + On the R8000 CPU when multiply-accumulate instructions are used, + the intermediate product is calculated to infinite precision and is + not subject to the FCSR Flush to Zero bit. This may be undesirable + in some circumstances. On other processors the result is + numerically identical to the equivalent computation using separate + multiply, add, subtract and negate instructions. + +'-nocpp' + Tell the MIPS assembler to not run its preprocessor over user + assembler files (with a '.s' suffix) when assembling them. + +'-mfix-24k' +'-mno-fix-24k' + Work around the 24K E48 (lost data on stores during refill) errata. + The workarounds are implemented by the assembler rather than by + GCC. + +'-mfix-r4000' +'-mno-fix-r4000' + Work around certain R4000 CPU errata: + - A double-word or a variable shift may give an incorrect result + if executed immediately after starting an integer division. + - A double-word or a variable shift may give an incorrect result + if executed while an integer multiplication is in progress. + - An integer division may give an incorrect result if started in + a delay slot of a taken branch or a jump. + +'-mfix-r4400' +'-mno-fix-r4400' + Work around certain R4400 CPU errata: + - A double-word or a variable shift may give an incorrect result + if executed immediately after starting an integer division. + +'-mfix-r10000' +'-mno-fix-r10000' + Work around certain R10000 errata: + - 'll'/'sc' sequences may not behave atomically on revisions + prior to 3.0. They may deadlock on revisions 2.6 and earlier. + + This option can only be used if the target architecture supports + branch-likely instructions. '-mfix-r10000' is the default when + '-march=r10000' is used; '-mno-fix-r10000' is the default + otherwise. + +'-mfix-rm7000' +'-mno-fix-rm7000' + Work around the RM7000 'dmult'/'dmultu' errata. The workarounds + are implemented by the assembler rather than by GCC. + +'-mfix-vr4120' +'-mno-fix-vr4120' + Work around certain VR4120 errata: + - 'dmultu' does not always produce the correct result. + - 'div' and 'ddiv' do not always produce the correct result if + one of the operands is negative. + The workarounds for the division errata rely on special functions + in 'libgcc.a'. At present, these functions are only provided by + the 'mips64vr*-elf' configurations. + + Other VR4120 errata require a NOP to be inserted between certain + pairs of instructions. These errata are handled by the assembler, + not by GCC itself. + +'-mfix-vr4130' + Work around the VR4130 'mflo'/'mfhi' errata. The workarounds are + implemented by the assembler rather than by GCC, although GCC + avoids using 'mflo' and 'mfhi' if the VR4130 'macc', 'macchi', + 'dmacc' and 'dmacchi' instructions are available instead. + +'-mfix-sb1' +'-mno-fix-sb1' + Work around certain SB-1 CPU core errata. (This flag currently + works around the SB-1 revision 2 "F1" and "F2" floating-point + errata.) + +'-mr10k-cache-barrier=SETTING' + Specify whether GCC should insert cache barriers to avoid the + side-effects of speculation on R10K processors. + + In common with many processors, the R10K tries to predict the + outcome of a conditional branch and speculatively executes + instructions from the "taken" branch. It later aborts these + instructions if the predicted outcome is wrong. However, on the + R10K, even aborted instructions can have side effects. + + This problem only affects kernel stores and, depending on the + system, kernel loads. As an example, a speculatively-executed + store may load the target memory into cache and mark the cache line + as dirty, even if the store itself is later aborted. If a DMA + operation writes to the same area of memory before the "dirty" line + is flushed, the cached data overwrites the DMA-ed data. See the + R10K processor manual for a full description, including other + potential problems. + + One workaround is to insert cache barrier instructions before every + memory access that might be speculatively executed and that might + have side effects even if aborted. '-mr10k-cache-barrier=SETTING' + controls GCC's implementation of this workaround. It assumes that + aborted accesses to any byte in the following regions does not have + side effects: + + 1. the memory occupied by the current function's stack frame; + + 2. the memory occupied by an incoming stack argument; + + 3. the memory occupied by an object with a link-time-constant + address. + + It is the kernel's responsibility to ensure that speculative + accesses to these regions are indeed safe. + + If the input program contains a function declaration such as: + + void foo (void); + + then the implementation of 'foo' must allow 'j foo' and 'jal foo' + to be executed speculatively. GCC honors this restriction for + functions it compiles itself. It expects non-GCC functions (such + as hand-written assembly code) to do the same. + + The option has three forms: + + '-mr10k-cache-barrier=load-store' + Insert a cache barrier before a load or store that might be + speculatively executed and that might have side effects even + if aborted. + + '-mr10k-cache-barrier=store' + Insert a cache barrier before a store that might be + speculatively executed and that might have side effects even + if aborted. + + '-mr10k-cache-barrier=none' + Disable the insertion of cache barriers. This is the default + setting. + +'-mflush-func=FUNC' +'-mno-flush-func' + Specifies the function to call to flush the I and D caches, or to + not call any such function. If called, the function must take the + same arguments as the common '_flush_func()', that is, the address + of the memory range for which the cache is being flushed, the size + of the memory range, and the number 3 (to flush both caches). The + default depends on the target GCC was configured for, but commonly + is either '_flush_func' or '__cpu_flush'. + +'mbranch-cost=NUM' + Set the cost of branches to roughly NUM "simple" instructions. + This cost is only a heuristic and is not guaranteed to produce + consistent results across releases. A zero cost redundantly + selects the default, which is based on the '-mtune' setting. + +'-mbranch-likely' +'-mno-branch-likely' + Enable or disable use of Branch Likely instructions, regardless of + the default for the selected architecture. By default, Branch + Likely instructions may be generated if they are supported by the + selected architecture. An exception is for the MIPS32 and MIPS64 + architectures and processors that implement those architectures; + for those, Branch Likely instructions are not be generated by + default because the MIPS32 and MIPS64 architectures specifically + deprecate their use. + +'-mfp-exceptions' +'-mno-fp-exceptions' + Specifies whether FP exceptions are enabled. This affects how FP + instructions are scheduled for some processors. The default is + that FP exceptions are enabled. + + For instance, on the SB-1, if FP exceptions are disabled, and we + are emitting 64-bit code, then we can use both FP pipes. + Otherwise, we can only use one FP pipe. + +'-mvr4130-align' +'-mno-vr4130-align' + The VR4130 pipeline is two-way superscalar, but can only issue two + instructions together if the first one is 8-byte aligned. When + this option is enabled, GCC aligns pairs of instructions that it + thinks should execute in parallel. + + This option only has an effect when optimizing for the VR4130. It + normally makes code faster, but at the expense of making it bigger. + It is enabled by default at optimization level '-O3'. + +'-msynci' +'-mno-synci' + Enable (disable) generation of 'synci' instructions on + architectures that support it. The 'synci' instructions (if + enabled) are generated when '__builtin___clear_cache()' is + compiled. + + This option defaults to '-mno-synci', but the default can be + overridden by configuring with '--with-synci'. + + When compiling code for single processor systems, it is generally + safe to use 'synci'. However, on many multi-core (SMP) systems, it + does not invalidate the instruction caches on all cores and may + lead to undefined behavior. + +'-mrelax-pic-calls' +'-mno-relax-pic-calls' + Try to turn PIC calls that are normally dispatched via register + '$25' into direct calls. This is only possible if the linker can + resolve the destination at link-time and if the destination is + within range for a direct call. + + '-mrelax-pic-calls' is the default if GCC was configured to use an + assembler and a linker that support the '.reloc' assembly directive + and '-mexplicit-relocs' is in effect. With '-mno-explicit-relocs', + this optimization can be performed by the assembler and the linker + alone without help from the compiler. + +'-mmcount-ra-address' +'-mno-mcount-ra-address' + Emit (do not emit) code that allows '_mcount' to modify the calling + function's return address. When enabled, this option extends the + usual '_mcount' interface with a new RA-ADDRESS parameter, which + has type 'intptr_t *' and is passed in register '$12'. '_mcount' + can then modify the return address by doing both of the following: + * Returning the new address in register '$31'. + * Storing the new address in '*RA-ADDRESS', if RA-ADDRESS is + nonnull. + + The default is '-mno-mcount-ra-address'. + + +File: gcc.info, Node: MMIX Options, Next: MN10300 Options, Prev: MIPS Options, Up: Submodel Options + +3.17.28 MMIX Options +-------------------- + +These options are defined for the MMIX: + +'-mlibfuncs' +'-mno-libfuncs' + Specify that intrinsic library functions are being compiled, + passing all values in registers, no matter the size. + +'-mepsilon' +'-mno-epsilon' + Generate floating-point comparison instructions that compare with + respect to the 'rE' epsilon register. + +'-mabi=mmixware' +'-mabi=gnu' + Generate code that passes function parameters and return values + that (in the called function) are seen as registers '$0' and up, as + opposed to the GNU ABI which uses global registers '$231' and up. + +'-mzero-extend' +'-mno-zero-extend' + When reading data from memory in sizes shorter than 64 bits, use + (do not use) zero-extending load instructions by default, rather + than sign-extending ones. + +'-mknuthdiv' +'-mno-knuthdiv' + Make the result of a division yielding a remainder have the same + sign as the divisor. With the default, '-mno-knuthdiv', the sign + of the remainder follows the sign of the dividend. Both methods + are arithmetically valid, the latter being almost exclusively used. + +'-mtoplevel-symbols' +'-mno-toplevel-symbols' + Prepend (do not prepend) a ':' to all global symbols, so the + assembly code can be used with the 'PREFIX' assembly directive. + +'-melf' + Generate an executable in the ELF format, rather than the default + 'mmo' format used by the 'mmix' simulator. + +'-mbranch-predict' +'-mno-branch-predict' + Use (do not use) the probable-branch instructions, when static + branch prediction indicates a probable branch. + +'-mbase-addresses' +'-mno-base-addresses' + Generate (do not generate) code that uses _base addresses_. Using + a base address automatically generates a request (handled by the + assembler and the linker) for a constant to be set up in a global + register. The register is used for one or more base address + requests within the range 0 to 255 from the value held in the + register. The generally leads to short and fast code, but the + number of different data items that can be addressed is limited. + This means that a program that uses lots of static data may require + '-mno-base-addresses'. + +'-msingle-exit' +'-mno-single-exit' + Force (do not force) generated code to have a single exit point in + each function. + + +File: gcc.info, Node: MN10300 Options, Next: Moxie Options, Prev: MMIX Options, Up: Submodel Options + +3.17.29 MN10300 Options +----------------------- + +These '-m' options are defined for Matsushita MN10300 architectures: + +'-mmult-bug' + Generate code to avoid bugs in the multiply instructions for the + MN10300 processors. This is the default. + +'-mno-mult-bug' + Do not generate code to avoid bugs in the multiply instructions for + the MN10300 processors. + +'-mam33' + Generate code using features specific to the AM33 processor. + +'-mno-am33' + Do not generate code using features specific to the AM33 processor. + This is the default. + +'-mam33-2' + Generate code using features specific to the AM33/2.0 processor. + +'-mam34' + Generate code using features specific to the AM34 processor. + +'-mtune=CPU-TYPE' + Use the timing characteristics of the indicated CPU type when + scheduling instructions. This does not change the targeted + processor type. The CPU type must be one of 'mn10300', 'am33', + 'am33-2' or 'am34'. + +'-mreturn-pointer-on-d0' + When generating a function that returns a pointer, return the + pointer in both 'a0' and 'd0'. Otherwise, the pointer is returned + only in 'a0', and attempts to call such functions without a + prototype result in errors. Note that this option is on by + default; use '-mno-return-pointer-on-d0' to disable it. + +'-mno-crt0' + Do not link in the C run-time initialization object file. + +'-mrelax' + Indicate to the linker that it should perform a relaxation + optimization pass to shorten branches, calls and absolute memory + addresses. This option only has an effect when used on the command + line for the final link step. + + This option makes symbolic debugging impossible. + +'-mliw' + Allow the compiler to generate _Long Instruction Word_ instructions + if the target is the 'AM33' or later. This is the default. This + option defines the preprocessor macro '__LIW__'. + +'-mnoliw' + Do not allow the compiler to generate _Long Instruction Word_ + instructions. This option defines the preprocessor macro + '__NO_LIW__'. + +'-msetlb' + Allow the compiler to generate the _SETLB_ and _Lcc_ instructions + if the target is the 'AM33' or later. This is the default. This + option defines the preprocessor macro '__SETLB__'. + +'-mnosetlb' + Do not allow the compiler to generate _SETLB_ or _Lcc_ + instructions. This option defines the preprocessor macro + '__NO_SETLB__'. + + +File: gcc.info, Node: Moxie Options, Next: MSP430 Options, Prev: MN10300 Options, Up: Submodel Options + +3.17.30 Moxie Options +--------------------- + +'-meb' + Generate big-endian code. This is the default for 'moxie-*-*' + configurations. + +'-mel' + Generate little-endian code. + +'-mno-crt0' + Do not link in the C run-time initialization object file. + + +File: gcc.info, Node: MSP430 Options, Next: NDS32 Options, Prev: Moxie Options, Up: Submodel Options + +3.17.31 MSP430 Options +---------------------- + +These options are defined for the MSP430: + +'-masm-hex' + Force assembly output to always use hex constants. Normally such + constants are signed decimals, but this option is available for + testsuite and/or aesthetic purposes. + +'-mmcu=' + Select the MCU to target. This is used to create a C preprocessor + symbol based upon the MCU name, converted to upper case and pre- + and post- fixed with '__'. This in turn will be used by the + 'msp430.h' header file to select an MCU specific supplimentary + header file. + + The option also sets the ISA to use. If the MCU name is one that + is known to only support the 430 ISA then that is selected, + otherwise the 430X ISA is selected. A generic MCU name of 'msp430' + can also be used to select the 430 ISA. Similarly the generic + 'msp430x' MCU name will select the 430X ISA. + + In addition an MCU specific linker script will be added to the + linker command line. The script's name is the name of the MCU with + '.ld' appended. Thus specifying '-mmcu=xxx' on the gcc command + line will define the C preprocessor symbol '__XXX__' and cause the + linker to search for a script called 'xxx.ld'. + + This option is also passed on to the assembler. + +'-mcpu=' + Specifies the ISA to use. Accepted values are 'msp430', 'msp430x' + and 'msp430xv2'. This option is deprecated. The '-mmcu=' option + should be used to select the ISA. + +'-msim' + Link to the simulator runtime libraries and linker script. + Overrides any scripts that would be selected by the '-mmcu=' + option. + +'-mlarge' + Use large-model addressing (20-bit pointers, 32-bit 'size_t'). + +'-msmall' + Use small-model addressing (16-bit pointers, 16-bit 'size_t'). + +'-mrelax' + This option is passed to the assembler and linker, and allows the + linker to perform certain optimizations that cannot be done until + the final link. + + +File: gcc.info, Node: NDS32 Options, Next: Nios II Options, Prev: MSP430 Options, Up: Submodel Options + +3.17.32 NDS32 Options +--------------------- + +These options are defined for NDS32 implementations: + +'-mbig-endian' + Generate code in big-endian mode. + +'-mlittle-endian' + Generate code in little-endian mode. + +'-mreduced-regs' + Use reduced-set registers for register allocation. + +'-mfull-regs' + Use full-set registers for register allocation. + +'-mcmov' + Generate conditional move instructions. + +'-mno-cmov' + Do not generate conditional move instructions. + +'-mperf-ext' + Generate performance extension instructions. + +'-mno-perf-ext' + Do not generate performance extension instructions. + +'-mv3push' + Generate v3 push25/pop25 instructions. + +'-mno-v3push' + Do not generate v3 push25/pop25 instructions. + +'-m16-bit' + Generate 16-bit instructions. + +'-mno-16-bit' + Do not generate 16-bit instructions. + +'-mgp-direct' + Generate GP base instructions directly. + +'-mno-gp-direct' + Do no generate GP base instructions directly. + +'-misr-vector-size=NUM' + Specify the size of each interrupt vector, which must be 4 or 16. + +'-mcache-block-size=NUM' + Specify the size of each cache block, which must be a power of 2 + between 4 and 512. + +'-march=ARCH' + Specify the name of the target architecture. + +'-mforce-fp-as-gp' + Prevent $fp being allocated during register allocation so that + compiler is able to force performing fp-as-gp optimization. + +'-mforbid-fp-as-gp' + Forbid using $fp to access static and global variables. This + option strictly forbids fp-as-gp optimization regardless of + '-mforce-fp-as-gp'. + +'-mex9' + Use special directives to guide linker doing ex9 optimization. + +'-mctor-dtor' + Enable constructor/destructor feature. + +'-mrelax' + Guide linker to relax instructions. + + +File: gcc.info, Node: Nios II Options, Next: PDP-11 Options, Prev: NDS32 Options, Up: Submodel Options + +3.17.33 Nios II Options +----------------------- + +These are the options defined for the Altera Nios II processor. + +'-G NUM' + Put global and static objects less than or equal to NUM bytes into + the small data or BSS sections instead of the normal data or BSS + sections. The default value of NUM is 8. + +'-mgpopt' +'-mno-gpopt' + Generate (do not generate) GP-relative accesses for objects in the + small data or BSS sections. The default is '-mgpopt' except when + '-fpic' or '-fPIC' is specified to generate position-independent + code. Note that the Nios II ABI does not permit GP-relative + accesses from shared libraries. + + You may need to specify '-mno-gpopt' explicitly when building + programs that include large amounts of small data, including large + GOT data sections. In this case, the 16-bit offset for GP-relative + addressing may not be large enough to allow access to the entire + small data section. + +'-mel' +'-meb' + Generate little-endian (default) or big-endian (experimental) code, + respectively. + +'-mbypass-cache' +'-mno-bypass-cache' + Force all load and store instructions to always bypass cache by + using I/O variants of the instructions. The default is not to + bypass the cache. + +'-mno-cache-volatile' +'-mcache-volatile' + Volatile memory access bypass the cache using the I/O variants of + the load and store instructions. The default is not to bypass the + cache. + +'-mno-fast-sw-div' +'-mfast-sw-div' + Do not use table-based fast divide for small numbers. The default + is to use the fast divide at '-O3' and above. + +'-mno-hw-mul' +'-mhw-mul' +'-mno-hw-mulx' +'-mhw-mulx' +'-mno-hw-div' +'-mhw-div' + Enable or disable emitting 'mul', 'mulx' and 'div' family of + instructions by the compiler. The default is to emit 'mul' and not + emit 'div' and 'mulx'. + +'-mcustom-INSN=N' +'-mno-custom-INSN' + Each '-mcustom-INSN=N' option enables use of a custom instruction + with encoding N when generating code that uses INSN. For example, + '-mcustom-fadds=253' generates custom instruction 253 for + single-precision floating-point add operations instead of the + default behavior of using a library call. + + The following values of INSN are supported. Except as otherwise + noted, floating-point operations are expected to be implemented + with normal IEEE 754 semantics and correspond directly to the C + operators or the equivalent GCC built-in functions (*note Other + Builtins::). + + Single-precision floating point: + + 'fadds', 'fsubs', 'fdivs', 'fmuls' + Binary arithmetic operations. + + 'fnegs' + Unary negation. + + 'fabss' + Unary absolute value. + + 'fcmpeqs', 'fcmpges', 'fcmpgts', 'fcmples', 'fcmplts', 'fcmpnes' + Comparison operations. + + 'fmins', 'fmaxs' + Floating-point minimum and maximum. These instructions are + only generated if '-ffinite-math-only' is specified. + + 'fsqrts' + Unary square root operation. + + 'fcoss', 'fsins', 'ftans', 'fatans', 'fexps', 'flogs' + Floating-point trigonometric and exponential functions. These + instructions are only generated if + '-funsafe-math-optimizations' is also specified. + + Double-precision floating point: + + 'faddd', 'fsubd', 'fdivd', 'fmuld' + Binary arithmetic operations. + + 'fnegd' + Unary negation. + + 'fabsd' + Unary absolute value. + + 'fcmpeqd', 'fcmpged', 'fcmpgtd', 'fcmpled', 'fcmpltd', 'fcmpned' + Comparison operations. + + 'fmind', 'fmaxd' + Double-precision minimum and maximum. These instructions are + only generated if '-ffinite-math-only' is specified. + + 'fsqrtd' + Unary square root operation. + + 'fcosd', 'fsind', 'ftand', 'fatand', 'fexpd', 'flogd' + Double-precision trigonometric and exponential functions. + These instructions are only generated if + '-funsafe-math-optimizations' is also specified. + + Conversions: + 'fextsd' + Conversion from single precision to double precision. + + 'ftruncds' + Conversion from double precision to single precision. + + 'fixsi', 'fixsu', 'fixdi', 'fixdu' + Conversion from floating point to signed or unsigned integer + types, with truncation towards zero. + + 'floatis', 'floatus', 'floatid', 'floatud' + Conversion from signed or unsigned integer types to + floating-point types. + + In addition, all of the following transfer instructions for + internal registers X and Y must be provided to use any of the + double-precision floating-point instructions. Custom instructions + taking two double-precision source operands expect the first + operand in the 64-bit register X. The other operand (or only + operand of a unary operation) is given to the custom arithmetic + instruction with the least significant half in source register SRC1 + and the most significant half in SRC2. A custom instruction that + returns a double-precision result returns the most significant 32 + bits in the destination register and the other half in 32-bit + register Y. GCC automatically generates the necessary code + sequences to write register X and/or read register Y when + double-precision floating-point instructions are used. + + 'fwrx' + Write SRC1 into the least significant half of X and SRC2 into + the most significant half of X. + + 'fwry' + Write SRC1 into Y. + + 'frdxhi', 'frdxlo' + Read the most or least (respectively) significant half of X + and store it in DEST. + + 'frdy' + Read the value of Y and store it into DEST. + + Note that you can gain more local control over generation of Nios + II custom instructions by using the 'target("custom-INSN=N")' and + 'target("no-custom-INSN")' function attributes (*note Function + Attributes::) or pragmas (*note Function Specific Option + Pragmas::). + +'-mcustom-fpu-cfg=NAME' + + This option enables a predefined, named set of custom instruction + encodings (see '-mcustom-INSN' above). Currently, the following + sets are defined: + + '-mcustom-fpu-cfg=60-1' is equivalent to: + -mcustom-fmuls=252 + -mcustom-fadds=253 + -mcustom-fsubs=254 + -fsingle-precision-constant + + '-mcustom-fpu-cfg=60-2' is equivalent to: + -mcustom-fmuls=252 + -mcustom-fadds=253 + -mcustom-fsubs=254 + -mcustom-fdivs=255 + -fsingle-precision-constant + + '-mcustom-fpu-cfg=72-3' is equivalent to: + -mcustom-floatus=243 + -mcustom-fixsi=244 + -mcustom-floatis=245 + -mcustom-fcmpgts=246 + -mcustom-fcmples=249 + -mcustom-fcmpeqs=250 + -mcustom-fcmpnes=251 + -mcustom-fmuls=252 + -mcustom-fadds=253 + -mcustom-fsubs=254 + -mcustom-fdivs=255 + -fsingle-precision-constant + + Custom instruction assignments given by individual '-mcustom-INSN=' + options override those given by '-mcustom-fpu-cfg=', regardless of + the order of the options on the command line. + + Note that you can gain more local control over selection of a FPU + configuration by using the 'target("custom-fpu-cfg=NAME")' function + attribute (*note Function Attributes::) or pragma (*note Function + Specific Option Pragmas::). + + These additional '-m' options are available for the Altera Nios II ELF +(bare-metal) target: + +'-mhal' + Link with HAL BSP. This suppresses linking with the GCC-provided C + runtime startup and termination code, and is typically used in + conjunction with '-msys-crt0=' to specify the location of the + alternate startup code provided by the HAL BSP. + +'-msmallc' + Link with a limited version of the C library, '-lsmallc', rather + than Newlib. + +'-msys-crt0=STARTFILE' + STARTFILE is the file name of the startfile (crt0) to use when + linking. This option is only useful in conjunction with '-mhal'. + +'-msys-lib=SYSTEMLIB' + SYSTEMLIB is the library name of the library that provides + low-level system calls required by the C library, e.g. 'read' and + 'write'. This option is typically used to link with a library + provided by a HAL BSP. + + +File: gcc.info, Node: PDP-11 Options, Next: picoChip Options, Prev: Nios II Options, Up: Submodel Options + +3.17.34 PDP-11 Options +---------------------- + +These options are defined for the PDP-11: + +'-mfpu' + Use hardware FPP floating point. This is the default. (FIS + floating point on the PDP-11/40 is not supported.) + +'-msoft-float' + Do not use hardware floating point. + +'-mac0' + Return floating-point results in ac0 (fr0 in Unix assembler + syntax). + +'-mno-ac0' + Return floating-point results in memory. This is the default. + +'-m40' + Generate code for a PDP-11/40. + +'-m45' + Generate code for a PDP-11/45. This is the default. + +'-m10' + Generate code for a PDP-11/10. + +'-mbcopy-builtin' + Use inline 'movmemhi' patterns for copying memory. This is the + default. + +'-mbcopy' + Do not use inline 'movmemhi' patterns for copying memory. + +'-mint16' +'-mno-int32' + Use 16-bit 'int'. This is the default. + +'-mint32' +'-mno-int16' + Use 32-bit 'int'. + +'-mfloat64' +'-mno-float32' + Use 64-bit 'float'. This is the default. + +'-mfloat32' +'-mno-float64' + Use 32-bit 'float'. + +'-mabshi' + Use 'abshi2' pattern. This is the default. + +'-mno-abshi' + Do not use 'abshi2' pattern. + +'-mbranch-expensive' + Pretend that branches are expensive. This is for experimenting + with code generation only. + +'-mbranch-cheap' + Do not pretend that branches are expensive. This is the default. + +'-munix-asm' + Use Unix assembler syntax. This is the default when configured for + 'pdp11-*-bsd'. + +'-mdec-asm' + Use DEC assembler syntax. This is the default when configured for + any PDP-11 target other than 'pdp11-*-bsd'. + + +File: gcc.info, Node: picoChip Options, Next: PowerPC Options, Prev: PDP-11 Options, Up: Submodel Options + +3.17.35 picoChip Options +------------------------ + +These '-m' options are defined for picoChip implementations: + +'-mae=AE_TYPE' + Set the instruction set, register set, and instruction scheduling + parameters for array element type AE_TYPE. Supported values for + AE_TYPE are 'ANY', 'MUL', and 'MAC'. + + '-mae=ANY' selects a completely generic AE type. Code generated + with this option runs on any of the other AE types. The code is + not as efficient as it would be if compiled for a specific AE type, + and some types of operation (e.g., multiplication) do not work + properly on all types of AE. + + '-mae=MUL' selects a MUL AE type. This is the most useful AE type + for compiled code, and is the default. + + '-mae=MAC' selects a DSP-style MAC AE. Code compiled with this + option may suffer from poor performance of byte (char) + manipulation, since the DSP AE does not provide hardware support + for byte load/stores. + +'-msymbol-as-address' + Enable the compiler to directly use a symbol name as an address in + a load/store instruction, without first loading it into a register. + Typically, the use of this option generates larger programs, which + run faster than when the option isn't used. However, the results + vary from program to program, so it is left as a user option, + rather than being permanently enabled. + +'-mno-inefficient-warnings' + Disables warnings about the generation of inefficient code. These + warnings can be generated, for example, when compiling code that + performs byte-level memory operations on the MAC AE type. The MAC + AE has no hardware support for byte-level memory operations, so all + byte load/stores must be synthesized from word load/store + operations. This is inefficient and a warning is generated to + indicate that you should rewrite the code to avoid byte operations, + or to target an AE type that has the necessary hardware support. + This option disables these warnings. + + +File: gcc.info, Node: PowerPC Options, Next: RL78 Options, Prev: picoChip Options, Up: Submodel Options + +3.17.36 PowerPC Options +----------------------- + +These are listed under *Note RS/6000 and PowerPC Options::. + + +File: gcc.info, Node: RL78 Options, Next: RS/6000 and PowerPC Options, Prev: PowerPC Options, Up: Submodel Options + +3.17.37 RL78 Options +-------------------- + +'-msim' + Links in additional target libraries to support operation within a + simulator. + +'-mmul=none' +'-mmul=g13' +'-mmul=rl78' + Specifies the type of hardware multiplication support to be used. + The default is 'none', which uses software multiplication + functions. The 'g13' option is for the hardware multiply/divide + peripheral only on the RL78/G13 targets. The 'rl78' option is for + the standard hardware multiplication defined in the RL78 software + manual. + + +File: gcc.info, Node: RS/6000 and PowerPC Options, Next: RX Options, Prev: RL78 Options, Up: Submodel Options + +3.17.38 IBM RS/6000 and PowerPC Options +--------------------------------------- + +These '-m' options are defined for the IBM RS/6000 and PowerPC: +'-mpowerpc-gpopt' +'-mno-powerpc-gpopt' +'-mpowerpc-gfxopt' +'-mno-powerpc-gfxopt' +'-mpowerpc64' +'-mno-powerpc64' +'-mmfcrf' +'-mno-mfcrf' +'-mpopcntb' +'-mno-popcntb' +'-mpopcntd' +'-mno-popcntd' +'-mfprnd' +'-mno-fprnd' +'-mcmpb' +'-mno-cmpb' +'-mmfpgpr' +'-mno-mfpgpr' +'-mhard-dfp' +'-mno-hard-dfp' + You use these options to specify which instructions are available + on the processor you are using. The default value of these options + is determined when configuring GCC. Specifying the + '-mcpu=CPU_TYPE' overrides the specification of these options. We + recommend you use the '-mcpu=CPU_TYPE' option rather than the + options listed above. + + Specifying '-mpowerpc-gpopt' allows GCC to use the optional PowerPC + architecture instructions in the General Purpose group, including + floating-point square root. Specifying '-mpowerpc-gfxopt' allows + GCC to use the optional PowerPC architecture instructions in the + Graphics group, including floating-point select. + + The '-mmfcrf' option allows GCC to generate the move from condition + register field instruction implemented on the POWER4 processor and + other processors that support the PowerPC V2.01 architecture. The + '-mpopcntb' option allows GCC to generate the popcount and + double-precision FP reciprocal estimate instruction implemented on + the POWER5 processor and other processors that support the PowerPC + V2.02 architecture. The '-mpopcntd' option allows GCC to generate + the popcount instruction implemented on the POWER7 processor and + other processors that support the PowerPC V2.06 architecture. The + '-mfprnd' option allows GCC to generate the FP round to integer + instructions implemented on the POWER5+ processor and other + processors that support the PowerPC V2.03 architecture. The + '-mcmpb' option allows GCC to generate the compare bytes + instruction implemented on the POWER6 processor and other + processors that support the PowerPC V2.05 architecture. The + '-mmfpgpr' option allows GCC to generate 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. The '-mhard-dfp' option allows GCC to generate + the decimal floating-point instructions implemented on some POWER + processors. + + The '-mpowerpc64' option allows GCC to generate the additional + 64-bit instructions that are found in the full PowerPC64 + architecture and to treat GPRs as 64-bit, doubleword quantities. + GCC defaults to '-mno-powerpc64'. + +'-mcpu=CPU_TYPE' + Set architecture type, register usage, and instruction scheduling + parameters for machine type CPU_TYPE. Supported values for + CPU_TYPE are '401', '403', '405', '405fp', '440', '440fp', '464', + '464fp', '476', '476fp', '505', '601', '602', '603', '603e', '604', + '604e', '620', '630', '740', '7400', '7450', '750', '801', '821', + '823', '860', '970', '8540', 'a2', 'e300c2', 'e300c3', 'e500mc', + 'e500mc64', 'e5500', 'e6500', 'ec603e', 'G3', 'G4', 'G5', 'titan', + 'power3', 'power4', 'power5', 'power5+', 'power6', 'power6x', + 'power7', 'power8', 'powerpc', 'powerpc64', and 'rs64'. + + '-mcpu=powerpc', and '-mcpu=powerpc64' specify pure 32-bit PowerPC + and 64-bit PowerPC architecture machine types, with an appropriate, + generic processor model assumed for scheduling purposes. + + The other options specify a specific processor. Code generated + under those options runs best on that processor, and may not run at + all on others. + + The '-mcpu' options automatically enable or disable the following + options: + + -maltivec -mfprnd -mhard-float -mmfcrf -mmultiple + -mpopcntb -mpopcntd -mpowerpc64 + -mpowerpc-gpopt -mpowerpc-gfxopt -msingle-float -mdouble-float + -msimple-fpu -mstring -mmulhw -mdlmzb -mmfpgpr -mvsx + -mcrypto -mdirect-move -mpower8-fusion -mpower8-vector + -mquad-memory -mquad-memory-atomic + + The particular options set for any particular CPU varies between + compiler versions, depending on what setting seems to produce + optimal code for that CPU; it doesn't necessarily reflect the + actual hardware's capabilities. If you wish to set an individual + option to a particular value, you may specify it after the '-mcpu' + option, like '-mcpu=970 -mno-altivec'. + + On AIX, the '-maltivec' and '-mpowerpc64' options are not enabled + or disabled by the '-mcpu' option at present because AIX does not + have full support for these options. You may still enable or + disable them individually if you're sure it'll work in your + environment. + +'-mtune=CPU_TYPE' + Set the instruction scheduling parameters for machine type + CPU_TYPE, but do not set the architecture type or register usage, + as '-mcpu=CPU_TYPE' does. The same values for CPU_TYPE are used + for '-mtune' as for '-mcpu'. If both are specified, the code + generated uses the architecture and registers set by '-mcpu', but + the scheduling parameters set by '-mtune'. + +'-mcmodel=small' + Generate PowerPC64 code for the small model: The TOC is limited to + 64k. + +'-mcmodel=medium' + Generate PowerPC64 code for the medium model: The TOC and other + static data may be up to a total of 4G in size. + +'-mcmodel=large' + Generate PowerPC64 code for the large model: The TOC may be up to + 4G in size. Other data and code is only limited by the 64-bit + address space. + +'-maltivec' +'-mno-altivec' + Generate code that uses (does not use) AltiVec instructions, and + also enable the use of built-in functions that allow more direct + access to the AltiVec instruction set. You may also need to set + '-mabi=altivec' to adjust the current ABI with AltiVec ABI + enhancements. + + When '-maltivec' is used, rather than '-maltivec=le' or + '-maltivec=be', the element order for Altivec intrinsics such as + 'vec_splat', 'vec_extract', and 'vec_insert' will match array + element order corresponding to the endianness of the target. That + is, element zero identifies the leftmost element in a vector + register when targeting a big-endian platform, and identifies the + rightmost element in a vector register when targeting a + little-endian platform. + +'-maltivec=be' + Generate Altivec instructions using big-endian element order, + regardless of whether the target is big- or little-endian. This is + the default when targeting a big-endian platform. + + The element order is used to interpret element numbers in Altivec + intrinsics such as 'vec_splat', 'vec_extract', and 'vec_insert'. + By default, these will match array element order corresponding to + the endianness for the target. + +'-maltivec=le' + Generate Altivec instructions using little-endian element order, + regardless of whether the target is big- or little-endian. This is + the default when targeting a little-endian platform. This option + is currently ignored when targeting a big-endian platform. + + The element order is used to interpret element numbers in Altivec + intrinsics such as 'vec_splat', 'vec_extract', and 'vec_insert'. + By default, these will match array element order corresponding to + the endianness for the target. + +'-mvrsave' +'-mno-vrsave' + Generate VRSAVE instructions when generating AltiVec code. + +'-mgen-cell-microcode' + Generate Cell microcode instructions. + +'-mwarn-cell-microcode' + Warn when a Cell microcode instruction is emitted. An example of a + Cell microcode instruction is a variable shift. + +'-msecure-plt' + Generate code that allows 'ld' and 'ld.so' to build executables and + shared libraries with non-executable '.plt' and '.got' sections. + This is a PowerPC 32-bit SYSV ABI option. + +'-mbss-plt' + Generate code that uses a BSS '.plt' section that 'ld.so' fills in, + and requires '.plt' and '.got' sections that are both writable and + executable. This is a PowerPC 32-bit SYSV ABI option. + +'-misel' +'-mno-isel' + This switch enables or disables the generation of ISEL + instructions. + +'-misel=YES/NO' + This switch has been deprecated. Use '-misel' and '-mno-isel' + instead. + +'-mspe' +'-mno-spe' + This switch enables or disables the generation of SPE simd + instructions. + +'-mpaired' +'-mno-paired' + This switch enables or disables the generation of PAIRED simd + instructions. + +'-mspe=YES/NO' + This option has been deprecated. Use '-mspe' and '-mno-spe' + instead. + +'-mvsx' +'-mno-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. + +'-mcrypto' +'-mno-crypto' + Enable the use (disable) of the built-in functions that allow + direct access to the cryptographic instructions that were added in + version 2.07 of the PowerPC ISA. + +'-mdirect-move' +'-mno-direct-move' + Generate code that uses (does not use) the instructions to move + data between the general purpose registers and the vector/scalar + (VSX) registers that were added in version 2.07 of the PowerPC ISA. + +'-mpower8-fusion' +'-mno-power8-fusion' + Generate code that keeps (does not keeps) some integer operations + adjacent so that the instructions can be fused together on power8 + and later processors. + +'-mpower8-vector' +'-mno-power8-vector' + Generate code that uses (does not use) the vector and scalar + instructions that were added in version 2.07 of the PowerPC ISA. + Also enable the use of built-in functions that allow more direct + access to the vector instructions. + +'-mquad-memory' +'-mno-quad-memory' + Generate code that uses (does not use) the non-atomic quad word + memory instructions. The '-mquad-memory' option requires use of + 64-bit mode. + +'-mquad-memory-atomic' +'-mno-quad-memory-atomic' + Generate code that uses (does not use) the atomic quad word memory + instructions. The '-mquad-memory-atomic' option requires use of + 64-bit mode. + +'-mfloat-gprs=YES/SINGLE/DOUBLE/NO' +'-mfloat-gprs' + This switch enables or disables the generation of floating-point + operations on the general-purpose registers for architectures that + support it. + + The argument YES or SINGLE enables the use of single-precision + floating-point operations. + + The argument DOUBLE enables the use of single and double-precision + floating-point operations. + + The argument NO disables floating-point operations on the + general-purpose registers. + + This option is currently only available on the MPC854x. + +'-m32' +'-m64' + Generate code for 32-bit or 64-bit environments of Darwin and SVR4 + targets (including GNU/Linux). The 32-bit environment sets int, + long and pointer to 32 bits and generates code that runs on any + PowerPC variant. The 64-bit environment sets int to 32 bits and + long and pointer to 64 bits, and generates code for PowerPC64, as + for '-mpowerpc64'. + +'-mfull-toc' +'-mno-fp-in-toc' +'-mno-sum-in-toc' +'-mminimal-toc' + Modify generation of the TOC (Table Of Contents), which is created + for every executable file. The '-mfull-toc' option is selected by + default. In that case, GCC allocates at least one TOC entry for + each unique non-automatic variable reference in your program. GCC + also places floating-point constants in the TOC. However, only + 16,384 entries are available in the TOC. + + If you receive a linker error message that saying you have + overflowed the available TOC space, you can reduce the amount of + TOC space used with the '-mno-fp-in-toc' and '-mno-sum-in-toc' + options. '-mno-fp-in-toc' prevents GCC from putting floating-point + constants in the TOC and '-mno-sum-in-toc' forces GCC to generate + code to calculate the sum of an address and a constant at run time + instead of putting that sum into the TOC. You may specify one or + both of these options. Each causes GCC to produce very slightly + slower and larger code at the expense of conserving TOC space. + + If you still run out of space in the TOC even when you specify both + of these options, specify '-mminimal-toc' instead. This option + causes GCC to make only one TOC entry for every file. When you + specify this option, GCC produces code that is slower and larger + but which uses extremely little TOC space. You may wish to use + this option only on files that contain less frequently-executed + code. + +'-maix64' +'-maix32' + Enable 64-bit AIX ABI and calling convention: 64-bit pointers, + 64-bit 'long' type, and the infrastructure needed to support them. + Specifying '-maix64' implies '-mpowerpc64', while '-maix32' + disables the 64-bit ABI and implies '-mno-powerpc64'. GCC defaults + to '-maix32'. + +'-mxl-compat' +'-mno-xl-compat' + Produce code that conforms more closely to IBM XL compiler + semantics when using AIX-compatible ABI. Pass floating-point + arguments to prototyped functions beyond the register save area + (RSA) on the stack in addition to argument FPRs. Do not assume + that most significant double in 128-bit long double value is + properly rounded when comparing values and converting to double. + Use XL symbol names for long double support routines. + + The AIX calling convention was extended but not initially + documented to handle an obscure K&R C case of calling a function + that takes the address of its arguments with fewer arguments than + declared. IBM XL compilers access floating-point arguments that do + not fit in the RSA from the stack when a subroutine is compiled + without optimization. Because always storing floating-point + arguments on the stack is inefficient and rarely needed, this + option is not enabled by default and only is necessary when calling + subroutines compiled by IBM XL compilers without optimization. + +'-mpe' + Support "IBM RS/6000 SP" "Parallel Environment" (PE). Link an + application written to use message passing with special startup + code to enable the application to run. The system must have PE + installed in the standard location ('/usr/lpp/ppe.poe/'), or the + 'specs' file must be overridden with the '-specs=' option to + specify the appropriate directory location. The Parallel + Environment does not support threads, so the '-mpe' option and the + '-pthread' option are incompatible. + +'-malign-natural' +'-malign-power' + On AIX, 32-bit Darwin, and 64-bit PowerPC GNU/Linux, the option + '-malign-natural' overrides the ABI-defined alignment of larger + types, such as floating-point doubles, on their natural size-based + boundary. The option '-malign-power' instructs GCC to follow the + ABI-specified alignment rules. GCC defaults to the standard + alignment defined in the ABI. + + On 64-bit Darwin, natural alignment is the default, and + '-malign-power' is not supported. + +'-msoft-float' +'-mhard-float' + Generate code that does not use (uses) the floating-point register + set. Software floating-point emulation is provided if you use the + '-msoft-float' option, and pass the option to GCC when linking. + +'-msingle-float' +'-mdouble-float' + Generate code for single- or double-precision floating-point + operations. '-mdouble-float' implies '-msingle-float'. + +'-msimple-fpu' + Do not generate 'sqrt' and 'div' instructions for hardware + floating-point unit. + +'-mfpu=NAME' + Specify type of floating-point unit. Valid values for NAME are + 'sp_lite' (equivalent to '-msingle-float -msimple-fpu'), 'dp_lite' + (equivalent to '-mdouble-float -msimple-fpu'), 'sp_full' + (equivalent to '-msingle-float'), and 'dp_full' (equivalent to + '-mdouble-float'). + +'-mxilinx-fpu' + Perform optimizations for the floating-point unit on Xilinx PPC + 405/440. + +'-mmultiple' +'-mno-multiple' + Generate code that uses (does not use) the load multiple word + instructions and the store multiple word instructions. These + instructions are generated by default on POWER systems, and not + generated on PowerPC systems. Do not use '-mmultiple' on + little-endian PowerPC systems, since those instructions do not work + when the processor is in little-endian mode. The exceptions are + PPC740 and PPC750 which permit these instructions in little-endian + mode. + +'-mstring' +'-mno-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. These instructions are generated by + default on POWER systems, and not generated on PowerPC systems. Do + not use '-mstring' on little-endian PowerPC systems, since those + instructions do not work when the processor is in little-endian + mode. The exceptions are PPC740 and PPC750 which permit these + instructions in little-endian mode. + +'-mupdate' +'-mno-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. These instructions are generated by + default. If you use '-mno-update', there is a small window between + the time that the stack pointer is updated and the address of the + previous frame is stored, which means code that walks the stack + frame across interrupts or signals may get corrupted data. + +'-mavoid-indexed-addresses' +'-mno-avoid-indexed-addresses' + Generate code that tries to avoid (not avoid) the use of indexed + load or store instructions. These instructions can incur a + performance penalty on Power6 processors in certain situations, + such as when stepping through large arrays that cross a 16M + boundary. This option is enabled by default when targeting Power6 + and disabled otherwise. + +'-mfused-madd' +'-mno-fused-madd' + Generate code that uses (does not use) the floating-point multiply + and accumulate instructions. These instructions are generated by + default if hardware floating point is used. The machine-dependent + '-mfused-madd' option is now mapped to the machine-independent + '-ffp-contract=fast' option, and '-mno-fused-madd' is mapped to + '-ffp-contract=off'. + +'-mmulhw' +'-mno-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. + +'-mdlmzb' +'-mno-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. + +'-mno-bit-align' +'-mbit-align' + On System V.4 and embedded PowerPC systems do not (do) force + structures and unions that contain bit-fields to be aligned to the + base type of the bit-field. + + For example, by default a structure containing nothing but 8 + 'unsigned' bit-fields of length 1 is aligned to a 4-byte boundary + and has a size of 4 bytes. By using '-mno-bit-align', the + structure is aligned to a 1-byte boundary and is 1 byte in size. + +'-mno-strict-align' +'-mstrict-align' + On System V.4 and embedded PowerPC systems do not (do) assume that + unaligned memory references are handled by the system. + +'-mrelocatable' +'-mno-relocatable' + Generate code that allows (does not allow) a static executable to + be relocated to a different address at run time. A simple embedded + PowerPC system loader should relocate the entire contents of + '.got2' and 4-byte locations listed in the '.fixup' section, a + table of 32-bit addresses generated by this option. For this to + work, all objects linked together must be compiled with + '-mrelocatable' or '-mrelocatable-lib'. '-mrelocatable' code + aligns the stack to an 8-byte boundary. + +'-mrelocatable-lib' +'-mno-relocatable-lib' + Like '-mrelocatable', '-mrelocatable-lib' generates a '.fixup' + section to allow static executables to be relocated at run time, + but '-mrelocatable-lib' does not use the smaller stack alignment of + '-mrelocatable'. Objects compiled with '-mrelocatable-lib' may be + linked with objects compiled with any combination of the + '-mrelocatable' options. + +'-mno-toc' +'-mtoc' + On System V.4 and embedded PowerPC systems do not (do) assume that + register 2 contains a pointer to a global area pointing to the + addresses used in the program. + +'-mlittle' +'-mlittle-endian' + On System V.4 and embedded PowerPC systems compile code for the + processor in little-endian mode. The '-mlittle-endian' option is + the same as '-mlittle'. + +'-mbig' +'-mbig-endian' + On System V.4 and embedded PowerPC systems compile code for the + processor in big-endian mode. The '-mbig-endian' option is the + same as '-mbig'. + +'-mdynamic-no-pic' + On Darwin and Mac OS X systems, compile code so that it is not + relocatable, but that its external references are relocatable. The + resulting code is suitable for applications, but not shared + libraries. + +'-msingle-pic-base' + Treat the register used for PIC addressing as read-only, rather + than loading it in the prologue for each function. The runtime + system is responsible for initializing this register with an + appropriate value before execution begins. + +'-mprioritize-restricted-insns=PRIORITY' + This option controls the priority that is assigned to dispatch-slot + restricted instructions during the second scheduling pass. The + argument PRIORITY takes the value '0', '1', or '2' to assign no, + highest, or second-highest (respectively) priority to dispatch-slot + restricted instructions. + +'-msched-costly-dep=DEPENDENCE_TYPE' + This option controls which dependences are considered costly by the + target during instruction scheduling. The argument DEPENDENCE_TYPE + takes one of the following values: + + 'no' + No dependence is costly. + + 'all' + All dependences are costly. + + 'true_store_to_load' + A true dependence from store to load is costly. + + 'store_to_load' + Any dependence from store to load is costly. + + NUMBER + Any dependence for which the latency is greater than or equal + to NUMBER is costly. + +'-minsert-sched-nops=SCHEME' + This option controls which NOP insertion scheme is used during the + second scheduling pass. The argument SCHEME takes one of the + following values: + + 'no' + Don't insert NOPs. + + 'pad' + Pad with NOPs any dispatch group that has vacant issue slots, + according to the scheduler's grouping. + + 'regroup_exact' + Insert NOPs to force costly dependent insns into separate + groups. Insert exactly as many NOPs as needed to force an + insn to a new group, according to the estimated processor + grouping. + + NUMBER + Insert NOPs to force costly dependent insns into separate + groups. Insert NUMBER NOPs to force an insn to a new group. + +'-mcall-sysv' + On System V.4 and embedded PowerPC systems compile code using + calling conventions that adhere to the March 1995 draft of the + System V Application Binary Interface, PowerPC processor + supplement. This is the default unless you configured GCC using + 'powerpc-*-eabiaix'. + +'-mcall-sysv-eabi' +'-mcall-eabi' + Specify both '-mcall-sysv' and '-meabi' options. + +'-mcall-sysv-noeabi' + Specify both '-mcall-sysv' and '-mno-eabi' options. + +'-mcall-aixdesc' + On System V.4 and embedded PowerPC systems compile code for the AIX + operating system. + +'-mcall-linux' + On System V.4 and embedded PowerPC systems compile code for the + Linux-based GNU system. + +'-mcall-freebsd' + On System V.4 and embedded PowerPC systems compile code for the + FreeBSD operating system. + +'-mcall-netbsd' + On System V.4 and embedded PowerPC systems compile code for the + NetBSD operating system. + +'-mcall-openbsd' + On System V.4 and embedded PowerPC systems compile code for the + OpenBSD operating system. + +'-maix-struct-return' + Return all structures in memory (as specified by the AIX ABI). + +'-msvr4-struct-return' + Return structures smaller than 8 bytes in registers (as specified + by the SVR4 ABI). + +'-mabi=ABI-TYPE' + Extend the current ABI with a particular extension, or remove such + extension. Valid values are ALTIVEC, NO-ALTIVEC, SPE, NO-SPE, + IBMLONGDOUBLE, IEEELONGDOUBLE, ELFV1, ELFV2. + +'-mabi=spe' + Extend the current ABI with SPE ABI extensions. This does not + change the default ABI, instead it adds the SPE ABI extensions to + the current ABI. + +'-mabi=no-spe' + Disable Book-E SPE ABI extensions for the current ABI. + +'-mabi=ibmlongdouble' + Change the current ABI to use IBM extended-precision long double. + This is a PowerPC 32-bit SYSV ABI option. + +'-mabi=ieeelongdouble' + Change the current ABI to use IEEE extended-precision long double. + This is a PowerPC 32-bit Linux ABI option. + +'-mabi=elfv1' + Change the current ABI to use the ELFv1 ABI. This is the default + ABI for big-endian PowerPC 64-bit Linux. Overriding the default + ABI requires special system support and is likely to fail in + spectacular ways. + +'-mabi=elfv2' + Change the current ABI to use the ELFv2 ABI. This is the default + ABI for little-endian PowerPC 64-bit Linux. Overriding the default + ABI requires special system support and is likely to fail in + spectacular ways. + +'-mprototype' +'-mno-prototype' + On System V.4 and embedded PowerPC systems assume that all calls to + variable argument functions are properly prototyped. Otherwise, + the compiler must insert an instruction before every non-prototyped + call to set or clear bit 6 of the condition code register (CR) to + indicate whether floating-point values are passed in the + floating-point registers in case the function takes variable + arguments. With '-mprototype', only calls to prototyped variable + argument functions set or clear the bit. + +'-msim' + On embedded PowerPC systems, assume that the startup module is + called 'sim-crt0.o' and that the standard C libraries are + 'libsim.a' and 'libc.a'. This is the default for + 'powerpc-*-eabisim' configurations. + +'-mmvme' + On embedded PowerPC systems, assume that the startup module is + called 'crt0.o' and the standard C libraries are 'libmvme.a' and + 'libc.a'. + +'-mads' + On embedded PowerPC systems, assume that the startup module is + called 'crt0.o' and the standard C libraries are 'libads.a' and + 'libc.a'. + +'-myellowknife' + On embedded PowerPC systems, assume that the startup module is + called 'crt0.o' and the standard C libraries are 'libyk.a' and + 'libc.a'. + +'-mvxworks' + On System V.4 and embedded PowerPC systems, specify that you are + compiling for a VxWorks system. + +'-memb' + On embedded PowerPC systems, set the PPC_EMB bit in the ELF flags + header to indicate that 'eabi' extended relocations are used. + +'-meabi' +'-mno-eabi' + On System V.4 and embedded PowerPC systems do (do not) adhere to + the Embedded Applications Binary Interface (EABI), which is a set + of modifications to the System V.4 specifications. Selecting + '-meabi' means that the stack is aligned to an 8-byte boundary, a + function '__eabi' is called from 'main' to set up the EABI + environment, and the '-msdata' option can use both 'r2' and 'r13' + to point to two separate small data areas. Selecting '-mno-eabi' + means that the stack is aligned to a 16-byte boundary, no EABI + initialization function is called from 'main', and the '-msdata' + option only uses 'r13' to point to a single small data area. The + '-meabi' option is on by default if you configured GCC using one of + the 'powerpc*-*-eabi*' options. + +'-msdata=eabi' + On System V.4 and embedded PowerPC systems, put small initialized + 'const' global and static data in the '.sdata2' section, which is + pointed to by register 'r2'. Put small initialized non-'const' + global and static data in the '.sdata' section, which is pointed to + by register 'r13'. Put small uninitialized global and static data + in the '.sbss' section, which is adjacent to the '.sdata' section. + The '-msdata=eabi' option is incompatible with the '-mrelocatable' + option. The '-msdata=eabi' option also sets the '-memb' option. + +'-msdata=sysv' + On System V.4 and embedded PowerPC systems, put small global and + static data in the '.sdata' section, which is pointed to by + register 'r13'. Put small uninitialized global and static data in + the '.sbss' section, which is adjacent to the '.sdata' section. + The '-msdata=sysv' option is incompatible with the '-mrelocatable' + option. + +'-msdata=default' +'-msdata' + On System V.4 and embedded PowerPC systems, if '-meabi' is used, + compile code the same as '-msdata=eabi', otherwise compile code the + same as '-msdata=sysv'. + +'-msdata=data' + On System V.4 and embedded PowerPC systems, put small global data + in the '.sdata' section. Put small uninitialized global data in + the '.sbss' section. Do not use register 'r13' to address small + data however. This is the default behavior unless other '-msdata' + options are used. + +'-msdata=none' +'-mno-sdata' + On embedded PowerPC systems, put all initialized global and static + data in the '.data' section, and all uninitialized data in the + '.bss' section. + +'-mblock-move-inline-limit=NUM' + Inline all block moves (such as calls to 'memcpy' or structure + copies) less than or equal to NUM bytes. The minimum value for NUM + is 32 bytes on 32-bit targets and 64 bytes on 64-bit targets. The + default value is target-specific. + +'-G NUM' + On embedded PowerPC systems, put global and static items less than + or equal to NUM bytes into the small data or BSS sections instead + of the normal data or BSS section. By default, NUM is 8. The '-G + NUM' switch is also passed to the linker. All modules should be + compiled with the same '-G NUM' value. + +'-mregnames' +'-mno-regnames' + On System V.4 and embedded PowerPC systems do (do not) emit + register names in the assembly language output using symbolic + forms. + +'-mlongcall' +'-mno-longcall' + By default assume that all calls are far away so that a longer and + more expensive calling sequence is required. This is required for + calls farther than 32 megabytes (33,554,432 bytes) from the current + location. A short call is generated if the compiler knows the call + cannot be that far away. This setting can be overridden by the + 'shortcall' function attribute, or by '#pragma longcall(0)'. + + Some linkers are capable of detecting out-of-range calls and + generating glue code on the fly. On these systems, long calls are + unnecessary and generate slower code. As of this writing, the AIX + linker can do this, as can the GNU linker for PowerPC/64. It is + planned to add this feature to the GNU linker for 32-bit PowerPC + systems as well. + + On Darwin/PPC systems, '#pragma longcall' generates 'jbsr callee, + L42', plus a "branch island" (glue code). The two target addresses + represent the callee and the branch island. The Darwin/PPC linker + prefers the first address and generates a 'bl callee' if the PPC + 'bl' instruction reaches the callee directly; otherwise, the linker + generates 'bl L42' to call the branch island. The branch island is + appended to the body of the calling function; it computes the full + 32-bit address of the callee and jumps to it. + + On Mach-O (Darwin) systems, this option directs the compiler emit + to the glue for every direct call, and the Darwin linker decides + whether to use or discard it. + + In the future, GCC may ignore all longcall specifications when the + linker is known to generate glue. + +'-mtls-markers' +'-mno-tls-markers' + Mark (do not mark) calls to '__tls_get_addr' with a relocation + specifying the function argument. The relocation allows the linker + to reliably associate function call with argument setup + instructions for TLS optimization, which in turn allows GCC to + better schedule the sequence. + +'-pthread' + Adds support for multithreading with the "pthreads" library. This + option sets flags for both the preprocessor and linker. + +'-mrecip' +'-mno-recip' + This option enables use of the reciprocal estimate and reciprocal + square root estimate instructions with additional Newton-Raphson + steps to increase precision instead of doing a divide or square + root and divide for floating-point arguments. You should use the + '-ffast-math' option when using '-mrecip' (or at least + '-funsafe-math-optimizations', '-finite-math-only', + '-freciprocal-math' and '-fno-trapping-math'). Note that while the + throughput of the sequence is generally higher than the throughput + of the non-reciprocal instruction, the precision of the sequence + can be decreased by up to 2 ulp (i.e. the inverse of 1.0 equals + 0.99999994) for reciprocal square roots. + +'-mrecip=OPT' + This option controls which reciprocal estimate instructions may be + used. OPT is a comma-separated list of options, which may be + preceded by a '!' to invert the option: 'all': enable all estimate + instructions, 'default': enable the default instructions, + equivalent to '-mrecip', 'none': disable all estimate instructions, + equivalent to '-mno-recip'; 'div': enable the reciprocal + approximation instructions for both single and double precision; + 'divf': enable the single-precision reciprocal approximation + instructions; 'divd': enable the double-precision reciprocal + approximation instructions; 'rsqrt': enable the reciprocal square + root approximation instructions for both single and double + precision; 'rsqrtf': enable the single-precision reciprocal square + root approximation instructions; 'rsqrtd': enable the + double-precision reciprocal square root approximation instructions; + + So, for example, '-mrecip=all,!rsqrtd' enables all of the + reciprocal estimate instructions, except for the 'FRSQRTE', + 'XSRSQRTEDP', and 'XVRSQRTEDP' instructions which handle the + double-precision reciprocal square root calculations. + +'-mrecip-precision' +'-mno-recip-precision' + Assume (do not assume) that the reciprocal estimate instructions + provide higher-precision estimates than is mandated by the PowerPC + ABI. Selecting '-mcpu=power6', '-mcpu=power7' or '-mcpu=power8' + automatically selects '-mrecip-precision'. The double-precision + square root estimate instructions are not generated by default on + low-precision machines, since they do not provide an estimate that + converges after three steps. + +'-mveclibabi=TYPE' + Specifies the ABI type to use for vectorizing intrinsics using an + external library. The only type supported at present is 'mass', + which specifies to use IBM's Mathematical Acceleration Subsystem + (MASS) libraries for vectorizing intrinsics using external + libraries. GCC currently emits calls to 'acosd2', 'acosf4', + 'acoshd2', 'acoshf4', 'asind2', 'asinf4', 'asinhd2', 'asinhf4', + 'atan2d2', 'atan2f4', 'atand2', 'atanf4', 'atanhd2', 'atanhf4', + 'cbrtd2', 'cbrtf4', 'cosd2', 'cosf4', 'coshd2', 'coshf4', 'erfcd2', + 'erfcf4', 'erfd2', 'erff4', 'exp2d2', 'exp2f4', 'expd2', 'expf4', + 'expm1d2', 'expm1f4', 'hypotd2', 'hypotf4', 'lgammad2', 'lgammaf4', + 'log10d2', 'log10f4', 'log1pd2', 'log1pf4', 'log2d2', 'log2f4', + 'logd2', 'logf4', 'powd2', 'powf4', 'sind2', 'sinf4', 'sinhd2', + 'sinhf4', 'sqrtd2', 'sqrtf4', 'tand2', 'tanf4', 'tanhd2', and + 'tanhf4' when generating code for power7. Both '-ftree-vectorize' + and '-funsafe-math-optimizations' must also be enabled. The MASS + libraries must be specified at link time. + +'-mfriz' +'-mno-friz' + Generate (do not generate) the 'friz' instruction when the + '-funsafe-math-optimizations' option is used to optimize rounding + of floating-point values 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. + +'-mpointers-to-nested-functions' +'-mno-pointers-to-nested-functions' + Generate (do not generate) code to load up the static chain + register (R11) when calling through a pointer on AIX and 64-bit + Linux systems where a function pointer points to a 3-word + descriptor giving the function address, TOC value to be loaded in + register R2, and static chain value to be loaded in register R11. + The '-mpointers-to-nested-functions' is on by default. You cannot + call through pointers to nested functions or pointers to functions + compiled in other languages that use the static chain if you use + the '-mno-pointers-to-nested-functions'. + +'-msave-toc-indirect' +'-mno-save-toc-indirect' + Generate (do not generate) code to save the TOC value in the + reserved stack location in the function prologue if the function + calls through a pointer on AIX and 64-bit Linux systems. If the + TOC value is not saved in the prologue, it is saved just before the + call through the pointer. The '-mno-save-toc-indirect' option is + the default. + +'-mcompat-align-parm' +'-mno-compat-align-parm' + Generate (do not generate) code to pass structure parameters with a + maximum alignment of 64 bits, for compatibility with older versions + of GCC. + + Older versions of GCC (prior to 4.9.0) incorrectly did not align a + structure parameter on a 128-bit boundary when that structure + contained a member requiring 128-bit alignment. This is corrected + in more recent versions of GCC. This option may be used to generate + code that is compatible with functions compiled with older versions + of GCC. + + The '-mno-compat-align-parm' option is the default. + + +File: gcc.info, Node: RX Options, Next: S/390 and zSeries Options, Prev: RS/6000 and PowerPC Options, Up: Submodel Options + +3.17.39 RX Options +------------------ + +These command-line options are defined for RX targets: + +'-m64bit-doubles' +'-m32bit-doubles' + Make the 'double' data type be 64 bits ('-m64bit-doubles') or 32 + bits ('-m32bit-doubles') in size. The default is + '-m32bit-doubles'. _Note_ RX floating-point hardware only works on + 32-bit values, which is why the default is '-m32bit-doubles'. + +'-fpu' +'-nofpu' + Enables ('-fpu') or disables ('-nofpu') the use of RX + floating-point hardware. The default is enabled for the RX600 + series and disabled for the RX200 series. + + Floating-point instructions are only generated for 32-bit + floating-point values, however, so the FPU hardware is not used for + doubles if the '-m64bit-doubles' option is used. + + _Note_ If the '-fpu' option is enabled then + '-funsafe-math-optimizations' is also enabled automatically. This + is because the RX FPU instructions are themselves unsafe. + +'-mcpu=NAME' + Selects the type of RX CPU to be targeted. Currently three types + are supported, the generic RX600 and RX200 series hardware and the + specific RX610 CPU. The default is RX600. + + The only difference between RX600 and RX610 is that the RX610 does + not support the 'MVTIPL' instruction. + + The RX200 series does not have a hardware floating-point unit and + so '-nofpu' is enabled by default when this type is selected. + +'-mbig-endian-data' +'-mlittle-endian-data' + Store data (but not code) in the big-endian format. The default is + '-mlittle-endian-data', i.e. to store data in the little-endian + format. + +'-msmall-data-limit=N' + Specifies the maximum size in bytes of global and static variables + which can be placed into the small data area. Using the small data + area can lead to smaller and faster code, but the size of area is + limited and it is up to the programmer to ensure that the area does + not overflow. Also when the small data area is used one of the + RX's registers (usually 'r13') is reserved for use pointing to this + area, so it is no longer available for use by the compiler. This + could result in slower and/or larger code if variables are pushed + onto the stack instead of being held in this register. + + Note, common variables (variables that have not been initialized) + and constants are not placed into the small data area as they are + assigned to other sections in the output executable. + + The default value is zero, which disables this feature. Note, this + feature is not enabled by default with higher optimization levels + ('-O2' etc) because of the potentially detrimental effects of + reserving a register. It is up to the programmer to experiment and + discover whether this feature is of benefit to their program. See + the description of the '-mpid' option for a description of how the + actual register to hold the small data area pointer is chosen. + +'-msim' +'-mno-sim' + Use the simulator runtime. The default is to use the libgloss + board-specific runtime. + +'-mas100-syntax' +'-mno-as100-syntax' + When generating assembler output use a syntax that is compatible + with Renesas's AS100 assembler. This syntax can also be handled by + the GAS assembler, but it has some restrictions so it is not + generated by default. + +'-mmax-constant-size=N' + Specifies the maximum size, in bytes, of a constant that can be + used as an operand in a RX instruction. Although the RX + instruction set does allow constants of up to 4 bytes in length to + be used in instructions, a longer value equates to a longer + instruction. Thus in some circumstances it can be beneficial to + restrict the size of constants that are used in instructions. + Constants that are too big are instead placed into a constant pool + and referenced via register indirection. + + The value N can be between 0 and 4. A value of 0 (the default) or + 4 means that constants of any size are allowed. + +'-mrelax' + Enable linker relaxation. Linker relaxation is a process whereby + the linker attempts to reduce the size of a program by finding + shorter versions of various instructions. Disabled by default. + +'-mint-register=N' + Specify the number of registers to reserve for fast interrupt + handler functions. The value N can be between 0 and 4. A value of + 1 means that register 'r13' is reserved for the exclusive use of + fast interrupt handlers. A value of 2 reserves 'r13' and 'r12'. A + value of 3 reserves 'r13', 'r12' and 'r11', and a value of 4 + reserves 'r13' through 'r10'. A value of 0, the default, does not + reserve any registers. + +'-msave-acc-in-interrupts' + Specifies that interrupt handler functions should preserve the + accumulator register. This is only necessary if normal code might + use the accumulator register, for example because it performs + 64-bit multiplications. The default is to ignore the accumulator + as this makes the interrupt handlers faster. + +'-mpid' +'-mno-pid' + Enables the generation of position independent data. When enabled + any access to constant data is done via an offset from a base + address held in a register. This allows the location of constant + data to be determined at run time without requiring the executable + to be relocated, which is a benefit to embedded applications with + tight memory constraints. Data that can be modified is not + affected by this option. + + Note, using this feature reserves a register, usually 'r13', for + the constant data base address. This can result in slower and/or + larger code, especially in complicated functions. + + The actual register chosen to hold the constant data base address + depends upon whether the '-msmall-data-limit' and/or the + '-mint-register' command-line options are enabled. Starting with + register 'r13' and proceeding downwards, registers are allocated + first to satisfy the requirements of '-mint-register', then '-mpid' + and finally '-msmall-data-limit'. Thus it is possible for the + small data area register to be 'r8' if both '-mint-register=4' and + '-mpid' are specified on the command line. + + By default this feature is not enabled. The default can be + restored via the '-mno-pid' command-line option. + +'-mno-warn-multiple-fast-interrupts' +'-mwarn-multiple-fast-interrupts' + Prevents GCC from issuing a warning message if it finds more than + one fast interrupt handler when it is compiling a file. The + default is to issue a warning for each extra fast interrupt handler + found, as the RX only supports one such interrupt. + + _Note:_ The generic GCC command-line option '-ffixed-REG' has special +significance to the RX port when used with the 'interrupt' function +attribute. This attribute indicates a function intended to process fast +interrupts. GCC ensures that it only uses the registers 'r10', 'r11', +'r12' and/or 'r13' and only provided that the normal use of the +corresponding registers have been restricted via the '-ffixed-REG' or +'-mint-register' command-line options. + + +File: gcc.info, Node: S/390 and zSeries Options, Next: Score Options, Prev: RX Options, Up: Submodel Options + +3.17.40 S/390 and zSeries Options +--------------------------------- + +These are the '-m' options defined for the S/390 and zSeries +architecture. + +'-mhard-float' +'-msoft-float' + Use (do not use) the hardware floating-point instructions and + registers for floating-point operations. When '-msoft-float' is + specified, functions in 'libgcc.a' are used to perform + floating-point operations. When '-mhard-float' is specified, the + compiler generates IEEE floating-point instructions. This is the + default. + +'-mhard-dfp' +'-mno-hard-dfp' + Use (do not use) the hardware decimal-floating-point instructions + for decimal-floating-point operations. When '-mno-hard-dfp' is + specified, functions in 'libgcc.a' are used to perform + decimal-floating-point operations. When '-mhard-dfp' is specified, + the compiler generates decimal-floating-point hardware + instructions. This is the default for '-march=z9-ec' or higher. + +'-mlong-double-64' +'-mlong-double-128' + These switches control the size of 'long double' type. A size of + 64 bits makes the 'long double' type equivalent to the 'double' + type. This is the default. + +'-mbackchain' +'-mno-backchain' + Store (do not store) the address of the caller's frame as backchain + pointer into the callee's stack frame. A backchain may be needed + to allow debugging using tools that do not understand DWARF 2 call + frame information. When '-mno-packed-stack' is in effect, the + backchain pointer is stored at the bottom of the stack frame; when + '-mpacked-stack' is in effect, the backchain is placed into the + topmost word of the 96/160 byte register save area. + + In general, code compiled with '-mbackchain' is call-compatible + with code compiled with '-mmo-backchain'; however, use of the + backchain for debugging purposes usually requires that the whole + binary is built with '-mbackchain'. Note that the combination of + '-mbackchain', '-mpacked-stack' and '-mhard-float' is not + supported. In order to build a linux kernel use '-msoft-float'. + + The default is to not maintain the backchain. + +'-mpacked-stack' +'-mno-packed-stack' + Use (do not use) the packed stack layout. When '-mno-packed-stack' + is specified, the compiler uses the all fields of the 96/160 byte + register save area only for their default purpose; unused fields + still take up stack space. When '-mpacked-stack' is specified, + register save slots are densely packed at the top of the register + save area; unused space is reused for other purposes, allowing for + more efficient use of the available stack space. However, when + '-mbackchain' is also in effect, the topmost word of the save area + is always used to store the backchain, and the return address + register is always saved two words below the backchain. + + As long as the stack frame backchain is not used, code generated + with '-mpacked-stack' is call-compatible with code generated with + '-mno-packed-stack'. Note that some non-FSF releases of GCC 2.95 + for S/390 or zSeries generated code that uses the stack frame + backchain at run time, not just for debugging purposes. Such code + is not call-compatible with code compiled with '-mpacked-stack'. + Also, note that the combination of '-mbackchain', '-mpacked-stack' + and '-mhard-float' is not supported. In order to build a linux + kernel use '-msoft-float'. + + The default is to not use the packed stack layout. + +'-msmall-exec' +'-mno-small-exec' + Generate (or do not generate) code using the 'bras' instruction to + do subroutine calls. This only works reliably if the total + executable size does not exceed 64k. The default is to use the + 'basr' instruction instead, which does not have this limitation. + +'-m64' +'-m31' + When '-m31' is specified, generate code compliant to the GNU/Linux + for S/390 ABI. When '-m64' is specified, generate code compliant + to the GNU/Linux for zSeries ABI. This allows GCC in particular to + generate 64-bit instructions. For the 's390' targets, the default + is '-m31', while the 's390x' targets default to '-m64'. + +'-mzarch' +'-mesa' + When '-mzarch' is specified, generate code using the instructions + available on z/Architecture. When '-mesa' is specified, generate + code using the instructions available on ESA/390. Note that + '-mesa' is not possible with '-m64'. When generating code + compliant to the GNU/Linux for S/390 ABI, the default is '-mesa'. + When generating code compliant to the GNU/Linux for zSeries ABI, + the default is '-mzarch'. + +'-mmvcle' +'-mno-mvcle' + Generate (or do not generate) code using the 'mvcle' instruction to + perform block moves. When '-mno-mvcle' is specified, use a 'mvc' + loop instead. This is the default unless optimizing for size. + +'-mdebug' +'-mno-debug' + Print (or do not print) additional debug information when + compiling. The default is to not print debug information. + +'-march=CPU-TYPE' + Generate code that runs on CPU-TYPE, which is the name of a system + representing a certain processor type. Possible values for + CPU-TYPE are 'g5', 'g6', 'z900', 'z990', 'z9-109', 'z9-ec' and + 'z10'. When generating code using the instructions available on + z/Architecture, the default is '-march=z900'. Otherwise, the + default is '-march=g5'. + +'-mtune=CPU-TYPE' + Tune to CPU-TYPE everything applicable about the generated code, + except for the ABI and the set of available instructions. The list + of CPU-TYPE values is the same as for '-march'. The default is the + value used for '-march'. + +'-mtpf-trace' +'-mno-tpf-trace' + Generate code that adds (does not add) in TPF OS specific branches + to trace routines in the operating system. This option is off by + default, even when compiling for the TPF OS. + +'-mfused-madd' +'-mno-fused-madd' + Generate code that uses (does not use) the floating-point multiply + and accumulate instructions. These instructions are generated by + default if hardware floating point is used. + +'-mwarn-framesize=FRAMESIZE' + Emit a warning if the current function exceeds the given frame + size. Because this is a compile-time check it doesn't need to be a + real problem when the program runs. It is intended to identify + functions that most probably cause a stack overflow. It is useful + to be used in an environment with limited stack size e.g. the linux + kernel. + +'-mwarn-dynamicstack' + Emit a warning if the function calls 'alloca' or uses + dynamically-sized arrays. This is generally a bad idea with a + limited stack size. + +'-mstack-guard=STACK-GUARD' +'-mstack-size=STACK-SIZE' + If these options are provided the S/390 back end emits additional + instructions in the function prologue that trigger a trap if the + stack size is STACK-GUARD bytes above the STACK-SIZE (remember that + the stack on S/390 grows downward). If the STACK-GUARD option is + omitted the smallest power of 2 larger than the frame size of the + compiled function is chosen. These options are intended to be used + to help debugging stack overflow problems. The additionally + emitted code causes only little overhead and hence can also be used + in production-like systems without greater performance degradation. + The given values have to be exact powers of 2 and STACK-SIZE has to + be greater than STACK-GUARD without exceeding 64k. In order to be + efficient the extra code makes the assumption that the stack starts + at an address aligned to the value given by STACK-SIZE. The + STACK-GUARD option can only be used in conjunction with STACK-SIZE. + +'-mhotpatch[=HALFWORDS]' +'-mno-hotpatch' + If the hotpatch option is enabled, a "hot-patching" function + prologue is generated for all functions in the compilation unit. + The funtion label is prepended with the given number of two-byte + Nop instructions (HALFWORDS, maximum 1000000) or 12 Nop + instructions if no argument is present. Functions with a + hot-patching prologue are never inlined automatically, and a + hot-patching prologue is never generated for functions functions + that are explicitly inline. + + This option can be overridden for individual functions with the + 'hotpatch' attribute. + + +File: gcc.info, Node: Score Options, Next: SH Options, Prev: S/390 and zSeries Options, Up: Submodel Options + +3.17.41 Score Options +--------------------- + +These options are defined for Score implementations: + +'-meb' + Compile code for big-endian mode. This is the default. + +'-mel' + Compile code for little-endian mode. + +'-mnhwloop' + Disable generation of 'bcnz' instructions. + +'-muls' + Enable generation of unaligned load and store instructions. + +'-mmac' + Enable the use of multiply-accumulate instructions. Disabled by + default. + +'-mscore5' + Specify the SCORE5 as the target architecture. + +'-mscore5u' + Specify the SCORE5U of the target architecture. + +'-mscore7' + Specify the SCORE7 as the target architecture. This is the + default. + +'-mscore7d' + Specify the SCORE7D as the target architecture. + + +File: gcc.info, Node: SH Options, Next: Solaris 2 Options, Prev: Score Options, Up: Submodel Options + +3.17.42 SH Options +------------------ + +These '-m' options are defined for the SH implementations: + +'-m1' + Generate code for the SH1. + +'-m2' + Generate code for the SH2. + +'-m2e' + Generate code for the SH2e. + +'-m2a-nofpu' + Generate code for the SH2a without FPU, or for a SH2a-FPU in such a + way that the floating-point unit is not used. + +'-m2a-single-only' + Generate code for the SH2a-FPU, in such a way that no + double-precision floating-point operations are used. + +'-m2a-single' + Generate code for the SH2a-FPU assuming the floating-point unit is + in single-precision mode by default. + +'-m2a' + Generate code for the SH2a-FPU assuming the floating-point unit is + in double-precision mode by default. + +'-m3' + Generate code for the SH3. + +'-m3e' + Generate code for the SH3e. + +'-m4-nofpu' + Generate code for the SH4 without a floating-point unit. + +'-m4-single-only' + Generate code for the SH4 with a floating-point unit that only + supports single-precision arithmetic. + +'-m4-single' + Generate code for the SH4 assuming the floating-point unit is in + single-precision mode by default. + +'-m4' + Generate code for the SH4. + +'-m4a-nofpu' + Generate code for the SH4al-dsp, or for a SH4a in such a way that + the floating-point unit is not used. + +'-m4a-single-only' + Generate code for the SH4a, in such a way that no double-precision + floating-point operations are used. + +'-m4a-single' + Generate code for the SH4a assuming the floating-point unit is in + single-precision mode by default. + +'-m4a' + Generate code for the SH4a. + +'-m4al' + Same as '-m4a-nofpu', except that it implicitly passes '-dsp' to + the assembler. GCC doesn't generate any DSP instructions at the + moment. + +'-mb' + Compile code for the processor in big-endian mode. + +'-ml' + Compile code for the processor in little-endian mode. + +'-mdalign' + Align doubles at 64-bit boundaries. Note that this changes the + calling conventions, and thus some functions from the standard C + library do not work unless you recompile it first with '-mdalign'. + +'-mrelax' + Shorten some address references at link time, when possible; uses + the linker option '-relax'. + +'-mbigtable' + Use 32-bit offsets in 'switch' tables. The default is to use + 16-bit offsets. + +'-mbitops' + Enable the use of bit manipulation instructions on SH2A. + +'-mfmovd' + Enable the use of the instruction 'fmovd'. Check '-mdalign' for + alignment constraints. + +'-mhitachi' + Comply with the calling conventions defined by Renesas. + +'-mrenesas' + Comply with the calling conventions defined by Renesas. + +'-mno-renesas' + Comply with the calling conventions defined for GCC before the + Renesas conventions were available. This option is the default for + all targets of the SH toolchain. + +'-mnomacsave' + Mark the 'MAC' register as call-clobbered, even if '-mhitachi' is + given. + +'-mieee' +'-mno-ieee' + Control the IEEE compliance of floating-point comparisons, which + affects the handling of cases where the result of a comparison is + unordered. By default '-mieee' is implicitly enabled. If + '-ffinite-math-only' is enabled '-mno-ieee' is implicitly set, + which results in faster floating-point greater-equal and less-equal + comparisons. The implcit settings can be overridden by specifying + either '-mieee' or '-mno-ieee'. + +'-minline-ic_invalidate' + Inline code to invalidate instruction cache entries after setting + up nested function trampolines. This option has no effect if + '-musermode' is in effect and the selected code generation option + (e.g. '-m4') does not allow the use of the 'icbi' instruction. If + the selected code generation option does not allow the use of the + 'icbi' instruction, and '-musermode' is not in effect, the inlined + code manipulates the instruction cache address array directly with + an associative write. This not only requires privileged mode at + run time, but it also fails if the cache line had been mapped via + the TLB and has become unmapped. + +'-misize' + Dump instruction size and location in the assembly code. + +'-mpadstruct' + This option is deprecated. It pads structures to multiple of 4 + bytes, which is incompatible with the SH ABI. + +'-matomic-model=MODEL' + Sets the model of atomic operations and additional parameters as a + comma separated list. For details on the atomic built-in functions + see *note __atomic Builtins::. The following models and parameters + are supported: + + 'none' + Disable compiler generated atomic sequences and emit library + calls for atomic operations. This is the default if the + target is not 'sh-*-linux*'. + + 'soft-gusa' + Generate GNU/Linux compatible gUSA software atomic sequences + for the atomic built-in functions. The generated atomic + sequences require additional support from the + interrupt/exception handling code of the system and are only + suitable for SH3* and SH4* single-core systems. This option + is enabled by default when the target is 'sh-*-linux*' and + SH3* or SH4*. When the target is SH4A, this option will also + partially utilize the hardware atomic instructions 'movli.l' + and 'movco.l' to create more efficient code, unless 'strict' + is specified. + + 'soft-tcb' + Generate software atomic sequences that use a variable in the + thread control block. This is a variation of the gUSA + sequences which can also be used on SH1* and SH2* targets. + The generated atomic sequences require additional support from + the interrupt/exception handling code of the system and are + only suitable for single-core systems. When using this model, + the 'gbr-offset=' parameter has to be specified as well. + + 'soft-imask' + Generate software atomic sequences that temporarily disable + interrupts by setting 'SR.IMASK = 1111'. This model works + only when the program runs in privileged mode and is only + suitable for single-core systems. Additional support from the + interrupt/exception handling code of the system is not + required. This model is enabled by default when the target is + 'sh-*-linux*' and SH1* or SH2*. + + 'hard-llcs' + Generate hardware atomic sequences using the 'movli.l' and + 'movco.l' instructions only. This is only available on SH4A + and is suitable for multi-core systems. Since the hardware + instructions support only 32 bit atomic variables access to 8 + or 16 bit variables is emulated with 32 bit accesses. Code + compiled with this option will also be compatible with other + software atomic model interrupt/exception handling systems if + executed on an SH4A system. Additional support from the + interrupt/exception handling code of the system is not + required for this model. + + 'gbr-offset=' + This parameter specifies the offset in bytes of the variable + in the thread control block structure that should be used by + the generated atomic sequences when the 'soft-tcb' model has + been selected. For other models this parameter is ignored. + The specified value must be an integer multiple of four and in + the range 0-1020. + + 'strict' + This parameter prevents mixed usage of multiple atomic models, + even though they would be compatible, and will make the + compiler generate atomic sequences of the specified model + only. + +'-mtas' + Generate the 'tas.b' opcode for '__atomic_test_and_set'. Notice + that depending on the particular hardware and software + configuration this can degrade overall performance due to the + operand cache line flushes that are implied by the 'tas.b' + instruction. On multi-core SH4A processors the 'tas.b' instruction + must be used with caution since it can result in data corruption + for certain cache configurations. + +'-mspace' + Optimize for space instead of speed. Implied by '-Os'. + +'-mprefergot' + When generating position-independent code, emit function calls + using the Global Offset Table instead of the Procedure Linkage + Table. + +'-musermode' + Don't generate privileged mode only code. This option implies + '-mno-inline-ic_invalidate' if the inlined code would not work in + user mode. This is the default when the target is 'sh-*-linux*'. + +'-multcost=NUMBER' + Set the cost to assume for a multiply insn. + +'-mdiv=STRATEGY' + Set the division strategy to be used for integer division + operations. For SHmedia STRATEGY can be one of: + + 'fp' + Performs the operation in floating point. This has a very + high latency, but needs only a few instructions, so it might + be a good choice if your code has enough easily-exploitable + ILP to allow the compiler to schedule the floating-point + instructions together with other instructions. Division by + zero causes a floating-point exception. + + 'inv' + Uses integer operations to calculate the inverse of the + divisor, and then multiplies the dividend with the inverse. + This strategy allows CSE and hoisting of the inverse + calculation. Division by zero calculates an unspecified + result, but does not trap. + + 'inv:minlat' + A variant of 'inv' where, if no CSE or hoisting opportunities + have been found, or if the entire operation has been hoisted + to the same place, the last stages of the inverse calculation + are intertwined with the final multiply to reduce the overall + latency, at the expense of using a few more instructions, and + thus offering fewer scheduling opportunities with other code. + + 'call' + Calls a library function that usually implements the + 'inv:minlat' strategy. This gives high code density for + 'm5-*media-nofpu' compilations. + + 'call2' + Uses a different entry point of the same library function, + where it assumes that a pointer to a lookup table has already + been set up, which exposes the pointer load to CSE and code + hoisting optimizations. + + 'inv:call' + 'inv:call2' + 'inv:fp' + Use the 'inv' algorithm for initial code generation, but if + the code stays unoptimized, revert to the 'call', 'call2', or + 'fp' strategies, respectively. Note that the + potentially-trapping side effect of division by zero is + carried by a separate instruction, so it is possible that all + the integer instructions are hoisted out, but the marker for + the side effect stays where it is. A recombination to + floating-point operations or a call is not possible in that + case. + + 'inv20u' + 'inv20l' + Variants of the 'inv:minlat' strategy. In the case that the + inverse calculation is not separated from the multiply, they + speed up division where the dividend fits into 20 bits (plus + sign where applicable) by inserting a test to skip a number of + operations in this case; this test slows down the case of + larger dividends. 'inv20u' assumes the case of a such a small + dividend to be unlikely, and 'inv20l' assumes it to be likely. + + For targets other than SHmedia STRATEGY can be one of: + + 'call-div1' + Calls a library function that uses the single-step division + instruction 'div1' to perform the operation. Division by zero + calculates an unspecified result and does not trap. This is + the default except for SH4, SH2A and SHcompact. + + 'call-fp' + Calls a library function that performs the operation in double + precision floating point. Division by zero causes a + floating-point exception. This is the default for SHcompact + with FPU. Specifying this for targets that do not have a + double precision FPU will default to 'call-div1'. + + 'call-table' + Calls a library function that uses a lookup table for small + divisors and the 'div1' instruction with case distinction for + larger divisors. Division by zero calculates an unspecified + result and does not trap. This is the default for SH4. + Specifying this for targets that do not have dynamic shift + instructions will default to 'call-div1'. + + When a division strategy has not been specified the default + strategy will be selected based on the current target. For SH2A + the default strategy is to use the 'divs' and 'divu' instructions + instead of library function calls. + +'-maccumulate-outgoing-args' + Reserve space once for outgoing arguments in the function prologue + rather than around each call. Generally beneficial for performance + and size. Also needed for unwinding to avoid changing the stack + frame around conditional code. + +'-mdivsi3_libfunc=NAME' + Set the name of the library function used for 32-bit signed + division to NAME. This only affects the name used in the 'call' + and 'inv:call' division strategies, and the compiler still expects + the same sets of input/output/clobbered registers as if this option + were not present. + +'-mfixed-range=REGISTER-RANGE' + Generate code treating the given register range as fixed registers. + A fixed register is one that the register allocator can not use. + This is useful when compiling kernel code. A register range is + specified as two registers separated by a dash. Multiple register + ranges can be specified separated by a comma. + +'-mindexed-addressing' + Enable the use of the indexed addressing mode for + SHmedia32/SHcompact. This is only safe if the hardware and/or OS + implement 32-bit wrap-around semantics for the indexed addressing + mode. The architecture allows the implementation of processors + with 64-bit MMU, which the OS could use to get 32-bit addressing, + but since no current hardware implementation supports this or any + other way to make the indexed addressing mode safe to use in the + 32-bit ABI, the default is '-mno-indexed-addressing'. + +'-mgettrcost=NUMBER' + Set the cost assumed for the 'gettr' instruction to NUMBER. The + default is 2 if '-mpt-fixed' is in effect, 100 otherwise. + +'-mpt-fixed' + Assume 'pt*' instructions won't trap. This generally generates + better-scheduled code, but is unsafe on current hardware. The + current architecture definition says that 'ptabs' and 'ptrel' trap + when the target anded with 3 is 3. This has the unintentional + effect of making it unsafe to schedule these instructions before a + branch, or hoist them out of a loop. For example, + '__do_global_ctors', a part of 'libgcc' that runs constructors at + program startup, calls functions in a list which is delimited by + -1. With the '-mpt-fixed' option, the 'ptabs' is done before + testing against -1. That means that all the constructors run a bit + more quickly, but when the loop comes to the end of the list, the + program crashes because 'ptabs' loads -1 into a target register. + + Since this option is unsafe for any hardware implementing the + current architecture specification, the default is '-mno-pt-fixed'. + Unless specified explicitly with '-mgettrcost', '-mno-pt-fixed' + also implies '-mgettrcost=100'; this deters register allocation + from using target registers for storing ordinary integers. + +'-minvalid-symbols' + Assume symbols might be invalid. Ordinary function symbols + generated by the compiler are always valid to load with + 'movi'/'shori'/'ptabs' or 'movi'/'shori'/'ptrel', but with + assembler and/or linker tricks it is possible to generate symbols + that cause 'ptabs' or 'ptrel' to trap. This option is only + meaningful when '-mno-pt-fixed' is in effect. It prevents + cross-basic-block CSE, hoisting and most scheduling of symbol + loads. The default is '-mno-invalid-symbols'. + +'-mbranch-cost=NUM' + Assume NUM to be the cost for a branch instruction. Higher numbers + make the compiler try to generate more branch-free code if + possible. If not specified the value is selected depending on the + processor type that is being compiled for. + +'-mzdcbranch' +'-mno-zdcbranch' + Assume (do not assume) that zero displacement conditional branch + instructions 'bt' and 'bf' are fast. If '-mzdcbranch' is + specified, the compiler will try to prefer zero displacement branch + code sequences. This is enabled by default when generating code + for SH4 and SH4A. It can be explicitly disabled by specifying + '-mno-zdcbranch'. + +'-mfused-madd' +'-mno-fused-madd' + Generate code that uses (does not use) the floating-point multiply + and accumulate instructions. These instructions are generated by + default if hardware floating point is used. The machine-dependent + '-mfused-madd' option is now mapped to the machine-independent + '-ffp-contract=fast' option, and '-mno-fused-madd' is mapped to + '-ffp-contract=off'. + +'-mfsca' +'-mno-fsca' + Allow or disallow the compiler to emit the 'fsca' instruction for + sine and cosine approximations. The option '-mfsca' must be used + in combination with '-funsafe-math-optimizations'. It is enabled + by default when generating code for SH4A. Using '-mno-fsca' + disables sine and cosine approximations even if + '-funsafe-math-optimizations' is in effect. + +'-mfsrra' +'-mno-fsrra' + Allow or disallow the compiler to emit the 'fsrra' instruction for + reciprocal square root approximations. The option '-mfsrra' must + be used in combination with '-funsafe-math-optimizations' and + '-ffinite-math-only'. It is enabled by default when generating + code for SH4A. Using '-mno-fsrra' disables reciprocal square root + approximations even if '-funsafe-math-optimizations' and + '-ffinite-math-only' are in effect. + +'-mpretend-cmove' + Prefer zero-displacement conditional branches for conditional move + instruction patterns. This can result in faster code on the SH4 + processor. + + +File: gcc.info, Node: Solaris 2 Options, Next: SPARC Options, Prev: SH Options, Up: Submodel Options + +3.17.43 Solaris 2 Options +------------------------- + +These '-m' options are supported on Solaris 2: + +'-mimpure-text' + '-mimpure-text', used in addition to '-shared', tells the compiler + to not pass '-z text' to the linker when linking a shared object. + Using this option, you can link position-dependent code into a + shared object. + + '-mimpure-text' suppresses the "relocations remain against + allocatable but non-writable sections" linker error message. + However, the necessary relocations trigger copy-on-write, and the + shared object is not actually shared across processes. Instead of + using '-mimpure-text', you should compile all source code with + '-fpic' or '-fPIC'. + + These switches are supported in addition to the above on Solaris 2: + +'-pthreads' + Add support for multithreading using the POSIX threads library. + This option sets flags for both the preprocessor and linker. This + option does not affect the thread safety of object code produced by + the compiler or that of libraries supplied with it. + +'-pthread' + This is a synonym for '-pthreads'. + + +File: gcc.info, Node: SPARC Options, Next: SPU Options, Prev: Solaris 2 Options, Up: Submodel Options + +3.17.44 SPARC Options +--------------------- + +These '-m' options are supported on the SPARC: + +'-mno-app-regs' +'-mapp-regs' + Specify '-mapp-regs' to generate output using the global registers + 2 through 4, which the SPARC SVR4 ABI reserves for applications. + Like the global register 1, each global register 2 through 4 is + then treated as an allocable register that is clobbered by function + calls. This is the default. + + To be fully SVR4 ABI-compliant at the cost of some performance + loss, specify '-mno-app-regs'. You should compile libraries and + system software with this option. + +'-mflat' +'-mno-flat' + With '-mflat', the compiler does not generate save/restore + instructions and uses a "flat" or single register window model. + This model is compatible with the regular register window model. + The local registers and the input registers (0-5) are still treated + as "call-saved" registers and are saved on the stack as needed. + + With '-mno-flat' (the default), the compiler generates save/restore + instructions (except for leaf functions). This is the normal + operating mode. + +'-mfpu' +'-mhard-float' + Generate output containing floating-point instructions. This is + the default. + +'-mno-fpu' +'-msoft-float' + Generate output containing library calls for floating point. + *Warning:* the requisite libraries are not available for all SPARC + targets. Normally the facilities of the machine's usual C compiler + are used, but this cannot be done directly in cross-compilation. + You must make your own arrangements to provide suitable library + functions for cross-compilation. The embedded targets + 'sparc-*-aout' and 'sparclite-*-*' do provide software + floating-point support. + + '-msoft-float' changes the calling convention in the output file; + therefore, it is only useful if you compile _all_ of a program with + this option. In particular, you need to compile 'libgcc.a', the + library that comes with GCC, with '-msoft-float' in order for this + to work. + +'-mhard-quad-float' + Generate output containing quad-word (long double) floating-point + instructions. + +'-msoft-quad-float' + Generate output containing library calls for quad-word (long + double) floating-point instructions. The functions called are + those specified in the SPARC ABI. This is the default. + + As of this writing, there are no SPARC implementations that have + hardware support for the quad-word floating-point instructions. + They all invoke a trap handler for one of these instructions, and + then the trap handler emulates the effect of the instruction. + Because of the trap handler overhead, this is much slower than + calling the ABI library routines. Thus the '-msoft-quad-float' + option is the default. + +'-mno-unaligned-doubles' +'-munaligned-doubles' + Assume that doubles have 8-byte alignment. This is the default. + + With '-munaligned-doubles', GCC assumes that doubles have 8-byte + alignment only if they are contained in another type, or if they + have an absolute address. Otherwise, it assumes they have 4-byte + alignment. Specifying this option avoids some rare compatibility + problems with code generated by other compilers. It is not the + default because it results in a performance loss, especially for + floating-point code. + +'-mno-faster-structs' +'-mfaster-structs' + With '-mfaster-structs', the compiler assumes that structures + should have 8-byte alignment. This enables the use of pairs of + 'ldd' and 'std' instructions for copies in structure assignment, in + place of twice as many 'ld' and 'st' pairs. However, the use of + this changed alignment directly violates the SPARC ABI. Thus, it's + intended only for use on targets where the developer acknowledges + that their resulting code is not directly in line with the rules of + the ABI. + +'-mcpu=CPU_TYPE' + Set the instruction set, register set, and instruction scheduling + parameters for machine type CPU_TYPE. Supported values for + CPU_TYPE are 'v7', 'cypress', 'v8', 'supersparc', 'hypersparc', + 'leon', 'leon3', 'sparclite', 'f930', 'f934', 'sparclite86x', + 'sparclet', 'tsc701', 'v9', 'ultrasparc', 'ultrasparc3', 'niagara', + 'niagara2', 'niagara3' and 'niagara4'. + + Native Solaris and GNU/Linux toolchains also support the value + 'native', which selects the best architecture option for the host + processor. '-mcpu=native' has no effect if GCC does not recognize + the processor. + + Default instruction scheduling parameters are used for values that + select an architecture and not an implementation. These are 'v7', + 'v8', 'sparclite', 'sparclet', 'v9'. + + Here is a list of each supported architecture and their supported + implementations. + + v7 + cypress + + v8 + supersparc, hypersparc, leon, leon3 + + sparclite + f930, f934, sparclite86x + + sparclet + tsc701 + + v9 + ultrasparc, ultrasparc3, niagara, niagara2, niagara3, niagara4 + + By default (unless configured otherwise), GCC generates code for + the V7 variant of the SPARC architecture. With '-mcpu=cypress', + the compiler additionally optimizes it for the Cypress CY7C602 + chip, as used in the SPARCStation/SPARCServer 3xx series. This is + also appropriate for the older SPARCStation 1, 2, IPX etc. + + With '-mcpu=v8', GCC generates code for the V8 variant of the SPARC + architecture. The only difference from V7 code is that the + compiler emits the integer multiply and integer divide instructions + which exist in SPARC-V8 but not in SPARC-V7. With + '-mcpu=supersparc', the compiler additionally optimizes it for the + SuperSPARC chip, as used in the SPARCStation 10, 1000 and 2000 + series. + + With '-mcpu=sparclite', GCC generates code for the SPARClite + variant of the SPARC architecture. This adds the integer multiply, + integer divide step and scan ('ffs') instructions which exist in + SPARClite but not in SPARC-V7. With '-mcpu=f930', the compiler + additionally optimizes it for the Fujitsu MB86930 chip, which is + the original SPARClite, with no FPU. With '-mcpu=f934', the + compiler additionally optimizes it for the Fujitsu MB86934 chip, + which is the more recent SPARClite with FPU. + + With '-mcpu=sparclet', GCC generates code for the SPARClet variant + of the SPARC architecture. This adds the integer multiply, + multiply/accumulate, integer divide step and scan ('ffs') + instructions which exist in SPARClet but not in SPARC-V7. With + '-mcpu=tsc701', the compiler additionally optimizes it for the + TEMIC SPARClet chip. + + With '-mcpu=v9', GCC generates code for the V9 variant of the SPARC + architecture. This adds 64-bit integer and floating-point move + instructions, 3 additional floating-point condition code registers + and conditional move instructions. With '-mcpu=ultrasparc', the + compiler additionally optimizes it for the Sun UltraSPARC I/II/IIi + chips. With '-mcpu=ultrasparc3', the compiler additionally + optimizes it for the Sun UltraSPARC III/III+/IIIi/IIIi+/IV/IV+ + chips. With '-mcpu=niagara', the compiler additionally optimizes + it for Sun UltraSPARC T1 chips. With '-mcpu=niagara2', the + compiler additionally optimizes it for Sun UltraSPARC T2 chips. + With '-mcpu=niagara3', the compiler additionally optimizes it for + Sun UltraSPARC T3 chips. With '-mcpu=niagara4', the compiler + additionally optimizes it for Sun UltraSPARC T4 chips. + +'-mtune=CPU_TYPE' + Set the instruction scheduling parameters for machine type + CPU_TYPE, but do not set the instruction set or register set that + the option '-mcpu=CPU_TYPE' does. + + The same values for '-mcpu=CPU_TYPE' can be used for + '-mtune=CPU_TYPE', but the only useful values are those that select + a particular CPU implementation. Those are 'cypress', + 'supersparc', 'hypersparc', 'leon', 'leon3', 'f930', 'f934', + 'sparclite86x', 'tsc701', 'ultrasparc', 'ultrasparc3', 'niagara', + 'niagara2', 'niagara3' and 'niagara4'. With native Solaris and + GNU/Linux toolchains, 'native' can also be used. + +'-mv8plus' +'-mno-v8plus' + With '-mv8plus', GCC generates code for the SPARC-V8+ ABI. The + difference from the V8 ABI is that the global and out registers are + considered 64 bits wide. This is enabled by default on Solaris in + 32-bit mode for all SPARC-V9 processors. + +'-mvis' +'-mno-vis' + With '-mvis', GCC generates code that takes advantage of the + UltraSPARC Visual Instruction Set extensions. The default is + '-mno-vis'. + +'-mvis2' +'-mno-vis2' + With '-mvis2', GCC generates code that takes advantage of version + 2.0 of the UltraSPARC Visual Instruction Set extensions. The + default is '-mvis2' when targeting a cpu that supports such + instructions, such as UltraSPARC-III and later. Setting '-mvis2' + also sets '-mvis'. + +'-mvis3' +'-mno-vis3' + With '-mvis3', GCC generates code that takes advantage of version + 3.0 of the UltraSPARC Visual Instruction Set extensions. The + default is '-mvis3' when targeting a cpu that supports such + instructions, such as niagara-3 and later. Setting '-mvis3' also + sets '-mvis2' and '-mvis'. + +'-mcbcond' +'-mno-cbcond' + With '-mcbcond', GCC generates code that takes advantage of + compare-and-branch instructions, as defined in the Sparc + Architecture 2011. The default is '-mcbcond' when targeting a cpu + that supports such instructions, such as niagara-4 and later. + +'-mpopc' +'-mno-popc' + With '-mpopc', GCC generates code that takes advantage of the + UltraSPARC population count instruction. The default is '-mpopc' + when targeting a cpu that supports such instructions, such as + Niagara-2 and later. + +'-mfmaf' +'-mno-fmaf' + With '-mfmaf', GCC generates code that takes advantage of the + UltraSPARC Fused Multiply-Add Floating-point extensions. The + default is '-mfmaf' when targeting a cpu that supports such + instructions, such as Niagara-3 and later. + +'-mfix-at697f' + Enable the documented workaround for the single erratum of the + Atmel AT697F processor (which corresponds to erratum #13 of the + AT697E processor). + +'-mfix-ut699' + Enable the documented workarounds for the floating-point errata and + the data cache nullify errata of the UT699 processor. + + These '-m' options are supported in addition to the above on SPARC-V9 +processors in 64-bit environments: + +'-m32' +'-m64' + Generate code for a 32-bit or 64-bit environment. The 32-bit + environment sets int, long and pointer to 32 bits. The 64-bit + environment sets int to 32 bits and long and pointer to 64 bits. + +'-mcmodel=WHICH' + Set the code model to one of + + 'medlow' + The Medium/Low code model: 64-bit addresses, programs must be + linked in the low 32 bits of memory. Programs can be + statically or dynamically linked. + + 'medmid' + The Medium/Middle code model: 64-bit addresses, programs must + be linked in the low 44 bits of memory, the text and data + segments must be less than 2GB in size and the data segment + must be located within 2GB of the text segment. + + 'medany' + The Medium/Anywhere code model: 64-bit addresses, programs may + be linked anywhere in memory, the text and data segments must + be less than 2GB in size and the data segment must be located + within 2GB of the text segment. + + 'embmedany' + The Medium/Anywhere code model for embedded systems: 64-bit + addresses, the text and data segments must be less than 2GB in + size, both starting anywhere in memory (determined at link + time). The global register %g4 points to the base of the data + segment. Programs are statically linked and PIC is not + supported. + +'-mmemory-model=MEM-MODEL' + Set the memory model in force on the processor to one of + + 'default' + The default memory model for the processor and operating + system. + + 'rmo' + Relaxed Memory Order + + 'pso' + Partial Store Order + + 'tso' + Total Store Order + + 'sc' + Sequential Consistency + + These memory models are formally defined in Appendix D of the Sparc + V9 architecture manual, as set in the processor's 'PSTATE.MM' + field. + +'-mstack-bias' +'-mno-stack-bias' + With '-mstack-bias', GCC assumes that the stack pointer, and frame + pointer if present, are offset by -2047 which must be added back + when making stack frame references. This is the default in 64-bit + mode. Otherwise, assume no such offset is present. + + +File: gcc.info, Node: SPU Options, Next: System V Options, Prev: SPARC Options, Up: Submodel Options + +3.17.45 SPU Options +------------------- + +These '-m' options are supported on the SPU: + +'-mwarn-reloc' +'-merror-reloc' + + The loader for SPU does not handle dynamic relocations. By + default, GCC gives an error when it generates code that requires a + dynamic relocation. '-mno-error-reloc' disables the error, + '-mwarn-reloc' generates a warning instead. + +'-msafe-dma' +'-munsafe-dma' + + Instructions that initiate or test completion of DMA must not be + reordered with respect to loads and stores of the memory that is + being accessed. With '-munsafe-dma' you must use the 'volatile' + keyword to protect memory accesses, but that can lead to + inefficient code in places where the memory is known to not change. + Rather than mark the memory as volatile, you can use '-msafe-dma' + to tell the compiler to treat the DMA instructions as potentially + affecting all memory. + +'-mbranch-hints' + + By default, GCC generates a branch hint instruction to avoid + pipeline stalls for always-taken or probably-taken branches. A + hint is not generated closer than 8 instructions away from its + branch. There is little reason to disable them, except for + debugging purposes, or to make an object a little bit smaller. + +'-msmall-mem' +'-mlarge-mem' + + By default, GCC generates code assuming that addresses are never + larger than 18 bits. With '-mlarge-mem' code is generated that + assumes a full 32-bit address. + +'-mstdmain' + + By default, GCC links against startup code that assumes the + SPU-style main function interface (which has an unconventional + parameter list). With '-mstdmain', GCC links your program against + startup code that assumes a C99-style interface to 'main', + including a local copy of 'argv' strings. + +'-mfixed-range=REGISTER-RANGE' + Generate code treating the given register range as fixed registers. + A fixed register is one that the register allocator cannot use. + This is useful when compiling kernel code. A register range is + specified as two registers separated by a dash. Multiple register + ranges can be specified separated by a comma. + +'-mea32' +'-mea64' + Compile code assuming that pointers to the PPU address space + accessed via the '__ea' named address space qualifier are either 32 + or 64 bits wide. The default is 32 bits. As this is an + ABI-changing option, all object code in an executable must be + compiled with the same setting. + +'-maddress-space-conversion' +'-mno-address-space-conversion' + Allow/disallow treating the '__ea' address space as superset of the + generic address space. This enables explicit type casts between + '__ea' and generic pointer as well as implicit conversions of + generic pointers to '__ea' pointers. The default is to allow + address space pointer conversions. + +'-mcache-size=CACHE-SIZE' + This option controls the version of libgcc that the compiler links + to an executable and selects a software-managed cache for accessing + variables in the '__ea' address space with a particular cache size. + Possible options for CACHE-SIZE are '8', '16', '32', '64' and + '128'. The default cache size is 64KB. + +'-matomic-updates' +'-mno-atomic-updates' + This option controls the version of libgcc that the compiler links + to an executable and selects whether atomic updates to the + software-managed cache of PPU-side variables are used. If you use + atomic updates, changes to a PPU variable from SPU code using the + '__ea' named address space qualifier do not interfere with changes + to other PPU variables residing in the same cache line from PPU + code. If you do not use atomic updates, such interference may + occur; however, writing back cache lines is more efficient. The + default behavior is to use atomic updates. + +'-mdual-nops' +'-mdual-nops=N' + By default, GCC inserts nops to increase dual issue when it expects + it to increase performance. N can be a value from 0 to 10. A + smaller N inserts fewer nops. 10 is the default, 0 is the same as + '-mno-dual-nops'. Disabled with '-Os'. + +'-mhint-max-nops=N' + Maximum number of nops to insert for a branch hint. A branch hint + must be at least 8 instructions away from the branch it is + affecting. GCC inserts up to N nops to enforce this, otherwise it + does not generate the branch hint. + +'-mhint-max-distance=N' + The encoding of the branch hint instruction limits the hint to be + within 256 instructions of the branch it is affecting. By default, + GCC makes sure it is within 125. + +'-msafe-hints' + Work around a hardware bug that causes the SPU to stall + indefinitely. By default, GCC inserts the 'hbrp' instruction to + make sure this stall won't happen. + + +File: gcc.info, Node: System V Options, Next: TILE-Gx Options, Prev: SPU Options, Up: Submodel Options + +3.17.46 Options for System V +---------------------------- + +These additional options are available on System V Release 4 for +compatibility with other compilers on those systems: + +'-G' + Create a shared object. It is recommended that '-symbolic' or + '-shared' be used instead. + +'-Qy' + Identify the versions of each tool used by the compiler, in a + '.ident' assembler directive in the output. + +'-Qn' + Refrain from adding '.ident' directives to the output file (this is + the default). + +'-YP,DIRS' + Search the directories DIRS, and no others, for libraries specified + with '-l'. + +'-Ym,DIR' + Look in the directory DIR to find the M4 preprocessor. The + assembler uses this option. + + +File: gcc.info, Node: TILE-Gx Options, Next: TILEPro Options, Prev: System V Options, Up: Submodel Options + +3.17.47 TILE-Gx Options +----------------------- + +These '-m' options are supported on the TILE-Gx: + +'-mcmodel=small' + Generate code for the small model. The distance for direct calls + is limited to 500M in either direction. PC-relative addresses are + 32 bits. Absolute addresses support the full address range. + +'-mcmodel=large' + Generate code for the large model. There is no limitation on call + distance, pc-relative addresses, or absolute addresses. + +'-mcpu=NAME' + Selects the type of CPU to be targeted. Currently the only + supported type is 'tilegx'. + +'-m32' +'-m64' + Generate code for a 32-bit or 64-bit environment. The 32-bit + environment sets int, long, and pointer to 32 bits. The 64-bit + environment sets int to 32 bits and long and pointer to 64 bits. + +'-mbig-endian' +'-mlittle-endian' + Generate code in big/little endian mode, respectively. + + +File: gcc.info, Node: TILEPro Options, Next: V850 Options, Prev: TILE-Gx Options, Up: Submodel Options + +3.17.48 TILEPro Options +----------------------- + +These '-m' options are supported on the TILEPro: + +'-mcpu=NAME' + Selects the type of CPU to be targeted. Currently the only + supported type is 'tilepro'. + +'-m32' + Generate code for a 32-bit environment, which sets int, long, and + pointer to 32 bits. This is the only supported behavior so the + flag is essentially ignored. + + +File: gcc.info, Node: V850 Options, Next: VAX Options, Prev: TILEPro Options, Up: Submodel Options + +3.17.49 V850 Options +-------------------- + +These '-m' options are defined for V850 implementations: + +'-mlong-calls' +'-mno-long-calls' + Treat all calls as being far away (near). If calls are assumed to + be far away, the compiler always loads the function's address into + a register, and calls indirect through the pointer. + +'-mno-ep' +'-mep' + Do not optimize (do optimize) basic blocks that use the same index + pointer 4 or more times to copy pointer into the 'ep' register, and + use the shorter 'sld' and 'sst' instructions. The '-mep' option is + on by default if you optimize. + +'-mno-prolog-function' +'-mprolog-function' + Do not use (do use) external functions to save and restore + registers at the prologue and epilogue of a function. The external + functions are slower, but use less code space if more than one + function saves the same number of registers. The + '-mprolog-function' option is on by default if you optimize. + +'-mspace' + Try to make the code as small as possible. At present, this just + turns on the '-mep' and '-mprolog-function' options. + +'-mtda=N' + Put static or global variables whose size is N bytes or less into + the tiny data area that register 'ep' points to. The tiny data + area can hold up to 256 bytes in total (128 bytes for byte + references). + +'-msda=N' + Put static or global variables whose size is N bytes or less into + the small data area that register 'gp' points to. The small data + area can hold up to 64 kilobytes. + +'-mzda=N' + Put static or global variables whose size is N bytes or less into + the first 32 kilobytes of memory. + +'-mv850' + Specify that the target processor is the V850. + +'-mv850e3v5' + Specify that the target processor is the V850E3V5. The + preprocessor constant '__v850e3v5__' is defined if this option is + used. + +'-mv850e2v4' + Specify that the target processor is the V850E3V5. This is an + alias for the '-mv850e3v5' option. + +'-mv850e2v3' + Specify that the target processor is the V850E2V3. The + preprocessor constant '__v850e2v3__' is defined if this option is + used. + +'-mv850e2' + Specify that the target processor is the V850E2. The preprocessor + constant '__v850e2__' is defined if this option is used. + +'-mv850e1' + Specify that the target processor is the V850E1. The preprocessor + constants '__v850e1__' and '__v850e__' are defined if this option + is used. + +'-mv850es' + Specify that the target processor is the V850ES. This is an alias + for the '-mv850e1' option. + +'-mv850e' + Specify that the target processor is the V850E. The preprocessor + constant '__v850e__' is defined if this option is used. + + If neither '-mv850' nor '-mv850e' nor '-mv850e1' nor '-mv850e2' nor + '-mv850e2v3' nor '-mv850e3v5' are defined then a default target + processor is chosen and the relevant '__v850*__' preprocessor + constant is defined. + + The preprocessor constants '__v850' and '__v851__' are always + defined, regardless of which processor variant is the target. + +'-mdisable-callt' +'-mno-disable-callt' + This option suppresses generation of the 'CALLT' instruction for + the v850e, v850e1, v850e2, v850e2v3 and v850e3v5 flavors of the + v850 architecture. + + This option is enabled by default when the RH850 ABI is in use (see + '-mrh850-abi'), and disabled by default when the GCC ABI is in use. + If 'CALLT' instructions are being generated then the C preprocessor + symbol '__V850_CALLT__' will be defined. + +'-mrelax' +'-mno-relax' + Pass on (or do not pass on) the '-mrelax' command line option to + the assembler. + +'-mlong-jumps' +'-mno-long-jumps' + Disable (or re-enable) the generation of PC-relative jump + instructions. + +'-msoft-float' +'-mhard-float' + Disable (or re-enable) the generation of hardware floating point + instructions. This option is only significant when the target + architecture is 'V850E2V3' or higher. If hardware floating point + instructions are being generated then the C preprocessor symbol + '__FPU_OK__' will be defined, otherwise the symbol '__NO_FPU__' + will be defined. + +'-mloop' + Enables the use of the e3v5 LOOP instruction. The use of this + instruction is not enabled by default when the e3v5 architecture is + selected because its use is still experimental. + +'-mrh850-abi' +'-mghs' + Enables support for the RH850 version of the V850 ABI. This is the + default. With this version of the ABI the following rules apply: + + * Integer sized structures and unions are returned via a memory + pointer rather than a register. + + * Large structures and unions (more than 8 bytes in size) are + passed by value. + + * Functions are aligned to 16-bit boundaries. + + * The '-m8byte-align' command line option is supported. + + * The '-mdisable-callt' command line option is enabled by + default. The '-mno-disable-callt' command line option is not + supported. + + When this version of the ABI is enabled the C preprocessor symbol + '__V850_RH850_ABI__' is defined. + +'-mgcc-abi' + Enables support for the old GCC version of the V850 ABI. With this + version of the ABI the following rules apply: + + * Integer sized structures and unions are returned in register + 'r10'. + + * Large structures and unions (more than 8 bytes in size) are + passed by reference. + + * Functions are aligned to 32-bit boundaries, unless optimizing + for size. + + * The '-m8byte-align' command line option is not supported. + + * The '-mdisable-callt' command line option is supported but not + enabled by default. + + When this version of the ABI is enabled the C preprocessor symbol + '__V850_GCC_ABI__' is defined. + +'-m8byte-align' +'-mno-8byte-align' + Enables support for 'doubles' and 'long long' types to be aligned + on 8-byte boundaries. The default is to restrict the alignment of + all objects to at most 4-bytes. When '-m8byte-align' is in effect + the C preprocessor symbol '__V850_8BYTE_ALIGN__' will be defined. + +'-mbig-switch' + Generate code suitable for big switch tables. Use this option only + if the assembler/linker complain about out of range branches within + a switch table. + +'-mapp-regs' + This option causes r2 and r5 to be used in the code generated by + the compiler. This setting is the default. + +'-mno-app-regs' + This option causes r2 and r5 to be treated as fixed registers. + + +File: gcc.info, Node: VAX Options, Next: VMS Options, Prev: V850 Options, Up: Submodel Options + +3.17.50 VAX Options +------------------- + +These '-m' options are defined for the VAX: + +'-munix' + Do not output certain jump instructions ('aobleq' and so on) that + the Unix assembler for the VAX cannot handle across long ranges. + +'-mgnu' + Do output those jump instructions, on the assumption that the GNU + assembler is being used. + +'-mg' + Output code for G-format floating-point numbers instead of + D-format. + + +File: gcc.info, Node: VMS Options, Next: VxWorks Options, Prev: VAX Options, Up: Submodel Options + +3.17.51 VMS Options +------------------- + +These '-m' options are defined for the VMS implementations: + +'-mvms-return-codes' + Return VMS condition codes from 'main'. The default is to return + POSIX-style condition (e.g. error) codes. + +'-mdebug-main=PREFIX' + Flag the first routine whose name starts with PREFIX as the main + routine for the debugger. + +'-mmalloc64' + Default to 64-bit memory allocation routines. + +'-mpointer-size=SIZE' + Set the default size of pointers. Possible options for SIZE are + '32' or 'short' for 32 bit pointers, '64' or 'long' for 64 bit + pointers, and 'no' for supporting only 32 bit pointers. The later + option disables 'pragma pointer_size'. + + +File: gcc.info, Node: VxWorks Options, Next: x86-64 Options, Prev: VMS Options, Up: Submodel Options + +3.17.52 VxWorks Options +----------------------- + +The options in this section are defined for all VxWorks targets. +Options specific to the target hardware are listed with the other +options for that target. + +'-mrtp' + GCC can generate code for both VxWorks kernels and real time + processes (RTPs). This option switches from the former to the + latter. It also defines the preprocessor macro '__RTP__'. + +'-non-static' + Link an RTP executable against shared libraries rather than static + libraries. The options '-static' and '-shared' can also be used + for RTPs (*note Link Options::); '-static' is the default. + +'-Bstatic' +'-Bdynamic' + These options are passed down to the linker. They are defined for + compatibility with Diab. + +'-Xbind-lazy' + Enable lazy binding of function calls. This option is equivalent + to '-Wl,-z,now' and is defined for compatibility with Diab. + +'-Xbind-now' + Disable lazy binding of function calls. This option is the default + and is defined for compatibility with Diab. + + +File: gcc.info, Node: x86-64 Options, Next: Xstormy16 Options, Prev: VxWorks Options, Up: Submodel Options + +3.17.53 x86-64 Options +---------------------- + +These are listed under *Note i386 and x86-64 Options::. + + +File: gcc.info, Node: Xstormy16 Options, Next: Xtensa Options, Prev: x86-64 Options, Up: Submodel Options + +3.17.54 Xstormy16 Options +------------------------- + +These options are defined for Xstormy16: + +'-msim' + Choose startup files and linker script suitable for the simulator. + + +File: gcc.info, Node: Xtensa Options, Next: zSeries Options, Prev: Xstormy16 Options, Up: Submodel Options + +3.17.55 Xtensa Options +---------------------- + +These options are supported for Xtensa targets: + +'-mconst16' +'-mno-const16' + Enable or disable use of 'CONST16' instructions for loading + constant values. The 'CONST16' instruction is currently not a + standard option from Tensilica. When enabled, 'CONST16' + instructions are always used in place of the standard 'L32R' + instructions. The use of 'CONST16' is enabled by default only if + the 'L32R' instruction is not available. + +'-mfused-madd' +'-mno-fused-madd' + Enable or disable use of fused multiply/add and multiply/subtract + instructions in the floating-point option. This has no effect if + the floating-point option is not also enabled. Disabling fused + multiply/add and multiply/subtract instructions forces the compiler + to use separate instructions for the multiply and add/subtract + operations. This may be desirable in some cases where strict IEEE + 754-compliant results are required: the fused multiply add/subtract + instructions do not round the intermediate result, thereby + producing results with _more_ bits of precision than specified by + the IEEE standard. Disabling fused multiply add/subtract + instructions also ensures that the program output is not sensitive + to the compiler's ability to combine multiply and add/subtract + operations. + +'-mserialize-volatile' +'-mno-serialize-volatile' + When this option is enabled, GCC inserts 'MEMW' instructions before + 'volatile' memory references to guarantee sequential consistency. + The default is '-mserialize-volatile'. Use + '-mno-serialize-volatile' to omit the 'MEMW' instructions. + +'-mforce-no-pic' + For targets, like GNU/Linux, where all user-mode Xtensa code must + be position-independent code (PIC), this option disables PIC for + compiling kernel code. + +'-mtext-section-literals' +'-mno-text-section-literals' + Control the treatment of literal pools. The default is + '-mno-text-section-literals', which places literals in a separate + section in the output file. This allows the literal pool to be + placed in a data RAM/ROM, and it also allows the linker to combine + literal pools from separate object files to remove redundant + literals and improve code size. With '-mtext-section-literals', + the literals are interspersed in the text section in order to keep + them as close as possible to their references. This may be + necessary for large assembly files. + +'-mtarget-align' +'-mno-target-align' + When this option is enabled, GCC instructs the assembler to + automatically align instructions to reduce branch penalties at the + expense of some code density. The assembler attempts to widen + density instructions to align branch targets and the instructions + following call instructions. If there are not enough preceding + safe density instructions to align a target, no widening is + performed. The default is '-mtarget-align'. These options do not + affect the treatment of auto-aligned instructions like 'LOOP', + which the assembler always aligns, either by widening density + instructions or by inserting NOP instructions. + +'-mlongcalls' +'-mno-longcalls' + When this option is enabled, GCC instructs the assembler to + translate direct calls to indirect calls unless it can determine + that the target of a direct call is in the range allowed by the + call instruction. This translation typically occurs for calls to + functions in other source files. Specifically, the assembler + translates a direct 'CALL' instruction into an 'L32R' followed by a + 'CALLX' instruction. The default is '-mno-longcalls'. This option + should be used in programs where the call target can potentially be + out of range. This option is implemented in the assembler, not the + compiler, so the assembly code generated by GCC still shows direct + call instructions--look at the disassembled object code to see the + actual instructions. Note that the assembler uses an indirect call + for every cross-file call, not just those that really are out of + range. + + +File: gcc.info, Node: zSeries Options, Prev: Xtensa Options, Up: Submodel Options + +3.17.56 zSeries Options +----------------------- + +These are listed under *Note S/390 and zSeries Options::. + + +File: gcc.info, Node: Code Gen Options, Next: Environment Variables, Prev: Submodel Options, Up: Invoking GCC + +3.18 Options for Code Generation Conventions +============================================ + +These machine-independent options control the interface conventions used +in code generation. + + Most of them have both positive and negative forms; the negative form +of '-ffoo' is '-fno-foo'. In the table below, only one of the forms is +listed--the one that is not the default. You can figure out the other +form by either removing 'no-' or adding it. + +'-fbounds-check' + For front ends that support it, generate additional code to check + that indices used to access arrays are within the declared range. + This is currently only supported by the Java and Fortran front + ends, where this option defaults to true and false respectively. + +'-fstack-reuse=REUSE-LEVEL' + This option controls stack space reuse for user declared local/auto + variables and compiler generated temporaries. REUSE_LEVEL can be + 'all', 'named_vars', or 'none'. 'all' enables stack reuse for all + local variables and temporaries, 'named_vars' enables the reuse + only for user defined local variables with names, and 'none' + disables stack reuse completely. The default value is 'all'. The + option is needed when the program extends the lifetime of a scoped + local variable or a compiler generated temporary beyond the end + point defined by the language. When a lifetime of a variable ends, + and if the variable lives in memory, the optimizing compiler has + the freedom to reuse its stack space with other temporaries or + scoped local variables whose live range does not overlap with it. + Legacy code extending local lifetime will likely to break with the + stack reuse optimization. + + For example, + + int *p; + { + int local1; + + p = &local1; + local1 = 10; + .... + } + { + int local2; + local2 = 20; + ... + } + + if (*p == 10) // out of scope use of local1 + { + + } + + Another example: + + struct A + { + A(int k) : i(k), j(k) { } + int i; + int j; + }; + + A *ap; + + void foo(const A& ar) + { + ap = &ar; + } + + void bar() + { + foo(A(10)); // temp object's lifetime ends when foo returns + + { + A a(20); + .... + } + ap->i+= 10; // ap references out of scope temp whose space + // is reused with a. What is the value of ap->i? + } + + The lifetime of a compiler generated temporary is well defined by + the C++ standard. When a lifetime of a temporary ends, and if the + temporary lives in memory, the optimizing compiler has the freedom + to reuse its stack space with other temporaries or scoped local + variables whose live range does not overlap with it. However some + of the legacy code relies on the behavior of older compilers in + which temporaries' stack space is not reused, the aggressive stack + reuse can lead to runtime errors. This option is used to control + the temporary stack reuse optimization. + +'-ftrapv' + This option generates traps for signed overflow on addition, + subtraction, multiplication operations. + +'-fwrapv' + This option instructs the compiler to assume that signed arithmetic + overflow of addition, subtraction and multiplication wraps around + using twos-complement representation. This flag enables some + optimizations and disables others. This option is enabled by + default for the Java front end, as required by the Java language + specification. + +'-fexceptions' + Enable exception handling. Generates extra code needed to + propagate exceptions. For some targets, this implies GCC generates + frame unwind information for all functions, which can produce + significant data size overhead, although it does not affect + execution. If you do not specify this option, GCC enables it by + default for languages like C++ that normally require exception + handling, and disables it for languages like C that do not normally + require it. However, you may need to enable this option when + compiling C code that needs to interoperate properly with exception + handlers written in C++. You may also wish to disable this option + if you are compiling older C++ programs that don't use exception + handling. + +'-fnon-call-exceptions' + Generate code that allows trapping instructions to throw + exceptions. Note that this requires platform-specific runtime + support that does not exist everywhere. Moreover, it only allows + _trapping_ instructions to throw exceptions, i.e. memory references + or floating-point instructions. It does not allow exceptions to be + thrown from arbitrary signal handlers such as 'SIGALRM'. + +'-fdelete-dead-exceptions' + Consider that instructions that may throw exceptions but don't + otherwise contribute to the execution of the program can be + optimized away. This option is enabled by default for the Ada + front end, as permitted by the Ada language specification. + Optimization passes that cause dead exceptions to be removed are + enabled independently at different optimization levels. + +'-funwind-tables' + Similar to '-fexceptions', except that it just generates any needed + static data, but does not affect the generated code in any other + way. You normally do not need to enable this option; instead, a + language processor that needs this handling enables it on your + behalf. + +'-fasynchronous-unwind-tables' + Generate unwind table in DWARF 2 format, if supported by target + machine. The table is exact at each instruction boundary, so it + can be used for stack unwinding from asynchronous events (such as + debugger or garbage collector). + +'-fno-gnu-unique' + On systems with recent GNU assembler and C library, the C++ + compiler uses the 'STB_GNU_UNIQUE' binding to make sure that + definitions of template static data members and static local + variables in inline functions are unique even in the presence of + 'RTLD_LOCAL'; this is necessary to avoid problems with a library + used by two different 'RTLD_LOCAL' plugins depending on a + definition in one of them and therefore disagreeing with the other + one about the binding of the symbol. But this causes 'dlclose' to + be ignored for affected DSOs; if your program relies on + reinitialization of a DSO via 'dlclose' and 'dlopen', you can use + '-fno-gnu-unique'. + +'-fpcc-struct-return' + Return "short" 'struct' and 'union' values in memory like longer + ones, rather than in registers. This convention is less efficient, + but it has the advantage of allowing intercallability between + GCC-compiled files and files compiled with other compilers, + particularly the Portable C Compiler (pcc). + + The precise convention for returning structures in memory depends + on the target configuration macros. + + Short structures and unions are those whose size and alignment + match that of some integer type. + + *Warning:* code compiled with the '-fpcc-struct-return' switch is + not binary compatible with code compiled with the + '-freg-struct-return' switch. Use it to conform to a non-default + application binary interface. + +'-freg-struct-return' + Return 'struct' and 'union' values in registers when possible. + This is more efficient for small structures than + '-fpcc-struct-return'. + + If you specify neither '-fpcc-struct-return' nor + '-freg-struct-return', GCC defaults to whichever convention is + standard for the target. If there is no standard convention, GCC + defaults to '-fpcc-struct-return', except on targets where GCC is + the principal compiler. In those cases, we can choose the + standard, and we chose the more efficient register return + alternative. + + *Warning:* code compiled with the '-freg-struct-return' switch is + not binary compatible with code compiled with the + '-fpcc-struct-return' switch. Use it to conform to a non-default + application binary interface. + +'-fshort-enums' + Allocate to an 'enum' type only as many bytes as it needs for the + declared range of possible values. Specifically, the 'enum' type + is equivalent to the smallest integer type that has enough room. + + *Warning:* the '-fshort-enums' switch causes GCC to generate code + that is not binary compatible with code generated without that + switch. Use it to conform to a non-default application binary + interface. + +'-fshort-double' + Use the same size for 'double' as for 'float'. + + *Warning:* the '-fshort-double' switch causes GCC to generate code + that is not binary compatible with code generated without that + switch. Use it to conform to a non-default application binary + interface. + +'-fshort-wchar' + Override the underlying type for 'wchar_t' to be 'short unsigned + int' instead of the default for the target. This option is useful + for building programs to run under WINE. + + *Warning:* the '-fshort-wchar' switch causes GCC to generate code + that is not binary compatible with code generated without that + switch. Use it to conform to a non-default application binary + interface. + +'-fno-common' + In C code, controls the placement of uninitialized global + variables. Unix C compilers have traditionally permitted multiple + definitions of such variables in different compilation units by + placing the variables in a common block. This is the behavior + specified by '-fcommon', and is the default for GCC on most + targets. On the other hand, this behavior is not required by ISO + C, and on some targets may carry a speed or code size penalty on + variable references. The '-fno-common' option specifies that the + compiler should place uninitialized global variables in the data + section of the object file, rather than generating them as common + blocks. This has the effect that if the same variable is declared + (without 'extern') in two different compilations, you get a + multiple-definition error when you link them. In this case, you + must compile with '-fcommon' instead. Compiling with '-fno-common' + is useful on targets for which it provides better performance, or + if you wish to verify that the program will work on other systems + that always treat uninitialized variable declarations this way. + +'-fno-ident' + Ignore the '#ident' directive. + +'-finhibit-size-directive' + Don't output a '.size' assembler directive, or anything else that + would cause trouble if the function is split in the middle, and the + two halves are placed at locations far apart in memory. This + option is used when compiling 'crtstuff.c'; you should not need to + use it for anything else. + +'-fverbose-asm' + Put extra commentary information in the generated assembly code to + make it more readable. This option is generally only of use to + those who actually need to read the generated assembly code + (perhaps while debugging the compiler itself). + + '-fno-verbose-asm', the default, causes the extra information to be + omitted and is useful when comparing two assembler files. + +'-frecord-gcc-switches' + This switch causes the command line used to invoke the compiler to + be recorded into the object file that is being created. This + switch is only implemented on some targets and the exact format of + the recording is target and binary file format dependent, but it + usually takes the form of a section containing ASCII text. This + switch is related to the '-fverbose-asm' switch, but that switch + only records information in the assembler output file as comments, + so it never reaches the object file. See also + '-grecord-gcc-switches' for another way of storing compiler options + into the object file. + +'-fpic' + Generate position-independent code (PIC) suitable for use in a + shared library, if supported for the target machine. Such code + accesses all constant addresses through a global offset table + (GOT). The dynamic loader resolves the GOT entries when the + program starts (the dynamic loader is not part of GCC; it is part + of the operating system). If the GOT size for the linked + executable exceeds a machine-specific maximum size, you get an + error message from the linker indicating that '-fpic' does not + work; in that case, recompile with '-fPIC' instead. (These + maximums are 8k on the SPARC and 32k on the m68k and RS/6000. The + 386 has no such limit.) + + Position-independent code requires special support, and therefore + works only on certain machines. For the 386, GCC supports PIC for + System V but not for the Sun 386i. Code generated for the IBM + RS/6000 is always position-independent. + + When this flag is set, the macros '__pic__' and '__PIC__' are + defined to 1. + +'-fPIC' + If supported for the target machine, emit position-independent + code, suitable for dynamic linking and avoiding any limit on the + size of the global offset table. This option makes a difference on + the m68k, PowerPC and SPARC. + + Position-independent code requires special support, and therefore + works only on certain machines. + + When this flag is set, the macros '__pic__' and '__PIC__' are + defined to 2. + +'-fpie' +'-fPIE' + These options are similar to '-fpic' and '-fPIC', but generated + position independent code can be only linked into executables. + Usually these options are used when '-pie' GCC option is used + during linking. + + '-fpie' and '-fPIE' both define the macros '__pie__' and '__PIE__'. + The macros have the value 1 for '-fpie' and 2 for '-fPIE'. + +'-fno-jump-tables' + Do not use jump tables for switch statements even where it would be + more efficient than other code generation strategies. This option + is of use in conjunction with '-fpic' or '-fPIC' for building code + that forms part of a dynamic linker and cannot reference the + address of a jump table. On some targets, jump tables do not + require a GOT and this option is not needed. + +'-ffixed-REG' + Treat the register named REG as a fixed register; generated code + should never refer to it (except perhaps as a stack pointer, frame + pointer or in some other fixed role). + + REG must be the name of a register. The register names accepted + are machine-specific and are defined in the 'REGISTER_NAMES' macro + in the machine description macro file. + + This flag does not have a negative form, because it specifies a + three-way choice. + +'-fcall-used-REG' + Treat the register named REG as an allocable register that is + clobbered by function calls. It may be allocated for temporaries + or variables that do not live across a call. Functions compiled + this way do not save and restore the register REG. + + It is an error to use this flag with the frame pointer or stack + pointer. Use of this flag for other registers that have fixed + pervasive roles in the machine's execution model produces + disastrous results. + + This flag does not have a negative form, because it specifies a + three-way choice. + +'-fcall-saved-REG' + Treat the register named REG as an allocable register saved by + functions. It may be allocated even for temporaries or variables + that live across a call. Functions compiled this way save and + restore the register REG if they use it. + + It is an error to use this flag with the frame pointer or stack + pointer. Use of this flag for other registers that have fixed + pervasive roles in the machine's execution model produces + disastrous results. + + A different sort of disaster results from the use of this flag for + a register in which function values may be returned. + + This flag does not have a negative form, because it specifies a + three-way choice. + +'-fpack-struct[=N]' + Without a value specified, pack all structure members together + without holes. When a value is specified (which must be a small + power of two), pack structure members according to this value, + representing the maximum alignment (that is, objects with default + alignment requirements larger than this are output potentially + unaligned at the next fitting location. + + *Warning:* the '-fpack-struct' switch causes GCC to generate code + that is not binary compatible with code generated without that + switch. Additionally, it makes the code suboptimal. Use it to + conform to a non-default application binary interface. + +'-finstrument-functions' + Generate instrumentation calls for entry and exit to functions. + Just after function entry and just before function exit, the + following profiling functions are called with the address of the + current function and its call site. (On some platforms, + '__builtin_return_address' does not work beyond the current + function, so the call site information may not be available to the + profiling functions otherwise.) + + void __cyg_profile_func_enter (void *this_fn, + void *call_site); + void __cyg_profile_func_exit (void *this_fn, + void *call_site); + + The first argument is the address of the start of the current + function, which may be looked up exactly in the symbol table. + + This instrumentation is also done for functions expanded inline in + other functions. The profiling calls indicate where, conceptually, + the inline function is entered and exited. This means that + addressable versions of such functions must be available. If all + your uses of a function are expanded inline, this may mean an + additional expansion of code size. If you use 'extern inline' in + your C code, an addressable version of such functions must be + provided. (This is normally the case anyway, but if you get lucky + and the optimizer always expands the functions inline, you might + have gotten away without providing static copies.) + + A function may be given the attribute 'no_instrument_function', in + which case this instrumentation is not done. This can be used, for + example, for the profiling functions listed above, high-priority + interrupt routines, and any functions from which the profiling + functions cannot safely be called (perhaps signal handlers, if the + profiling routines generate output or allocate memory). + +'-finstrument-functions-exclude-file-list=FILE,FILE,...' + + Set the list of functions that are excluded from instrumentation + (see the description of '-finstrument-functions'). If the file + that contains a function definition matches with one of FILE, then + that function is not instrumented. The match is done on + substrings: if the FILE parameter is a substring of the file name, + it is considered to be a match. + + For example: + + -finstrument-functions-exclude-file-list=/bits/stl,include/sys + + excludes any inline function defined in files whose pathnames + contain '/bits/stl' or 'include/sys'. + + If, for some reason, you want to include letter '','' in one of + SYM, write ''\,''. For example, + '-finstrument-functions-exclude-file-list='\,\,tmp'' (note the + single quote surrounding the option). + +'-finstrument-functions-exclude-function-list=SYM,SYM,...' + + This is similar to '-finstrument-functions-exclude-file-list', but + this option sets the list of function names to be excluded from + instrumentation. The function name to be matched is its + user-visible name, such as 'vector<int> blah(const vector<int> &)', + not the internal mangled name (e.g., '_Z4blahRSt6vectorIiSaIiEE'). + The match is done on substrings: if the SYM parameter is a + substring of the function name, it is considered to be a match. + For C99 and C++ extended identifiers, the function name must be + given in UTF-8, not using universal character names. + +'-fstack-check' + Generate code to verify that you do not go beyond the boundary of + the stack. You should specify this flag if you are running in an + environment with multiple threads, but you only rarely need to + specify it in a single-threaded environment since stack overflow is + automatically detected on nearly all systems if there is only one + stack. + + Note that this switch does not actually cause checking to be done; + the operating system or the language runtime must do that. The + switch causes generation of code to ensure that they see the stack + being extended. + + You can additionally specify a string parameter: 'no' means no + checking, 'generic' means force the use of old-style checking, + 'specific' means use the best checking method and is equivalent to + bare '-fstack-check'. + + Old-style checking is a generic mechanism that requires no specific + target support in the compiler but comes with the following + drawbacks: + + 1. Modified allocation strategy for large objects: they are + always allocated dynamically if their size exceeds a fixed + threshold. + + 2. Fixed limit on the size of the static frame of functions: when + it is topped by a particular function, stack checking is not + reliable and a warning is issued by the compiler. + + 3. Inefficiency: because of both the modified allocation strategy + and the generic implementation, code performance is hampered. + + Note that old-style stack checking is also the fallback method for + 'specific' if no target support has been added in the compiler. + +'-fstack-limit-register=REG' +'-fstack-limit-symbol=SYM' +'-fno-stack-limit' + Generate code to ensure that the stack does not grow beyond a + certain value, either the value of a register or the address of a + symbol. If a larger stack is required, a signal is raised at run + time. For most targets, the signal is raised before the stack + overruns the boundary, so it is possible to catch the signal + without taking special precautions. + + For instance, if the stack starts at absolute address '0x80000000' + and grows downwards, you can use the flags + '-fstack-limit-symbol=__stack_limit' and + '-Wl,--defsym,__stack_limit=0x7ffe0000' to enforce a stack limit of + 128KB. Note that this may only work with the GNU linker. + +'-fsplit-stack' + Generate code to automatically split the stack before it overflows. + The resulting program has a discontiguous stack which can only + overflow if the program is unable to allocate any more memory. + This is most useful when running threaded programs, as it is no + longer necessary to calculate a good stack size to use for each + thread. This is currently only implemented for the i386 and x86_64 + back ends running GNU/Linux. + + When code compiled with '-fsplit-stack' calls code compiled without + '-fsplit-stack', there may not be much stack space available for + the latter code to run. If compiling all code, including library + code, with '-fsplit-stack' is not an option, then the linker can + fix up these calls so that the code compiled without + '-fsplit-stack' always has a large stack. Support for this is + implemented in the gold linker in GNU binutils release 2.21 and + later. + +'-fleading-underscore' + This option and its counterpart, '-fno-leading-underscore', + forcibly change the way C symbols are represented in the object + file. One use is to help link with legacy assembly code. + + *Warning:* the '-fleading-underscore' switch causes GCC to generate + code that is not binary compatible with code generated without that + switch. Use it to conform to a non-default application binary + interface. Not all targets provide complete support for this + switch. + +'-ftls-model=MODEL' + Alter the thread-local storage model to be used (*note + Thread-Local::). The MODEL argument should be one of + 'global-dynamic', 'local-dynamic', 'initial-exec' or 'local-exec'. + Note that the choice is subject to optimization: the compiler may + use a more efficient model for symbols not visible outside of the + translation unit, or if '-fpic' is not given on the command line. + + The default without '-fpic' is 'initial-exec'; with '-fpic' the + default is 'global-dynamic'. + +'-fvisibility=DEFAULT|INTERNAL|HIDDEN|PROTECTED' + Set the default ELF image symbol visibility to the specified + option--all symbols are marked with this unless overridden within + the code. Using this feature can very substantially improve + linking and load times of shared object libraries, produce more + optimized code, provide near-perfect API export and prevent symbol + clashes. It is *strongly* recommended that you use this in any + shared objects you distribute. + + Despite the nomenclature, 'default' always means public; i.e., + available to be linked against from outside the shared object. + 'protected' and 'internal' are pretty useless in real-world usage + so the only other commonly used option is 'hidden'. The default if + '-fvisibility' isn't specified is 'default', i.e., make every + symbol public--this causes the same behavior as previous versions + of GCC. + + A good explanation of the benefits offered by ensuring ELF symbols + have the correct visibility is given by "How To Write Shared + Libraries" by Ulrich Drepper (which can be found at + <http://people.redhat.com/~drepper/>)--however a superior solution + made possible by this option to marking things hidden when the + default is public is to make the default hidden and mark things + public. This is the norm with DLLs on Windows and with + '-fvisibility=hidden' and '__attribute__ ((visibility("default")))' + instead of '__declspec(dllexport)' you get almost identical + semantics with identical syntax. This is a great boon to those + working with cross-platform projects. + + For those adding visibility support to existing code, you may find + '#pragma GCC visibility' of use. This works by you enclosing the + declarations you wish to set visibility for with (for example) + '#pragma GCC visibility push(hidden)' and '#pragma GCC visibility + pop'. Bear in mind that symbol visibility should be viewed *as + part of the API interface contract* and thus all new code should + always specify visibility when it is not the default; i.e., + declarations only for use within the local DSO should *always* be + marked explicitly as hidden as so to avoid PLT indirection + overheads--making this abundantly clear also aids readability and + self-documentation of the code. Note that due to ISO C++ + specification requirements, 'operator new' and 'operator delete' + must always be of default visibility. + + Be aware that headers from outside your project, in particular + system headers and headers from any other library you use, may not + be expecting to be compiled with visibility other than the default. + You may need to explicitly say '#pragma GCC visibility + push(default)' before including any such headers. + + 'extern' declarations are not affected by '-fvisibility', so a lot + of code can be recompiled with '-fvisibility=hidden' with no + modifications. However, this means that calls to 'extern' + functions with no explicit visibility use the PLT, so it is more + effective to use '__attribute ((visibility))' and/or '#pragma GCC + visibility' to tell the compiler which 'extern' declarations should + be treated as hidden. + + Note that '-fvisibility' does affect C++ vague linkage entities. + This means that, for instance, an exception class that is be thrown + between DSOs must be explicitly marked with default visibility so + that the 'type_info' nodes are unified between the DSOs. + + An overview of these techniques, their benefits and how to use them + is at <http://gcc.gnu.org/wiki/Visibility>. + +'-fstrict-volatile-bitfields' + This option should be used if accesses to volatile bit-fields (or + other structure fields, although the compiler usually honors those + types anyway) should use a single access of the width of the + field's type, aligned to a natural alignment if possible. For + example, targets with memory-mapped peripheral registers might + require all such accesses to be 16 bits wide; with this flag you + can declare all peripheral bit-fields as 'unsigned short' (assuming + short is 16 bits on these targets) to force GCC to use 16-bit + accesses instead of, perhaps, a more efficient 32-bit access. + + If this option is disabled, the compiler uses the most efficient + instruction. In the previous example, that might be a 32-bit load + instruction, even though that accesses bytes that do not contain + any portion of the bit-field, or memory-mapped registers unrelated + to the one being updated. + + In some cases, such as when the 'packed' attribute is applied to a + structure field, it may not be possible to access the field with a + single read or write that is correctly aligned for the target + machine. In this case GCC falls back to generating multiple + accesses rather than code that will fault or truncate the result at + run time. + + Note: Due to restrictions of the C/C++11 memory model, write + accesses are not allowed to touch non bit-field members. It is + therefore recommended to define all bits of the field's type as + bit-field members. + + The default value of this option is determined by the application + binary interface for the target processor. + +'-fsync-libcalls' + This option controls whether any out-of-line instance of the + '__sync' family of functions may be used to implement the C++11 + '__atomic' family of functions. + + The default value of this option is enabled, thus the only useful + form of the option is '-fno-sync-libcalls'. This option is used in + the implementation of the 'libatomic' runtime library. + + +File: gcc.info, Node: Environment Variables, Next: Precompiled Headers, Prev: Code Gen Options, Up: Invoking GCC + +3.19 Environment Variables Affecting GCC +======================================== + +This section describes several environment variables that affect how GCC +operates. Some of them work by specifying directories or prefixes to +use when searching for various kinds of files. Some are used to specify +other aspects of the compilation environment. + + Note that you can also specify places to search using options such as +'-B', '-I' and '-L' (*note Directory Options::). These take precedence +over places specified using environment variables, which in turn take +precedence over those specified by the configuration of GCC. *Note +Controlling the Compilation Driver 'gcc': (gccint)Driver. + +'LANG' +'LC_CTYPE' +'LC_MESSAGES' +'LC_ALL' + These environment variables control the way that GCC uses + localization information which allows GCC to work with different + national conventions. GCC inspects the locale categories + 'LC_CTYPE' and 'LC_MESSAGES' if it has been configured to do so. + These locale categories can be set to any value supported by your + installation. A typical value is 'en_GB.UTF-8' for English in the + United Kingdom encoded in UTF-8. + + The 'LC_CTYPE' environment variable specifies character + classification. GCC uses it to determine the character boundaries + in a string; this is needed for some multibyte encodings that + contain quote and escape characters that are otherwise interpreted + as a string end or escape. + + The 'LC_MESSAGES' environment variable specifies the language to + use in diagnostic messages. + + If the 'LC_ALL' environment variable is set, it overrides the value + of 'LC_CTYPE' and 'LC_MESSAGES'; otherwise, 'LC_CTYPE' and + 'LC_MESSAGES' default to the value of the 'LANG' environment + variable. If none of these variables are set, GCC defaults to + traditional C English behavior. + +'TMPDIR' + If 'TMPDIR' is set, it specifies the directory to use for temporary + files. GCC uses temporary files to hold the output of one stage of + compilation which is to be used as input to the next stage: for + example, the output of the preprocessor, which is the input to the + compiler proper. + +'GCC_COMPARE_DEBUG' + Setting 'GCC_COMPARE_DEBUG' is nearly equivalent to passing + '-fcompare-debug' to the compiler driver. See the documentation of + this option for more details. + +'GCC_EXEC_PREFIX' + If 'GCC_EXEC_PREFIX' is set, it specifies a prefix to use in the + names of the subprograms executed by the compiler. No slash is + added when this prefix is combined with the name of a subprogram, + but you can specify a prefix that ends with a slash if you wish. + + If 'GCC_EXEC_PREFIX' is not set, GCC attempts to figure out an + appropriate prefix to use based on the pathname it is invoked with. + + If GCC cannot find the subprogram using the specified prefix, it + tries looking in the usual places for the subprogram. + + The default value of 'GCC_EXEC_PREFIX' is 'PREFIX/lib/gcc/' where + PREFIX is the prefix to the installed compiler. In many cases + PREFIX is the value of 'prefix' when you ran the 'configure' + script. + + Other prefixes specified with '-B' take precedence over this + prefix. + + This prefix is also used for finding files such as 'crt0.o' that + are used for linking. + + In addition, the prefix is used in an unusual way in finding the + directories to search for header files. For each of the standard + directories whose name normally begins with '/usr/local/lib/gcc' + (more precisely, with the value of 'GCC_INCLUDE_DIR'), GCC tries + replacing that beginning with the specified prefix to produce an + alternate directory name. Thus, with '-Bfoo/', GCC searches + 'foo/bar' just before it searches the standard directory + '/usr/local/lib/bar'. If a standard directory begins with the + configured PREFIX then the value of PREFIX is replaced by + 'GCC_EXEC_PREFIX' when looking for header files. + +'COMPILER_PATH' + The value of 'COMPILER_PATH' is a colon-separated list of + directories, much like 'PATH'. GCC tries the directories thus + specified when searching for subprograms, if it can't find the + subprograms using 'GCC_EXEC_PREFIX'. + +'LIBRARY_PATH' + The value of 'LIBRARY_PATH' is a colon-separated list of + directories, much like 'PATH'. When configured as a native + compiler, GCC tries the directories thus specified when searching + for special linker files, if it can't find them using + 'GCC_EXEC_PREFIX'. Linking using GCC also uses these directories + when searching for ordinary libraries for the '-l' option (but + directories specified with '-L' come first). + +'LANG' + This variable is used to pass locale information to the compiler. + One way in which this information is used is to determine the + character set to be used when character literals, string literals + and comments are parsed in C and C++. When the compiler is + configured to allow multibyte characters, the following values for + 'LANG' are recognized: + + 'C-JIS' + Recognize JIS characters. + 'C-SJIS' + Recognize SJIS characters. + 'C-EUCJP' + Recognize EUCJP characters. + + If 'LANG' is not defined, or if it has some other value, then the + compiler uses 'mblen' and 'mbtowc' as defined by the default locale + to recognize and translate multibyte characters. + +Some additional environment variables affect the behavior of the +preprocessor. + +'CPATH' +'C_INCLUDE_PATH' +'CPLUS_INCLUDE_PATH' +'OBJC_INCLUDE_PATH' + Each variable's value is a list of directories separated by a + special character, much like 'PATH', in which to look for header + files. The special character, 'PATH_SEPARATOR', is + target-dependent and determined at GCC build time. For Microsoft + Windows-based targets it is a semicolon, and for almost all other + targets it is a colon. + + 'CPATH' specifies a list of directories to be searched as if + specified with '-I', but after any paths given with '-I' options on + the command line. This environment variable is used regardless of + which language is being preprocessed. + + The remaining environment variables apply only when preprocessing + the particular language indicated. Each specifies a list of + directories to be searched as if specified with '-isystem', but + after any paths given with '-isystem' options on the command line. + + In all these variables, an empty element instructs the compiler to + search its current working directory. Empty elements can appear at + the beginning or end of a path. For instance, if the value of + 'CPATH' is ':/special/include', that has the same effect as + '-I. -I/special/include'. + +'DEPENDENCIES_OUTPUT' + If this variable is set, its value specifies how to output + dependencies for Make based on the non-system header files + processed by the compiler. System header files are ignored in the + dependency output. + + The value of 'DEPENDENCIES_OUTPUT' can be just a file name, in + which case the Make rules are written to that file, guessing the + target name from the source file name. Or the value can have the + form 'FILE TARGET', in which case the rules are written to file + FILE using TARGET as the target name. + + In other words, this environment variable is equivalent to + combining the options '-MM' and '-MF' (*note Preprocessor + Options::), with an optional '-MT' switch too. + +'SUNPRO_DEPENDENCIES' + This variable is the same as 'DEPENDENCIES_OUTPUT' (see above), + except that system header files are not ignored, so it implies '-M' + rather than '-MM'. However, the dependence on the main input file + is omitted. *Note Preprocessor Options::. + + +File: gcc.info, Node: Precompiled Headers, Prev: Environment Variables, Up: Invoking GCC + +3.20 Using Precompiled Headers +============================== + +Often large projects have many header files that are included in every +source file. The time the compiler takes to process these header files +over and over again can account for nearly all of the time required to +build the project. To make builds faster, GCC allows you to +"precompile" a header file. + + To create a precompiled header file, simply compile it as you would any +other file, if necessary using the '-x' option to make the driver treat +it as a C or C++ header file. You may want to use a tool like 'make' to +keep the precompiled header up-to-date when the headers it contains +change. + + A precompiled header file is searched for when '#include' is seen in +the compilation. As it searches for the included file (*note Search +Path: (cpp)Search Path.) the compiler looks for a precompiled header in +each directory just before it looks for the include file in that +directory. The name searched for is the name specified in the +'#include' with '.gch' appended. If the precompiled header file can't +be used, it is ignored. + + For instance, if you have '#include "all.h"', and you have 'all.h.gch' +in the same directory as 'all.h', then the precompiled header file is +used if possible, and the original header is used otherwise. + + Alternatively, you might decide to put the precompiled header file in a +directory and use '-I' to ensure that directory is searched before (or +instead of) the directory containing the original header. Then, if you +want to check that the precompiled header file is always used, you can +put a file of the same name as the original header in this directory +containing an '#error' command. + + This also works with '-include'. So yet another way to use precompiled +headers, good for projects not designed with precompiled header files in +mind, is to simply take most of the header files used by a project, +include them from another header file, precompile that header file, and +'-include' the precompiled header. If the header files have guards +against multiple inclusion, they are skipped because they've already +been included (in the precompiled header). + + If you need to precompile the same header file for different languages, +targets, or compiler options, you can instead make a _directory_ named +like 'all.h.gch', and put each precompiled header in the directory, +perhaps using '-o'. It doesn't matter what you call the files in the +directory; every precompiled header in the directory is considered. The +first precompiled header encountered in the directory that is valid for +this compilation is used; they're searched in no particular order. + + There are many other possibilities, limited only by your imagination, +good sense, and the constraints of your build system. + + A precompiled header file can be used only when these conditions apply: + + * Only one precompiled header can be used in a particular + compilation. + + * A precompiled header can't be used once the first C token is seen. + You can have preprocessor directives before a precompiled header; + you cannot include a precompiled header from inside another header. + + * The precompiled header file must be produced for the same language + as the current compilation. You can't use a C precompiled header + for a C++ compilation. + + * The precompiled header file must have been produced by the same + compiler binary as the current compilation is using. + + * Any macros defined before the precompiled header is included must + either be defined in the same way as when the precompiled header + was generated, or must not affect the precompiled header, which + usually means that they don't appear in the precompiled header at + all. + + The '-D' option is one way to define a macro before a precompiled + header is included; using a '#define' can also do it. There are + also some options that define macros implicitly, like '-O' and + '-Wdeprecated'; the same rule applies to macros defined this way. + + * If debugging information is output when using the precompiled + header, using '-g' or similar, the same kind of debugging + information must have been output when building the precompiled + header. However, a precompiled header built using '-g' can be used + in a compilation when no debugging information is being output. + + * The same '-m' options must generally be used when building and + using the precompiled header. *Note Submodel Options::, for any + cases where this rule is relaxed. + + * Each of the following options must be the same when building and + using the precompiled header: + + -fexceptions + + * Some other command-line options starting with '-f', '-p', or '-O' + must be defined in the same way as when the precompiled header was + generated. At present, it's not clear which options are safe to + change and which are not; the safest choice is to use exactly the + same options when generating and using the precompiled header. The + following are known to be safe: + + -fmessage-length= -fpreprocessed -fsched-interblock + -fsched-spec -fsched-spec-load -fsched-spec-load-dangerous + -fsched-verbose=NUMBER -fschedule-insns -fvisibility= + -pedantic-errors + + For all of these except the last, the compiler automatically ignores +the precompiled header if the conditions aren't met. If you find an +option combination that doesn't work and doesn't cause the precompiled +header to be ignored, please consider filing a bug report, see *note +Bugs::. + + If you do use differing options when generating and using the +precompiled header, the actual behavior is a mixture of the behavior for +the options. For instance, if you use '-g' to generate the precompiled +header but not when using it, you may or may not get debugging +information for routines in the precompiled header. + + +File: gcc.info, Node: C Implementation, Next: C++ Implementation, Prev: Invoking GCC, Up: Top + +4 C Implementation-defined behavior +*********************************** + +A conforming implementation of ISO C is required to document its choice +of behavior in each of the areas that are designated "implementation +defined". The following lists all such areas, along with the section +numbers from the ISO/IEC 9899:1990, ISO/IEC 9899:1999 and ISO/IEC +9899:2011 standards. Some areas are only implementation-defined in one +version of the standard. + + Some choices depend on the externally determined ABI for the platform +(including standard character encodings) which GCC follows; these are +listed as "determined by ABI" below. *Note Binary Compatibility: +Compatibility, and <http://gcc.gnu.org/readings.html>. Some choices are +documented in the preprocessor manual. *Note Implementation-defined +behavior: (cpp)Implementation-defined behavior. Some choices are made +by the library and operating system (or other environment when compiling +for a freestanding environment); refer to their documentation for +details. + +* Menu: + +* Translation implementation:: +* Environment implementation:: +* Identifiers implementation:: +* Characters implementation:: +* Integers implementation:: +* Floating point implementation:: +* Arrays and pointers implementation:: +* Hints implementation:: +* Structures unions enumerations and bit-fields implementation:: +* Qualifiers implementation:: +* Declarators implementation:: +* Statements implementation:: +* Preprocessing directives implementation:: +* Library functions implementation:: +* Architecture implementation:: +* Locale-specific behavior implementation:: + + +File: gcc.info, Node: Translation implementation, Next: Environment implementation, Up: C Implementation + +4.1 Translation +=============== + + * 'How a diagnostic is identified (C90 3.7, C99 and C11 3.10, C90, + C99 and C11 5.1.1.3).' + + Diagnostics consist of all the output sent to stderr by GCC. + + * 'Whether each nonempty sequence of white-space characters other + than new-line is retained or replaced by one space character in + translation phase 3 (C90, C99 and C11 5.1.1.2).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. + + +File: gcc.info, Node: Environment implementation, Next: Identifiers implementation, Prev: Translation implementation, Up: C Implementation + +4.2 Environment +=============== + +The behavior of most of these points are dependent on the implementation +of the C library, and are not defined by GCC itself. + + * 'The mapping between physical source file multibyte characters and + the source character set in translation phase 1 (C90, C99 and C11 + 5.1.1.2).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. + + +File: gcc.info, Node: Identifiers implementation, Next: Characters implementation, Prev: Environment implementation, Up: C Implementation + +4.3 Identifiers +=============== + + * 'Which additional multibyte characters may appear in identifiers + and their correspondence to universal character names (C99 and C11 + 6.4.2).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. + + * 'The number of significant initial characters in an identifier (C90 + 6.1.2, C90, C99 and C11 5.2.4.1, C99 and C11 6.4.2).' + + For internal names, all characters are significant. For external + names, the number of significant characters are defined by the + linker; for almost all targets, all characters are significant. + + * 'Whether case distinctions are significant in an identifier with + external linkage (C90 6.1.2).' + + This is a property of the linker. C99 and C11 require that case + distinctions are always significant in identifiers with external + linkage and systems without this property are not supported by GCC. + + +File: gcc.info, Node: Characters implementation, Next: Integers implementation, Prev: Identifiers implementation, Up: C Implementation + +4.4 Characters +============== + + * 'The number of bits in a byte (C90 3.4, C99 and C11 3.6).' + + Determined by ABI. + + * 'The values of the members of the execution character set (C90, C99 + and C11 5.2.1).' + + Determined by ABI. + + * 'The unique value of the member of the execution character set + produced for each of the standard alphabetic escape sequences (C90, + C99 and C11 5.2.2).' + + Determined by ABI. + + * 'The value of a 'char' object into which has been stored any + character other than a member of the basic execution character set + (C90 6.1.2.5, C99 and C11 6.2.5).' + + Determined by ABI. + + * 'Which of 'signed char' or 'unsigned char' has the same range, + representation, and behavior as "plain" 'char' (C90 6.1.2.5, C90 + 6.2.1.1, C99 and C11 6.2.5, C99 and C11 6.3.1.1).' + + Determined by ABI. The options '-funsigned-char' and + '-fsigned-char' change the default. *Note Options Controlling C + Dialect: C Dialect Options. + + * 'The mapping of members of the source character set (in character + constants and string literals) to members of the execution + character set (C90 6.1.3.4, C99 and C11 6.4.4.4, C90, C99 and C11 + 5.1.1.2).' + + Determined by ABI. + + * 'The value of an integer character constant containing more than + one character or containing a character or escape sequence that + does not map to a single-byte execution character (C90 6.1.3.4, C99 + and C11 6.4.4.4).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. + + * 'The value of a wide character constant containing more than one + multibyte character or a single multibyte character that maps to + multiple members of the extended execution character set, or + containing a multibyte character or escape sequence not represented + in the extended execution character set (C90 6.1.3.4, C99 and C11 + 6.4.4.4).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. + + * 'The current locale used to convert a wide character constant + consisting of a single multibyte character that maps to a member of + the extended execution character set into a corresponding wide + character code (C90 6.1.3.4, C99 and C11 6.4.4.4).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. + + * 'Whether differently-prefixed wide string literal tokens can be + concatenated and, if so, the treatment of the resulting multibyte + character sequence (C11 6.4.5).' + + Such tokens may not be concatenated. + + * 'The current locale used to convert a wide string literal into + corresponding wide character codes (C90 6.1.4, C99 and C11 6.4.5).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. + + * 'The value of a string literal containing a multibyte character or + escape sequence not represented in the execution character set (C90 + 6.1.4, C99 and C11 6.4.5).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. + + * 'The encoding of any of 'wchar_t', 'char16_t', and 'char32_t' where + the corresponding standard encoding macro ('__STDC_ISO_10646__', + '__STDC_UTF_16__', or '__STDC_UTF_32__') is not defined (C11 + 6.10.8.2).' + + *Note Implementation-defined behavior: (cpp)Implementation-defined + behavior. 'char16_t' and 'char32_t' literals are always encoded in + UTF-16 and UTF-32 respectively. + + +File: gcc.info, Node: Integers implementation, Next: Floating point implementation, Prev: Characters implementation, Up: C Implementation + +4.5 Integers +============ + + * 'Any extended integer types that exist in the implementation (C99 + and C11 6.2.5).' + + GCC does not support any extended integer types. + + * 'Whether signed integer types are represented using sign and + magnitude, two's complement, or one's complement, and whether the + extraordinary value is a trap representation or an ordinary value + (C99 and C11 6.2.6.2).' + + GCC supports only two's complement integer types, and all bit + patterns are ordinary values. + + * 'The rank of any extended integer type relative to another extended + integer type with the same precision (C99 and C11 6.3.1.1).' + + GCC does not support any extended integer types. + + * 'The result of, or the signal raised by, converting an integer to a + signed integer type when the value cannot be represented in an + object of that type (C90 6.2.1.2, C99 and C11 6.3.1.3).' + + For conversion to a type of width N, the value is reduced modulo + 2^N to be within range of the type; no signal is raised. + + * 'The results of some bitwise operations on signed integers (C90 + 6.3, C99 and C11 6.5).' + + Bitwise operators act on the representation of the value including + both the sign and value bits, where the sign bit is considered + immediately above the highest-value value bit. Signed '>>' acts on + negative numbers by sign extension. + + GCC does not use the latitude given in C99 and C11 only to treat + certain aspects of signed '<<' as undefined, but this is subject to + change. + + * 'The sign of the remainder on integer division (C90 6.3.5).' + + GCC always follows the C99 and C11 requirement that the result of + division is truncated towards zero. + + +File: gcc.info, Node: Floating point implementation, Next: Arrays and pointers implementation, Prev: Integers implementation, Up: C Implementation + +4.6 Floating point +================== + + * 'The accuracy of the floating-point operations and of the library + functions in '<math.h>' and '<complex.h>' that return + floating-point results (C90, C99 and C11 5.2.4.2.2).' + + The accuracy is unknown. + + * 'The rounding behaviors characterized by non-standard values of + 'FLT_ROUNDS' (C90, C99 and C11 5.2.4.2.2).' + + GCC does not use such values. + + * 'The evaluation methods characterized by non-standard negative + values of 'FLT_EVAL_METHOD' (C99 and C11 5.2.4.2.2).' + + GCC does not use such values. + + * 'The direction of rounding when an integer is converted to a + floating-point number that cannot exactly represent the original + value (C90 6.2.1.3, C99 and C11 6.3.1.4).' + + C99 Annex F is followed. + + * 'The direction of rounding when a floating-point number is + converted to a narrower floating-point number (C90 6.2.1.4, C99 and + C11 6.3.1.5).' + + C99 Annex F is followed. + + * 'How the nearest representable value or the larger or smaller + representable value immediately adjacent to the nearest + representable value is chosen for certain floating constants (C90 + 6.1.3.1, C99 and C11 6.4.4.2).' + + C99 Annex F is followed. + + * 'Whether and how floating expressions are contracted when not + disallowed by the 'FP_CONTRACT' pragma (C99 and C11 6.5).' + + Expressions are currently only contracted if '-ffp-contract=fast', + '-funsafe-math-optimizations' or '-ffast-math' are used. This is + subject to change. + + * 'The default state for the 'FENV_ACCESS' pragma (C99 and C11 + 7.6.1).' + + This pragma is not implemented, but the default is to "off" unless + '-frounding-math' is used in which case it is "on". + + * 'Additional floating-point exceptions, rounding modes, + environments, and classifications, and their macro names (C99 and + C11 7.6, C99 and C11 7.12).' + + This is dependent on the implementation of the C library, and is + not defined by GCC itself. + + * 'The default state for the 'FP_CONTRACT' pragma (C99 and C11 + 7.12.2).' + + This pragma is not implemented. Expressions are currently only + contracted if '-ffp-contract=fast', '-funsafe-math-optimizations' + or '-ffast-math' are used. This is subject to change. + + * 'Whether the "inexact" floating-point exception can be raised when + the rounded result actually does equal the mathematical result in + an IEC 60559 conformant implementation (C99 F.9).' + + This is dependent on the implementation of the C library, and is + not defined by GCC itself. + + * 'Whether the "underflow" (and "inexact") floating-point exception + can be raised when a result is tiny but not inexact in an IEC 60559 + conformant implementation (C99 F.9).' + + This is dependent on the implementation of the C library, and is + not defined by GCC itself. + + +File: gcc.info, Node: Arrays and pointers implementation, Next: Hints implementation, Prev: Floating point implementation, Up: C Implementation + +4.7 Arrays and pointers +======================= + + * 'The result of converting a pointer to an integer or vice versa + (C90 6.3.4, C99 and C11 6.3.2.3).' + + A cast from pointer to integer discards most-significant bits if + the pointer representation is larger than the integer type, + sign-extends(1) if the pointer representation is smaller than the + integer type, otherwise the bits are unchanged. + + A cast from integer to pointer discards most-significant bits if + the pointer representation is smaller than the integer type, + extends according to the signedness of the integer type if the + pointer representation is larger than the integer type, otherwise + the bits are unchanged. + + When casting from pointer to integer and back again, the resulting + pointer must reference the same object as the original pointer, + otherwise the behavior is undefined. That is, one may not use + integer arithmetic to avoid the undefined behavior of pointer + arithmetic as proscribed in C99 and C11 6.5.6/8. + + * 'The size of the result of subtracting two pointers to elements of + the same array (C90 6.3.6, C99 and C11 6.5.6).' + + The value is as specified in the standard and the type is + determined by the ABI. + + ---------- Footnotes ---------- + + (1) Future versions of GCC may zero-extend, or use a target-defined +'ptr_extend' pattern. Do not rely on sign extension. + + +File: gcc.info, Node: Hints implementation, Next: Structures unions enumerations and bit-fields implementation, Prev: Arrays and pointers implementation, Up: C Implementation + +4.8 Hints +========= + + * 'The extent to which suggestions made by using the 'register' + storage-class specifier are effective (C90 6.5.1, C99 and C11 + 6.7.1).' + + The 'register' specifier affects code generation only in these + ways: + + * When used as part of the register variable extension, see + *note Explicit Reg Vars::. + + * When '-O0' is in use, the compiler allocates distinct stack + memory for all variables that do not have the 'register' + storage-class specifier; if 'register' is specified, the + variable may have a shorter lifespan than the code would + indicate and may never be placed in memory. + + * On some rare x86 targets, 'setjmp' doesn't save the registers + in all circumstances. In those cases, GCC doesn't allocate + any variables in registers unless they are marked 'register'. + + * 'The extent to which suggestions made by using the inline function + specifier are effective (C99 and C11 6.7.4).' + + GCC will not inline any functions if the '-fno-inline' option is + used or if '-O0' is used. Otherwise, GCC may still be unable to + inline a function for many reasons; the '-Winline' option may be + used to determine if a function has not been inlined and why not. + + +File: gcc.info, Node: Structures unions enumerations and bit-fields implementation, Next: Qualifiers implementation, Prev: Hints implementation, Up: C Implementation + +4.9 Structures, unions, enumerations, and bit-fields +==================================================== + + * 'A member of a union object is accessed using a member of a + different type (C90 6.3.2.3).' + + The relevant bytes of the representation of the object are treated + as an object of the type used for the access. *Note + Type-punning::. This may be a trap representation. + + * 'Whether a "plain" 'int' bit-field is treated as a 'signed int' + bit-field or as an 'unsigned int' bit-field (C90 6.5.2, C90 + 6.5.2.1, C99 and C11 6.7.2, C99 and C11 6.7.2.1).' + + By default it is treated as 'signed int' but this may be changed by + the '-funsigned-bitfields' option. + + * 'Allowable bit-field types other than '_Bool', 'signed int', and + 'unsigned int' (C99 and C11 6.7.2.1).' + + Other integer types, such as 'long int', and enumerated types are + permitted even in strictly conforming mode. + + * 'Whether atomic types are permitted for bit-fields (C11 6.7.2.1).' + + Atomic types are not permitted for bit-fields. + + * 'Whether a bit-field can straddle a storage-unit boundary (C90 + 6.5.2.1, C99 and C11 6.7.2.1).' + + Determined by ABI. + + * 'The order of allocation of bit-fields within a unit (C90 6.5.2.1, + C99 and C11 6.7.2.1).' + + Determined by ABI. + + * 'The alignment of non-bit-field members of structures (C90 6.5.2.1, + C99 and C11 6.7.2.1).' + + Determined by ABI. + + * 'The integer type compatible with each enumerated type (C90 + 6.5.2.2, C99 and C11 6.7.2.2).' + + Normally, the type is 'unsigned int' if there are no negative + values in the enumeration, otherwise 'int'. If '-fshort-enums' is + specified, then if there are negative values it is the first of + 'signed char', 'short' and 'int' that can represent all the values, + otherwise it is the first of 'unsigned char', 'unsigned short' and + 'unsigned int' that can represent all the values. + + On some targets, '-fshort-enums' is the default; this is determined + by the ABI. + + +File: gcc.info, Node: Qualifiers implementation, Next: Declarators implementation, Prev: Structures unions enumerations and bit-fields implementation, Up: C Implementation + +4.10 Qualifiers +=============== + + * 'What constitutes an access to an object that has + volatile-qualified type (C90 6.5.3, C99 and C11 6.7.3).' + + Such an object is normally accessed by pointers and used for + accessing hardware. In most expressions, it is intuitively obvious + what is a read and what is a write. For example + + volatile int *dst = SOMEVALUE; + volatile int *src = SOMEOTHERVALUE; + *dst = *src; + + will cause a read of the volatile object pointed to by SRC and + store the value into the volatile object pointed to by DST. There + is no guarantee that these reads and writes are atomic, especially + for objects larger than 'int'. + + However, if the volatile storage is not being modified, and the + value of the volatile storage is not used, then the situation is + less obvious. For example + + volatile int *src = SOMEVALUE; + *src; + + According to the C standard, such an expression is an rvalue whose + type is the unqualified version of its original type, i.e. 'int'. + Whether GCC interprets this as a read of the volatile object being + pointed to or only as a request to evaluate the expression for its + side-effects depends on this type. + + If it is a scalar type, or on most targets an aggregate type whose + only member object is of a scalar type, or a union type whose + member objects are of scalar types, the expression is interpreted + by GCC as a read of the volatile object; in the other cases, the + expression is only evaluated for its side-effects. + + +File: gcc.info, Node: Declarators implementation, Next: Statements implementation, Prev: Qualifiers implementation, Up: C Implementation + +4.11 Declarators +================ + + * 'The maximum number of declarators that may modify an arithmetic, + structure or union type (C90 6.5.4).' + + GCC is only limited by available memory. + + +File: gcc.info, Node: Statements implementation, Next: Preprocessing directives implementation, Prev: Declarators implementation, Up: C Implementation + +4.12 Statements +=============== + + * 'The maximum number of 'case' values in a 'switch' statement (C90 + 6.6.4.2).' + + GCC is only limited by available memory. + + +File: gcc.info, Node: Preprocessing directives implementation, Next: Library functions implementation, Prev: Statements implementation, Up: C Implementation + +4.13 Preprocessing directives +============================= + +*Note Implementation-defined behavior: (cpp)Implementation-defined +behavior, for details of these aspects of implementation-defined +behavior. + + * 'The locations within '#pragma' directives where header name + preprocessing tokens are recognized (C11 6.4, C11 6.4.7).' + + * 'How sequences in both forms of header names are mapped to headers + or external source file names (C90 6.1.7, C99 and C11 6.4.7).' + + * 'Whether the value of a character constant in a constant expression + that controls conditional inclusion matches the value of the same + character constant in the execution character set (C90 6.8.1, C99 + and C11 6.10.1).' + + * 'Whether the value of a single-character character constant in a + constant expression that controls conditional inclusion may have a + negative value (C90 6.8.1, C99 and C11 6.10.1).' + + * 'The places that are searched for an included '<>' delimited + header, and how the places are specified or the header is + identified (C90 6.8.2, C99 and C11 6.10.2).' + + * 'How the named source file is searched for in an included '""' + delimited header (C90 6.8.2, C99 and C11 6.10.2).' + + * 'The method by which preprocessing tokens (possibly resulting from + macro expansion) in a '#include' directive are combined into a + header name (C90 6.8.2, C99 and C11 6.10.2).' + + * 'The nesting limit for '#include' processing (C90 6.8.2, C99 and + C11 6.10.2).' + + * 'Whether the '#' operator inserts a '\' character before the '\' + character that begins a universal character name in a character + constant or string literal (C99 and C11 6.10.3.2).' + + * 'The behavior on each recognized non-'STDC #pragma' directive (C90 + 6.8.6, C99 and C11 6.10.6).' + + *Note Pragmas: (cpp)Pragmas, for details of pragmas accepted by GCC + on all targets. *Note Pragmas Accepted by GCC: Pragmas, for + details of target-specific pragmas. + + * 'The definitions for '__DATE__' and '__TIME__' when respectively, + the date and time of translation are not available (C90 6.8.8, C99 + 6.10.8, C11 6.10.8.1).' + + +File: gcc.info, Node: Library functions implementation, Next: Architecture implementation, Prev: Preprocessing directives implementation, Up: C Implementation + +4.14 Library functions +====================== + +The behavior of most of these points are dependent on the implementation +of the C library, and are not defined by GCC itself. + + * 'The null pointer constant to which the macro 'NULL' expands (C90 + 7.1.6, C99 7.17, C11 7.19).' + + In '<stddef.h>', 'NULL' expands to '((void *)0)'. GCC does not + provide the other headers which define 'NULL' and some library + implementations may use other definitions in those headers. + + +File: gcc.info, Node: Architecture implementation, Next: Locale-specific behavior implementation, Prev: Library functions implementation, Up: C Implementation + +4.15 Architecture +================= + + * 'The values or expressions assigned to the macros specified in the + headers '<float.h>', '<limits.h>', and '<stdint.h>' (C90, C99 and + C11 5.2.4.2, C99 7.18.2, C99 7.18.3, C11 7.20.2, C11 7.20.3).' + + Determined by ABI. + + * 'The result of attempting to indirectly access an object with + automatic or thread storage duration from a thread other than the + one with which it is associated (C11 6.2.4).' + + Such accesses are supported, subject to the same requirements for + synchronization for concurrent accesses as for concurrent accesses + to any object. + + * 'The number, order, and encoding of bytes in any object (when not + explicitly specified in this International Standard) (C99 and C11 + 6.2.6.1).' + + Determined by ABI. + + * 'Whether any extended alignments are supported and the contexts in + which they are supported (C11 6.2.8).' + + Extended alignments up to 2^{28} (bytes) are supported for objects + of automatic storage duration. Alignments supported for objects of + static and thread storage duration are determined by the ABI. + + * 'Valid alignment values other than those returned by an _Alignof + expression for fundamental types, if any (C11 6.2.8).' + + Valid alignments are powers of 2 up to and including 2^{28}. + + * 'The value of the result of the 'sizeof' and '_Alignof' operators + (C90 6.3.3.4, C99 and C11 6.5.3.4).' + + Determined by ABI. + + +File: gcc.info, Node: Locale-specific behavior implementation, Prev: Architecture implementation, Up: C Implementation + +4.16 Locale-specific behavior +============================= + +The behavior of these points are dependent on the implementation of the +C library, and are not defined by GCC itself. + + +File: gcc.info, Node: C++ Implementation, Next: C Extensions, Prev: C Implementation, Up: Top + +5 C++ Implementation-defined behavior +************************************* + +A conforming implementation of ISO C++ is required to document its +choice of behavior in each of the areas that are designated +"implementation defined". The following lists all such areas, along +with the section numbers from the ISO/IEC 14882:1998 and ISO/IEC +14882:2003 standards. Some areas are only implementation-defined in one +version of the standard. + + Some choices depend on the externally determined ABI for the platform +(including standard character encodings) which GCC follows; these are +listed as "determined by ABI" below. *Note Binary Compatibility: +Compatibility, and <http://gcc.gnu.org/readings.html>. Some choices are +documented in the preprocessor manual. *Note Implementation-defined +behavior: (cpp)Implementation-defined behavior. Some choices are +documented in the corresponding document for the C language. *Note C +Implementation::. Some choices are made by the library and operating +system (or other environment when compiling for a freestanding +environment); refer to their documentation for details. + +* Menu: + +* Conditionally-supported behavior:: +* Exception handling:: + + +File: gcc.info, Node: Conditionally-supported behavior, Next: Exception handling, Up: C++ Implementation + +5.1 Conditionally-supported behavior +==================================== + +'Each implementation shall include documentation that identifies all +conditionally-supported constructs that it does not support (C++0x +1.4).' + + * 'Whether an argument of class type with a non-trivial copy + constructor or destructor can be passed to ... (C++0x 5.2.2).' + + Such argument passing is not supported. + + +File: gcc.info, Node: Exception handling, Prev: Conditionally-supported behavior, Up: C++ Implementation + +5.2 Exception handling +====================== + + * 'In the situation where no matching handler is found, it is + implementation-defined whether or not the stack is unwound before + std::terminate() is called (C++98 15.5.1).' + + The stack is not unwound before std::terminate is called. + + +File: gcc.info, Node: C Extensions, Next: C++ Extensions, Prev: C++ Implementation, Up: Top + +6 Extensions to the C Language Family +************************************* + +GNU C provides several language features not found in ISO standard C. +(The '-pedantic' option directs GCC to print a warning message if any of +these features is used.) To test for the availability of these features +in conditional compilation, check for a predefined macro '__GNUC__', +which is always defined under GCC. + + These extensions are available in C and Objective-C. Most of them are +also available in C++. *Note Extensions to the C++ Language: C++ +Extensions, for extensions that apply _only_ to 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. +* Local Labels:: Labels local to a block. +* Labels as Values:: Getting pointers to labels, and computed gotos. +* Nested Functions:: As in Algol and Pascal, lexical scoping of functions. +* Constructing Calls:: Dispatching a call to another function. +* Typeof:: 'typeof': referring to the type of an expression. +* Conditionals:: Omitting the middle operand of a '?:' expression. +* __int128:: 128-bit integers--'__int128'. +* Long Long:: Double-word integers--'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. +* Empty Structures:: Structures with no members. +* Variable Length:: Arrays whose length is computed at run time. +* Variadic Macros:: Macros with a variable number of arguments. +* Escaped Newlines:: Slightly looser rules for escaped newlines. +* Subscripting:: Any array can be subscripted, even if not an lvalue. +* Pointer Arith:: Arithmetic on 'void'-pointers and function pointers. +* Initializers:: Non-constant initializers. +* Compound Literals:: Compound literals give structures, unions + or arrays as values. +* Designated Inits:: Labeling elements of initializers. +* Case Ranges:: 'case 1 ... 9' and such. +* Cast to Union:: Casting to union type from any member of the union. +* Mixed Declarations:: Mixing declarations and code. +* Function Attributes:: Declaring that functions have no side effects, + or that they can never return. +* Attribute Syntax:: Formal syntax for attributes. +* Function Prototypes:: Prototype declarations and old-style definitions. +* C++ Comments:: C++ comments are recognized. +* Dollar Signs:: Dollar sign is allowed in identifiers. +* Character Escapes:: '\e' stands for the character <ESC>. +* Variable Attributes:: Specifying attributes of variables. +* Type Attributes:: Specifying attributes of types. +* Alignment:: Inquiring about the alignment of a type or variable. +* Inline:: Defining inline functions (as fast as macros). +* Volatiles:: What constitutes an access to a volatile object. +* Extended Asm:: Assembler instructions with C expressions as operands. + (With them you can define "built-in" functions.) +* Constraints:: Constraints for asm operands +* Asm Labels:: Specifying the assembler name to use for a C symbol. +* Explicit Reg Vars:: Defining variables residing in specified registers. +* Alternate Keywords:: '__const__', '__asm__', etc., for header files. +* Incomplete Enums:: 'enum foo;', with details to follow. +* Function Names:: Printable strings which are the name of the current + function. +* Return Address:: Getting the return or frame address of a function. +* Vector Extensions:: Using vector instructions through built-in functions. +* Offsetof:: Special syntax for implementing 'offsetof'. +* __sync Builtins:: Legacy built-in functions for atomic memory access. +* __atomic Builtins:: Atomic built-in functions with memory model. +* x86 specific memory model extensions for transactional memory:: x86 memory models. +* Object Size Checking:: Built-in functions for limited buffer overflow + checking. +* Cilk Plus Builtins:: Built-in functions for the Cilk Plus language extension. +* Other Builtins:: Other built-in functions. +* Target Builtins:: Built-in functions specific to particular targets. +* Target Format Checks:: Format checks specific to particular targets. +* Pragmas:: Pragmas accepted by GCC. +* Unnamed Fields:: Unnamed struct/union fields within structs/unions. +* Thread-Local:: Per-thread variables. +* Binary constants:: Binary constants using the '0b' prefix. + + +File: gcc.info, Node: Statement Exprs, Next: Local Labels, Up: C Extensions + +6.1 Statements and Declarations in Expressions +============================================== + +A compound statement enclosed in parentheses may appear as an expression +in GNU C. This allows you to use loops, switches, and local variables +within an expression. + + Recall that a compound statement is a sequence of statements surrounded +by braces; in this construct, parentheses go around the braces. For +example: + + ({ int y = foo (); int z; + if (y > 0) z = y; + else z = - y; + z; }) + +is a valid (though slightly more complex than necessary) expression for +the absolute value of 'foo ()'. + + The last thing in the compound statement should be an expression +followed by a semicolon; the value of this subexpression serves as the +value of the entire construct. (If you use some other kind of statement +last within the braces, the construct has type 'void', and thus +effectively no value.) + + This feature is especially useful in making macro definitions "safe" +(so that they evaluate each operand exactly once). For example, the +"maximum" function is commonly defined as a macro in standard C as +follows: + + #define max(a,b) ((a) > (b) ? (a) : (b)) + +But this definition computes either A or B twice, with bad results if +the operand has side effects. In GNU C, if you know the type of the +operands (here taken as 'int'), you can define the macro safely as +follows: + + #define maxint(a,b) \ + ({int _a = (a), _b = (b); _a > _b ? _a : _b; }) + + Embedded statements are not allowed in constant expressions, such as +the value of an enumeration constant, the width of a bit-field, or the +initial value of a static variable. + + If you don't know the type of the operand, you can still do this, but +you must use 'typeof' or '__auto_type' (*note Typeof::). + + In G++, the result value of a statement expression undergoes array and +function pointer decay, and is returned by value to the enclosing +expression. For instance, if 'A' is a class, then + + A a; + + ({a;}).Foo () + +constructs a temporary 'A' object to hold the result of the statement +expression, and that is used to invoke 'Foo'. Therefore the 'this' +pointer observed by 'Foo' is not the address of 'a'. + + In a statement expression, any temporaries created within a statement +are destroyed at that statement's end. This makes statement expressions +inside macros slightly different from function calls. In the latter +case temporaries introduced during argument evaluation are destroyed at +the end of the statement that includes the function call. In the +statement expression case they are destroyed during the statement +expression. For instance, + + #define macro(a) ({__typeof__(a) b = (a); b + 3; }) + template<typename T> T function(T a) { T b = a; return b + 3; } + + void foo () + { + macro (X ()); + function (X ()); + } + +has different places where temporaries are destroyed. For the 'macro' +case, the temporary 'X' is destroyed just after the initialization of +'b'. In the 'function' case that temporary is destroyed when the +function returns. + + These considerations mean that it is probably a bad idea to use +statement expressions of this form in header files that are designed to +work with C++. (Note that some versions of the GNU C Library contained +header files using statement expressions that lead to precisely this +bug.) + + Jumping into a statement expression with 'goto' or using a 'switch' +statement outside the statement expression with a 'case' or 'default' +label inside the statement expression is not permitted. Jumping into a +statement expression with a computed 'goto' (*note Labels as Values::) +has undefined behavior. Jumping out of a statement expression is +permitted, but if the statement expression is part of a larger +expression then it is unspecified which other subexpressions of that +expression have been evaluated except where the language definition +requires certain subexpressions to be evaluated before or after the +statement expression. In any case, as with a function call, the +evaluation of a statement expression is not interleaved with the +evaluation of other parts of the containing expression. For example, + + foo (), (({ bar1 (); goto a; 0; }) + bar2 ()), baz(); + +calls 'foo' and 'bar1' and does not call 'baz' but may or may not call +'bar2'. If 'bar2' is called, it is called after 'foo' and before +'bar1'. + + +File: gcc.info, Node: Local Labels, Next: Labels as Values, Prev: Statement Exprs, Up: C Extensions + +6.2 Locally Declared Labels +=========================== + +GCC allows you to declare "local labels" in any nested block scope. A +local label is just like an ordinary label, but you can only reference +it (with a 'goto' statement, or by taking its address) within the block +in which it is declared. + + A local label declaration looks like this: + + __label__ LABEL; + +or + + __label__ LABEL1, LABEL2, /* ... */; + + Local label declarations must come at the beginning of the block, +before any ordinary declarations or statements. + + The label declaration defines the label _name_, but does not define the +label itself. You must do this in the usual way, with 'LABEL:', within +the statements of the statement expression. + + The local label feature is useful for complex macros. If a macro +contains nested loops, a 'goto' can be useful for breaking out of them. +However, an ordinary label whose scope is the whole function cannot be +used: if the macro can be expanded several times in one function, the +label is multiply defined in that function. A local label avoids this +problem. For example: + + #define SEARCH(value, array, target) \ + do { \ + __label__ found; \ + typeof (target) _SEARCH_target = (target); \ + typeof (*(array)) *_SEARCH_array = (array); \ + int i, j; \ + int value; \ + for (i = 0; i < max; i++) \ + for (j = 0; j < max; j++) \ + if (_SEARCH_array[i][j] == _SEARCH_target) \ + { (value) = i; goto found; } \ + (value) = -1; \ + found:; \ + } while (0) + + This could also be written using a statement expression: + + #define SEARCH(array, target) \ + ({ \ + __label__ found; \ + typeof (target) _SEARCH_target = (target); \ + typeof (*(array)) *_SEARCH_array = (array); \ + int i, j; \ + int value; \ + for (i = 0; i < max; i++) \ + for (j = 0; j < max; j++) \ + if (_SEARCH_array[i][j] == _SEARCH_target) \ + { value = i; goto found; } \ + value = -1; \ + found: \ + value; \ + }) + + Local label declarations also make the labels they declare visible to +nested functions, if there are any. *Note Nested Functions::, for +details. + + +File: gcc.info, Node: Labels as Values, Next: Nested Functions, Prev: Local Labels, Up: C Extensions + +6.3 Labels as Values +==================== + +You can get the address of a label defined in the current function (or a +containing function) with the unary operator '&&'. The value has type +'void *'. This value is a constant and can be used wherever a constant +of that type is valid. For example: + + void *ptr; + /* ... */ + ptr = &&foo; + + To use these values, you need to be able to jump to one. This is done +with the computed goto statement(1), 'goto *EXP;'. For example, + + goto *ptr; + +Any expression of type 'void *' is allowed. + + One way of using these constants is in initializing a static array that +serves as a jump table: + + static void *array[] = { &&foo, &&bar, &&hack }; + +Then you can select a label with indexing, like this: + + goto *array[i]; + +Note that this does not check whether the subscript is in bounds--array +indexing in C never does that. + + Such an array of label values serves a purpose much like that of the +'switch' statement. The 'switch' statement is cleaner, so use that +rather than an array unless the problem does not fit a 'switch' +statement very well. + + Another use of label values is in an interpreter for threaded code. +The labels within the interpreter function can be stored in the threaded +code for super-fast dispatching. + + You may not use this mechanism to jump to code in a different function. +If you do that, totally unpredictable things happen. The best way to +avoid this is to store the label address only in automatic variables and +never pass it as an argument. + + An alternate way to write the above example is + + static const int array[] = { &&foo - &&foo, &&bar - &&foo, + &&hack - &&foo }; + goto *(&&foo + array[i]); + +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 '&&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, '__attribute__((__noinline__,__noclone__))' +should be used to prevent inlining and cloning. If '&&foo' is used in a +static variable initializer, inlining and cloning is forbidden. + + ---------- Footnotes ---------- + + (1) The analogous feature in Fortran is called an assigned goto, but +that name seems inappropriate in C, where one can do more than simply +store label addresses in label variables. + + +File: gcc.info, Node: Nested Functions, Next: Constructing Calls, Prev: Labels as Values, Up: C Extensions + +6.4 Nested Functions +==================== + +A "nested function" is a function defined inside another function. +Nested functions are supported as an extension in GNU C, but are not +supported by GNU C++. + + The nested function's name is local to the block where it is defined. +For example, here we define a nested function named 'square', and call +it twice: + + foo (double a, double b) + { + double square (double z) { return z * z; } + + return square (a) + square (b); + } + + The nested function can access all the variables of the containing +function that are visible at the point of its definition. This is +called "lexical scoping". For example, here we show a nested function +which uses an inherited variable named 'offset': + + bar (int *array, int offset, int size) + { + int access (int *array, int index) + { return array[index + offset]; } + int i; + /* ... */ + for (i = 0; i < size; i++) + /* ... */ access (array, i) /* ... */ + } + + Nested function definitions are permitted within functions in the +places where variable definitions are allowed; that is, in any block, +mixed with the other declarations and statements in the block. + + It is possible to call the nested function from outside the scope of +its name by storing its address or passing the address to another +function: + + hack (int *array, int size) + { + void store (int index, int value) + { array[index] = value; } + + intermediate (store, size); + } + + Here, the function 'intermediate' receives the address of 'store' as an +argument. If 'intermediate' calls 'store', the arguments given to +'store' are used to store into 'array'. But this technique works only +so long as the containing function ('hack', in this example) does not +exit. + + If you try to call the nested function through its address after the +containing function exits, all hell breaks loose. If you try to call it +after a containing scope level exits, and if it refers to some of the +variables that are no longer in scope, you may be lucky, but it's not +wise to take the risk. If, however, the nested function 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 "trampolines". This technique was described in +'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 is explicitly declared in the containing +function (*note Local Labels::). Such a jump returns instantly to the +containing function, exiting the nested function that did the 'goto' and +any intermediate functions as well. Here is an example: + + bar (int *array, int offset, int size) + { + __label__ failure; + int access (int *array, int index) + { + if (index > size) + goto failure; + return array[index + offset]; + } + int i; + /* ... */ + for (i = 0; i < size; i++) + /* ... */ access (array, i) /* ... */ + /* ... */ + return 0; + + /* Control comes here from 'access' + if it detects an error. */ + failure: + return -1; + } + + A nested function always has no linkage. Declaring one with 'extern' +or 'static' is erroneous. If you need to declare the nested function +before its definition, use 'auto' (which is otherwise meaningless for +function declarations). + + bar (int *array, int offset, int size) + { + __label__ failure; + auto int access (int *, int); + /* ... */ + int access (int *array, int index) + { + if (index > size) + goto failure; + return array[index + offset]; + } + /* ... */ + } + + +File: gcc.info, Node: Constructing Calls, Next: Typeof, Prev: Nested Functions, Up: C Extensions + +6.5 Constructing Function Calls +=============================== + +Using the built-in functions described below, you can record the +arguments a function received, and call another function with the same +arguments, without knowing the number or types of the arguments. + + You can also record the return value of that function call, and later +return that value, without knowing what data type the function tried to +return (as long as your caller expects that data type). + + However, these built-in functions may interact badly with some +sophisticated features or other extensions of the language. It is, +therefore, not recommended to use them outside very simple functions +acting as mere forwarders for their arguments. + + -- Built-in Function: void * __builtin_apply_args () + This built-in function returns a pointer to data describing how to + perform a call with the same arguments as are passed to the current + function. + + The function saves the arg pointer register, structure value + address, and all registers that might be used to pass arguments to + a function into a block of memory allocated on the stack. Then it + returns the address of that block. + + -- Built-in Function: void * __builtin_apply (void (*FUNCTION)(), void + *ARGUMENTS, size_t SIZE) + This built-in function invokes FUNCTION with a copy of the + parameters described by ARGUMENTS and SIZE. + + The value of ARGUMENTS should be the value returned by + '__builtin_apply_args'. The argument SIZE specifies the size of + the stack argument data, in bytes. + + This function returns a pointer to data describing how to return + whatever value is returned by FUNCTION. The data is saved in a + block of memory allocated on the stack. + + It is not always simple to compute the proper value for SIZE. The + value is used by '__builtin_apply' to compute the amount of data + that should be pushed on the stack and copied from the incoming + argument area. + + -- Built-in Function: void __builtin_return (void *RESULT) + This built-in function returns the value described by RESULT from + the containing function. You should specify, for RESULT, a value + returned by '__builtin_apply'. + + -- Built-in Function: __builtin_va_arg_pack () + This built-in function represents all anonymous arguments of an + inline function. It can be used only in inline functions that are + always inlined, never compiled as a separate function, such as + those using '__attribute__ ((__always_inline__))' or '__attribute__ + ((__gnu_inline__))' extern inline functions. It must be only + passed as last argument to some other function with variable + arguments. This is useful for writing small wrapper inlines for + variable argument functions, when using preprocessor macros is + undesirable. For example: + extern int myprintf (FILE *f, const char *format, ...); + extern inline __attribute__ ((__gnu_inline__)) int + myprintf (FILE *f, const char *format, ...) + { + int r = fprintf (f, "myprintf: "); + if (r < 0) + return r; + int s = fprintf (f, format, __builtin_va_arg_pack ()); + if (s < 0) + return s; + return r + s; + } + + -- Built-in Function: size_t __builtin_va_arg_pack_len () + This built-in function returns the number of anonymous arguments of + an inline function. It can be used only in inline functions that + are always inlined, never compiled as a separate function, such as + those using '__attribute__ ((__always_inline__))' or '__attribute__ + ((__gnu_inline__))' extern inline functions. For example following + does link- or run-time checking of open arguments for optimized + code: + #ifdef __OPTIMIZE__ + extern inline __attribute__((__gnu_inline__)) int + myopen (const char *path, int oflag, ...) + { + if (__builtin_va_arg_pack_len () > 1) + warn_open_too_many_arguments (); + + if (__builtin_constant_p (oflag)) + { + if ((oflag & O_CREAT) != 0 && __builtin_va_arg_pack_len () < 1) + { + warn_open_missing_mode (); + return __open_2 (path, oflag); + } + return open (path, oflag, __builtin_va_arg_pack ()); + } + + if (__builtin_va_arg_pack_len () < 1) + return __open_2 (path, oflag); + + return open (path, oflag, __builtin_va_arg_pack ()); + } + #endif + + +File: gcc.info, Node: Typeof, Next: Conditionals, Prev: Constructing Calls, Up: C Extensions + +6.6 Referring to a Type with 'typeof' +===================================== + +Another way to refer to the type of an expression is with 'typeof'. The +syntax of using of this keyword looks like 'sizeof', but the construct +acts semantically like a type name defined with 'typedef'. + + There are two ways of writing the argument to 'typeof': with an +expression or with a type. Here is an example with an expression: + + typeof (x[0](1)) + +This assumes that 'x' is an array of pointers to functions; the type +described is that of the values of the functions. + + Here is an example with a typename as the argument: + + typeof (int *) + +Here the type described is that of pointers to 'int'. + + If you are writing a header file that must work when included in ISO C +programs, write '__typeof__' instead of 'typeof'. *Note Alternate +Keywords::. + + A 'typeof' construct can be used anywhere a typedef name can be used. +For example, you can use it in a declaration, in a cast, or inside of +'sizeof' or 'typeof'. + + The operand of '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. + + 'typeof' is often useful in conjunction with statement expressions +(*note Statement Exprs::). Here is how the two together can be used to +define a safe "maximum" macro which operates on any arithmetic type and +evaluates each of its arguments exactly once: + + #define max(a,b) \ + ({ typeof (a) _a = (a); \ + typeof (b) _b = (b); \ + _a > _b ? _a : _b; }) + + The reason for using names that start with underscores for the local +variables is to avoid conflicts with variable names that occur within +the expressions that are substituted for 'a' and 'b'. Eventually we +hope to design a new form of declaration syntax that allows you to +declare variables whose scopes start only after their initializers; this +will be a more reliable way to prevent such conflicts. + +Some more examples of the use of 'typeof': + + * This declares 'y' with the type of what 'x' points to. + + typeof (*x) y; + + * This declares 'y' as an array of such values. + + typeof (*x) y[4]; + + * This declares 'y' as an array of pointers to characters: + + typeof (typeof (char *)[4]) y; + + It is equivalent to the following traditional C declaration: + + char *y[4]; + + To see the meaning of the declaration using 'typeof', and why it + might be a useful way to write, rewrite it with these macros: + + #define pointer(T) typeof(T *) + #define array(T, N) typeof(T [N]) + + Now the declaration can be rewritten this way: + + array (pointer (char), 4) y; + + Thus, 'array (pointer (char), 4)' is the type of arrays of 4 + pointers to 'char'. + + In GNU C, but not GNU C++, you may also declare the type of a variable +as '__auto_type'. In that case, the declaration must declare only one +variable, whose declarator must just be an identifier, the declaration +must be initialized, and the type of the variable is determined by the +initializer; the name of the variable is not in scope until after the +initializer. (In C++, you should use C++11 'auto' for this purpose.) +Using '__auto_type', the "maximum" macro above could be written as: + + #define max(a,b) \ + ({ __auto_type _a = (a); \ + __auto_type _b = (b); \ + _a > _b ? _a : _b; }) + + Using '__auto_type' instead of 'typeof' has two advantages: + + * Each argument to the macro appears only once in the expansion of + the macro. This prevents the size of the macro expansion growing + exponentially when calls to such macros are nested inside arguments + of such macros. + + * If the argument to the macro has variably modified type, it is + evaluated only once when using '__auto_type', but twice if 'typeof' + is used. + + _Compatibility Note:_ In addition to 'typeof', GCC 2 supported a more +limited extension that permitted one to write + + typedef T = EXPR; + +with the effect of declaring T to have the type of the expression EXPR. +This extension does not work with GCC 3 (versions between 3.0 and 3.2 +crash; 3.2.1 and later give an error). Code that relies on it should be +rewritten to use 'typeof': + + typedef typeof(EXPR) T; + +This works with all versions of GCC. + + +File: gcc.info, Node: Conditionals, Next: __int128, Prev: Typeof, Up: C Extensions + +6.7 Conditionals with Omitted Operands +====================================== + +The middle operand in a conditional expression may be omitted. Then if +the first operand is nonzero, its value is the value of the conditional +expression. + + Therefore, the expression + + x ? : y + +has the value of 'x' if that is nonzero; otherwise, the value of 'y'. + + This example is perfectly equivalent to + + x ? x : y + +In this simple case, the ability to omit the middle operand is not +especially useful. When it becomes useful is when the first operand +does, or may (if it is a macro argument), contain a side effect. Then +repeating the operand in the middle would perform the side effect twice. +Omitting the middle operand uses the value already computed without the +undesirable effects of recomputing it. + + +File: gcc.info, Node: __int128, Next: Long Long, Prev: Conditionals, Up: C Extensions + +6.8 128-bit integers +==================== + +As an extension the integer scalar type '__int128' is supported for +targets which have an integer mode wide enough to hold 128 bits. Simply +write '__int128' for a signed 128-bit integer, or 'unsigned __int128' +for an unsigned 128-bit integer. There is no support in GCC for +expressing an integer constant of type '__int128' for targets with 'long +long' integer less than 128 bits wide. + + +File: gcc.info, Node: Long Long, Next: Complex, Prev: __int128, Up: C Extensions + +6.9 Double-Word Integers +======================== + +ISO C99 supports data types for integers that are at least 64 bits wide, +and as an extension GCC supports them in C90 mode and in C++. Simply +write 'long long int' for a signed integer, or 'unsigned long long int' +for an unsigned integer. To make an integer constant of type 'long long +int', add the suffix 'LL' to the integer. To make an integer constant +of type 'unsigned long long int', add the suffix 'ULL' to the integer. + + You can use these types in arithmetic like any other integer types. +Addition, subtraction, and bitwise boolean operations on these types are +open-coded on all types of machines. Multiplication is open-coded if +the machine supports a fullword-to-doubleword widening multiply +instruction. Division and shifts are open-coded only on machines that +provide special support. The operations that are not open-coded use +special library routines that come with GCC. + + There may be pitfalls when you use 'long long' types for function +arguments without function prototypes. If a function expects type 'int' +for its argument, and you pass a value of type 'long long int', +confusion results because the caller and the subroutine disagree about +the number of bytes for the argument. Likewise, if the function expects +'long long int' and you pass 'int'. The best way to avoid such problems +is to use prototypes. + + +File: gcc.info, Node: Complex, Next: Floating Types, Prev: Long Long, Up: C Extensions + +6.10 Complex Numbers +==================== + +ISO C99 supports complex floating data types, and as an extension GCC +supports them in C90 mode and in C++. GCC also supports complex integer +data types which are not part of ISO C99. You can declare complex types +using the keyword '_Complex'. As an extension, the older GNU keyword +'__complex__' is also supported. + + For example, '_Complex double x;' declares 'x' as a variable whose real +part and imaginary part are both of type 'double'. '_Complex short int +y;' declares 'y' to have real and imaginary parts of type 'short int'; +this is not likely to be useful, but it shows that the set of complex +types is complete. + + To write a constant with a complex data type, use the suffix 'i' or 'j' +(either one; they are equivalent). For example, '2.5fi' has type +'_Complex float' and '3i' has type '_Complex int'. Such a constant +always has a pure imaginary value, but you can form any complex value +you like by adding one to a real constant. This is a GNU extension; if +you have an ISO C99 conforming C library (such as the GNU C Library), +and want to construct complex constants of floating type, you should +include '<complex.h>' and use the macros 'I' or '_Complex_I' instead. + + To extract the real part of a complex-valued expression EXP, write +'__real__ EXP'. Likewise, use '__imag__' to extract the imaginary part. +This is a GNU extension; for values of floating type, you should use the +ISO C99 functions 'crealf', 'creal', 'creall', 'cimagf', 'cimag' and +'cimagl', declared in '<complex.h>' and also provided as built-in +functions by GCC. + + The operator '~' performs complex conjugation when used on a value with +a complex type. This is a GNU extension; for values of floating type, +you should use the ISO C99 functions 'conjf', 'conj' and 'conjl', +declared in '<complex.h>' and also provided as built-in functions by +GCC. + + GCC can allocate complex automatic variables in a noncontiguous +fashion; it's even possible for the real part to be in a register while +the imaginary part is on the stack (or vice versa). Only the DWARF 2 +debug info format can represent this, so use of DWARF 2 is recommended. +If you are using the stabs debug info format, GCC describes a +noncontiguous complex variable as if it were two separate variables of +noncomplex type. If the variable's actual name is 'foo', the two +fictitious variables are named 'foo$real' and 'foo$imag'. You can +examine and set these two fictitious variables with your debugger. + + +File: gcc.info, Node: Floating Types, Next: Half-Precision, Prev: Complex, Up: C Extensions + +6.11 Additional Floating Types +============================== + +As an extension, GNU C supports additional floating types, '__float80' +and '__float128' to support 80-bit ('XFmode') and 128-bit ('TFmode') +floating types. Support for additional types includes the arithmetic +operators: add, subtract, multiply, divide; unary arithmetic operators; +relational operators; equality operators; and conversions to and from +integer and other floating types. Use a suffix 'w' or 'W' in a literal +constant of type '__float80' and 'q' or 'Q' for '_float128'. You can +declare complex types using the corresponding internal complex type, +'XCmode' for '__float80' type and 'TCmode' for '__float128' type: + + typedef _Complex float __attribute__((mode(TC))) _Complex128; + typedef _Complex float __attribute__((mode(XC))) _Complex80; + + Not all targets support additional floating-point types. '__float80' +and '__float128' types are supported on i386, x86_64 and IA-64 targets. +The '__float128' type is supported on hppa HP-UX targets. + + +File: gcc.info, Node: Half-Precision, Next: Decimal Float, Prev: Floating Types, Up: C Extensions + +6.12 Half-Precision Floating Point +================================== + +On ARM targets, GCC supports half-precision (16-bit) floating point via +the '__fp16' type. You must enable this type explicitly with the +'-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 '-mfp16-format=ieee' selects the IEEE 754-2008 format. This +format can represent normalized values in the range of 2^{-14} to 65504. +There are 11 bits of significand precision, approximately 3 decimal +digits. + + Specifying '-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 2^{-14} to 131008. + + The '__fp16' type is a storage format only. For purposes of arithmetic +and other operations, '__fp16' values in C or C++ expressions are +automatically promoted to 'float'. In addition, you cannot declare a +function with a return value or parameters of type '__fp16'. + + Note that conversions from 'double' to '__fp16' involve an intermediate +conversion to 'float'. Because of rounding, this can sometimes produce +a different result than a direct conversion. + + ARM provides hardware support for conversions between '__fp16' and +'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, +'-mfpu=neon-fp16 -mfloat-abi=softfp', in addition to the '-mfp16-format' +option to select a half-precision format. + + Language-level support for the '__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 '__fp16' and 'float' values as library calls. + + +File: gcc.info, Node: Decimal Float, Next: Hex Floats, Prev: Half-Precision, Up: C Extensions + +6.13 Decimal Floating Types +=========================== + +As an extension, GNU C supports decimal floating types as defined in the +N1312 draft of ISO/IEC WDTR24732. Support for decimal floating types in +GCC will evolve as the draft technical report changes. Calling +conventions for any target might also change. Not all targets support +decimal floating types. + + The decimal floating types are '_Decimal32', '_Decimal64', and +'_Decimal128'. They use a radix of ten, unlike the floating types +'float', 'double', and 'long double' whose radix is not specified by the +C standard but is usually two. + + Support for decimal floating types includes the arithmetic operators +add, subtract, multiply, divide; unary arithmetic operators; relational +operators; equality operators; and conversions to and from integer and +other floating types. Use a suffix 'df' or 'DF' in a literal constant +of type '_Decimal32', 'dd' or 'DD' for '_Decimal64', and 'dl' or 'DL' +for '_Decimal128'. + + GCC support of decimal float as specified by the draft technical report +is incomplete: + + * 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. + + * GCC does not provide the C library functionality associated with + 'math.h', 'fenv.h', 'stdio.h', 'stdlib.h', and 'wchar.h', which + must come from a separate C library implementation. Because of + this the GNU C compiler does not define macro '__STDC_DEC_FP__' to + indicate that the implementation conforms to the technical report. + + Types '_Decimal32', '_Decimal64', and '_Decimal128' are supported by +the DWARF 2 debug information format. + + +File: gcc.info, Node: Hex Floats, Next: Fixed-Point, Prev: Decimal Float, Up: C Extensions + +6.14 Hex Floats +=============== + +ISO C99 supports floating-point numbers written not only in the usual +decimal notation, such as '1.55e1', but also numbers such as '0x1.fp3' +written in hexadecimal format. As a GNU extension, GCC supports this in +C90 mode (except in some cases when strictly conforming) and in C++. In +that format the '0x' hex introducer and the 'p' or 'P' exponent field +are mandatory. The exponent is a decimal number that indicates the +power of 2 by which the significant part is multiplied. Thus '0x1.f' is +1 15/16, 'p3' multiplies it by 8, and the value of '0x1.fp3' is the same +as '1.55e1'. + + Unlike for floating-point numbers in the decimal notation the exponent +is always required in the hexadecimal notation. Otherwise the compiler +would not be able to resolve the ambiguity of, e.g., '0x1.f'. This +could mean '1.0f' or '1.9375' since 'f' is also the extension for +floating-point constants of type 'float'. + + +File: gcc.info, Node: Fixed-Point, Next: Named Address Spaces, Prev: Hex Floats, Up: C Extensions + +6.15 Fixed-Point Types +====================== + +As an extension, GNU C supports fixed-point types as defined in the +N1169 draft of ISO/IEC DTR 18037. Support for fixed-point types in GCC +will evolve as the draft technical report changes. Calling conventions +for any target might also change. Not all targets support fixed-point +types. + + The fixed-point types are 'short _Fract', '_Fract', 'long _Fract', +'long long _Fract', 'unsigned short _Fract', 'unsigned _Fract', +'unsigned long _Fract', 'unsigned long long _Fract', '_Sat short +_Fract', '_Sat _Fract', '_Sat long _Fract', '_Sat long long _Fract', +'_Sat unsigned short _Fract', '_Sat unsigned _Fract', '_Sat unsigned +long _Fract', '_Sat unsigned long long _Fract', 'short _Accum', +'_Accum', 'long _Accum', 'long long _Accum', 'unsigned short _Accum', +'unsigned _Accum', 'unsigned long _Accum', 'unsigned long long _Accum', +'_Sat short _Accum', '_Sat _Accum', '_Sat long _Accum', '_Sat long long +_Accum', '_Sat unsigned short _Accum', '_Sat unsigned _Accum', '_Sat +unsigned long _Accum', '_Sat unsigned long long _Accum'. + + Fixed-point data values contain fractional and optional integral parts. +The format of fixed-point data varies and depends on the target machine. + + Support for fixed-point types includes: + * prefix and postfix increment and decrement operators ('++', '--') + * unary arithmetic operators ('+', '-', '!') + * binary arithmetic operators ('+', '-', '*', '/') + * binary shift operators ('<<', '>>') + * relational operators ('<', '<=', '>=', '>') + * equality operators ('==', '!=') + * assignment operators ('+=', '-=', '*=', '/=', '<<=', '>>=') + * conversions to and from integer, floating-point, or fixed-point + types + + Use a suffix in a fixed-point literal constant: + * 'hr' or 'HR' for 'short _Fract' and '_Sat short _Fract' + * 'r' or 'R' for '_Fract' and '_Sat _Fract' + * 'lr' or 'LR' for 'long _Fract' and '_Sat long _Fract' + * 'llr' or 'LLR' for 'long long _Fract' and '_Sat long long _Fract' + * 'uhr' or 'UHR' for 'unsigned short _Fract' and '_Sat unsigned short + _Fract' + * 'ur' or 'UR' for 'unsigned _Fract' and '_Sat unsigned _Fract' + * 'ulr' or 'ULR' for 'unsigned long _Fract' and '_Sat unsigned long + _Fract' + * 'ullr' or 'ULLR' for 'unsigned long long _Fract' and '_Sat unsigned + long long _Fract' + * 'hk' or 'HK' for 'short _Accum' and '_Sat short _Accum' + * 'k' or 'K' for '_Accum' and '_Sat _Accum' + * 'lk' or 'LK' for 'long _Accum' and '_Sat long _Accum' + * 'llk' or 'LLK' for 'long long _Accum' and '_Sat long long _Accum' + * 'uhk' or 'UHK' for 'unsigned short _Accum' and '_Sat unsigned short + _Accum' + * 'uk' or 'UK' for 'unsigned _Accum' and '_Sat unsigned _Accum' + * 'ulk' or 'ULK' for 'unsigned long _Accum' and '_Sat unsigned long + _Accum' + * 'ullk' or 'ULLK' for 'unsigned long long _Accum' and '_Sat unsigned + long long _Accum' + + GCC support of fixed-point types as specified by the draft technical +report is incomplete: + + * Pragmas to control overflow and rounding behaviors are not + implemented. + + Fixed-point types are supported by the DWARF 2 debug information +format. + + +File: gcc.info, Node: Named Address Spaces, Next: Zero Length, Prev: Fixed-Point, Up: C Extensions + +6.16 Named Address Spaces +========================= + +As an extension, GNU C 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 AVR, +SPU, M32C, and RL78 targets support address spaces other than the +generic address space. + + Address space identifiers may be used exactly like any other C type +qualifier (e.g., 'const' or 'volatile'). See the N1275 document for +more details. + +6.16.1 AVR Named Address Spaces +------------------------------- + +On the AVR target, there are several address spaces that can be used in +order to put read-only data into the flash memory and access that data +by means of the special instructions 'LPM' or 'ELPM' needed to read from +flash. + + Per default, any data including read-only data is located in RAM (the +generic address space) so that non-generic address spaces are needed to +locate read-only data in flash memory _and_ to generate the right +instructions to access this data without using (inline) assembler code. + +'__flash' + The '__flash' qualifier locates data in the '.progmem.data' + section. Data is read using the 'LPM' instruction. Pointers to + this address space are 16 bits wide. + +'__flash1' +'__flash2' +'__flash3' +'__flash4' +'__flash5' + These are 16-bit address spaces locating data in section + '.progmemN.data' where N refers to address space '__flashN'. The + compiler sets the 'RAMPZ' segment register appropriately before + reading data by means of the 'ELPM' instruction. + +'__memx' + This is a 24-bit address space that linearizes flash and RAM: If + the high bit of the address is set, data is read from RAM using the + lower two bytes as RAM address. If the high bit of the address is + clear, data is read from flash with 'RAMPZ' set according to the + high byte of the address. *Note '__builtin_avr_flash_segment': AVR + Built-in Functions. + + Objects in this address space are located in '.progmemx.data'. + + Example + + char my_read (const __flash char ** p) + { + /* p is a pointer to RAM that points to a pointer to flash. + The first indirection of p reads that flash pointer + from RAM and the second indirection reads a char from this + flash address. */ + + return **p; + } + + /* Locate array[] in flash memory */ + const __flash int array[] = { 3, 5, 7, 11, 13, 17, 19 }; + + int i = 1; + + int main (void) + { + /* Return 17 by reading from flash memory */ + return array[array[i]]; + } + +For each named address space supported by avr-gcc there is an equally +named but uppercase built-in macro defined. The purpose is to +facilitate testing if respective address space support is available or +not: + + #ifdef __FLASH + const __flash int var = 1; + + int read_var (void) + { + return var; + } + #else + #include <avr/pgmspace.h> /* From AVR-LibC */ + + const int var PROGMEM = 1; + + int read_var (void) + { + return (int) pgm_read_word (&var); + } + #endif /* __FLASH */ + +Notice that attribute *note 'progmem': AVR Variable Attributes. locates +data in flash but accesses to these data read from generic address +space, i.e. from RAM, so that you need special accessors like +'pgm_read_byte' from AVR-LibC (http://nongnu.org/avr-libc/user-manual/) +together with attribute 'progmem'. + +Limitations and caveats + + * Reading across the 64 KiB section boundary of the '__flash' or + '__flashN' address spaces shows undefined behavior. The only + address space that supports reading across the 64 KiB flash segment + boundaries is '__memx'. + + * If you use one of the '__flashN' address spaces you must arrange + your linker script to locate the '.progmemN.data' sections + according to your needs. + + * Any data or pointers to the non-generic address spaces must be + qualified as 'const', i.e. as read-only data. This still applies + if the data in one of these address spaces like software version + number or calibration lookup table are intended to be changed after + load time by, say, a boot loader. In this case the right + qualification is 'const' 'volatile' so that the compiler must not + optimize away known values or insert them as immediates into + operands of instructions. + + * The following code initializes a variable 'pfoo' located in static + storage with a 24-bit address: + extern const __memx char foo; + const __memx void *pfoo = &foo; + + Such code requires at least binutils 2.23, see + PR13503 (http://sourceware.org/PR13503). + +6.16.2 M32C Named Address Spaces +-------------------------------- + +On the M32C target, with the R8C and M16C CPU variants, variables +qualified with '__far' are accessed using 32-bit addresses in order to +access memory beyond the first 64 Ki bytes. If '__far' is used with the +M32CM or M32C CPU variants, it has no effect. + +6.16.3 RL78 Named Address Spaces +-------------------------------- + +On the RL78 target, variables qualified with '__far' are accessed with +32-bit pointers (20-bit addresses) rather than the default 16-bit +addresses. Non-far variables are assumed to appear in the topmost +64 KiB of the address space. + +6.16.4 SPU Named Address Spaces +------------------------------- + +On the SPU target variables may be declared as belonging to another +address space by qualifying the type with the '__ea' address space +identifier: + + extern int __ea i; + +The compiler generates special code to access the variable 'i'. It may +use runtime library support, or generate special machine instructions to +access that address space. + + +File: gcc.info, Node: Zero Length, Next: Empty Structures, Prev: Named Address Spaces, Up: C Extensions + +6.17 Arrays of Length Zero +========================== + +Zero-length arrays are allowed in GNU C. They are very useful as the +last element of a structure that is really a header for a +variable-length object: + + struct line { + int length; + char contents[0]; + }; + + struct line *thisline = (struct line *) + malloc (sizeof (struct line) + this_length); + thisline->length = this_length; + + In ISO C90, you would have to give 'contents' a length of 1, which +means either you waste space or complicate the argument to 'malloc'. + + In ISO C99, you would use a "flexible array member", which is slightly +different in syntax and semantics: + + * Flexible array members are written as 'contents[]' without the '0'. + + * Flexible array members have incomplete type, and so the 'sizeof' + operator may not be applied. As a quirk of the original + implementation of zero-length arrays, 'sizeof' evaluates to zero. + + * Flexible array members may only appear as the last member of a + 'struct' that is otherwise non-empty. + + * A structure containing a flexible array member, or a union + containing such a structure (possibly recursively), may not be a + member of a structure or an element of an array. (However, these + uses are permitted by GCC as extensions.) + + GCC versions before 3.0 allowed zero-length arrays to be statically +initialized, as if they were flexible arrays. In addition to those +cases that were useful, it also allowed initializations in situations +that would corrupt later data. Non-empty initialization of zero-length +arrays is now treated like any case where there are more initializer +elements than the array holds, in that a suitable warning about "excess +elements in array" is given, and the excess elements (all of them, in +this case) are ignored. + + Instead GCC allows static initialization of flexible array members. +This is equivalent to defining a new structure containing the original +structure followed by an array of sufficient size to contain the data. +E.g. in the following, 'f1' is constructed as if it were declared like +'f2'. + + struct f1 { + int x; int y[]; + } f1 = { 1, { 2, 3, 4 } }; + + struct f2 { + struct f1 f1; int data[3]; + } f2 = { { 1 }, { 2, 3, 4 } }; + +The convenience of this extension is that 'f1' has the desired type, +eliminating the need to consistently refer to 'f2.f1'. + + This has symmetry with normal static arrays, in that an array of +unknown size is also written with '[]'. + + Of course, this extension only makes sense if the extra data comes at +the end of a top-level object, as otherwise we would be overwriting data +at subsequent offsets. To avoid undue complication and confusion with +initialization of deeply nested arrays, we simply disallow any non-empty +initialization except when the structure is the top-level object. For +example: + + struct foo { int x; int y[]; }; + struct bar { struct foo z; }; + + struct foo a = { 1, { 2, 3, 4 } }; // Valid. + struct bar b = { { 1, { 2, 3, 4 } } }; // Invalid. + struct bar c = { { 1, { } } }; // Valid. + struct foo d[1] = { { 1 { 2, 3, 4 } } }; // Invalid. + + +File: gcc.info, Node: Empty Structures, Next: Variable Length, Prev: Zero Length, Up: C Extensions + +6.18 Structures With No Members +=============================== + +GCC permits a C structure to have no members: + + struct empty { + }; + + The structure has size zero. In C++, empty structures are part of the +language. G++ treats empty structures as if they had a single member of +type 'char'. + + +File: gcc.info, Node: Variable Length, Next: Variadic Macros, Prev: Empty Structures, Up: C Extensions + +6.19 Arrays of Variable Length +============================== + +Variable-length automatic arrays are allowed in ISO C99, and as an +extension GCC accepts them in C90 mode and in C++. These arrays are +declared like any other automatic arrays, but with a length that is not +a constant expression. The storage is allocated at the point of +declaration and deallocated when the block scope containing the +declaration exits. For example: + + FILE * + concat_fopen (char *s1, char *s2, char *mode) + { + char str[strlen (s1) + strlen (s2) + 1]; + strcpy (str, s1); + strcat (str, s2); + return fopen (str, mode); + } + + Jumping or breaking out of the scope of the array name deallocates the +storage. Jumping into the scope is not allowed; you get an error +message for it. + + As an extension, GCC accepts variable-length arrays as a member of a +structure or a union. For example: + + void + foo (int n) + { + struct S { int x[n]; }; + } + + You can use the function 'alloca' to get an effect much like +variable-length arrays. The function 'alloca' is available in many +other C implementations (but not in all). On the other hand, +variable-length arrays are more elegant. + + There are other differences between these two methods. Space allocated +with 'alloca' exists until the containing _function_ returns. The space +for a variable-length array is deallocated as soon as the array name's +scope ends. (If you use both variable-length arrays and 'alloca' in the +same function, deallocation of a variable-length array also deallocates +anything more recently allocated with 'alloca'.) + + You can also use variable-length arrays as arguments to functions: + + struct entry + tester (int len, char data[len][len]) + { + /* ... */ + } + + The length of an array is computed once when the storage is allocated +and is remembered for the scope of the array in case you access it with +'sizeof'. + + If you want to pass the array first and the length afterward, you can +use a forward declaration in the parameter list--another GNU extension. + + struct entry + tester (int len; char data[len][len], int len) + { + /* ... */ + } + + The 'int len' before the semicolon is a "parameter forward +declaration", and it serves the purpose of making the name 'len' known +when the declaration of 'data' is parsed. + + You can write any number of such parameter forward declarations in the +parameter list. They can be separated by commas or semicolons, but the +last one must end with a semicolon, which is followed by the "real" +parameter declarations. Each forward declaration must match a "real" +declaration in parameter name and data type. ISO C99 does not support +parameter forward declarations. + + +File: gcc.info, Node: Variadic Macros, Next: Escaped Newlines, Prev: Variable Length, Up: C Extensions + +6.20 Macros with a Variable Number of Arguments. +================================================ + +In the ISO C standard of 1999, a macro can be declared to accept a +variable number of arguments much as a function can. The syntax for +defining the macro is similar to that of a function. Here is an +example: + + #define debug(format, ...) fprintf (stderr, format, __VA_ARGS__) + +Here '...' is a "variable argument". In the invocation of such a macro, +it represents the zero or more tokens until the closing parenthesis that +ends the invocation, including any commas. This set of tokens replaces +the identifier '__VA_ARGS__' in the macro body wherever it appears. See +the CPP manual for more information. + + GCC has long supported variadic macros, and used a different syntax +that allowed you to give a name to the variable arguments just like any +other argument. Here is an example: + + #define debug(format, args...) fprintf (stderr, format, args) + +This is in all ways equivalent to the ISO C example above, but arguably +more readable and descriptive. + + GNU CPP has two further variadic macro extensions, and permits them to +be used with either of the above forms of macro definition. + + In standard C, you are not allowed to leave the variable argument out +entirely; but you are allowed to pass an empty argument. For example, +this invocation is invalid in ISO C, because there is no comma after the +string: + + debug ("A message") + + GNU CPP permits you to completely omit the variable arguments in this +way. In the above examples, the compiler would complain, though since +the expansion of the macro still has the extra comma after the format +string. + + To help solve this problem, CPP behaves specially for variable +arguments used with the token paste operator, '##'. If instead you +write + + #define debug(format, ...) fprintf (stderr, format, ## __VA_ARGS__) + +and if the variable arguments are omitted or empty, the '##' operator +causes the preprocessor to remove the comma before it. If you do +provide some variable arguments in your macro invocation, GNU CPP does +not complain about the paste operation and instead places the variable +arguments after the comma. Just like any other pasted macro argument, +these arguments are not macro expanded. + + +File: gcc.info, Node: Escaped Newlines, Next: Subscripting, Prev: Variadic Macros, Up: C Extensions + +6.21 Slightly Looser Rules for Escaped Newlines +=============================================== + +Recently, the preprocessor has relaxed its treatment of escaped +newlines. Previously, the newline had to immediately follow a +backslash. The current implementation allows whitespace in the form of +spaces, horizontal and vertical tabs, and form feeds between the +backslash and the subsequent newline. The preprocessor issues a +warning, but treats it as a valid escaped newline and combines the two +lines to form a single logical line. This works within comments and +tokens, as well as between tokens. Comments are _not_ treated as +whitespace for the purposes of this relaxation, since they have not yet +been replaced with spaces. + + +File: gcc.info, Node: Subscripting, Next: Pointer Arith, Prev: Escaped Newlines, Up: C Extensions + +6.22 Non-Lvalue Arrays May Have Subscripts +========================================== + +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 '&' operator may not be applied to them. +As an extension, GNU C allows such arrays to be 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 C90: + + struct foo {int a[4];}; + + struct foo f(); + + bar (int index) + { + return f().a[index]; + } + + +File: gcc.info, Node: Pointer Arith, Next: Initializers, Prev: Subscripting, Up: C Extensions + +6.23 Arithmetic on 'void'- and Function-Pointers +================================================ + +In GNU C, addition and subtraction operations are supported on pointers +to 'void' and on pointers to functions. This is done by treating the +size of a 'void' or of a function as 1. + + A consequence of this is that 'sizeof' is also allowed on 'void' and on +function types, and returns 1. + + The option '-Wpointer-arith' requests a warning if these extensions are +used. + + +File: gcc.info, Node: Initializers, Next: Compound Literals, Prev: Pointer Arith, Up: C Extensions + +6.24 Non-Constant Initializers +============================== + +As in standard C++ and ISO C99, the elements of an aggregate initializer +for an automatic variable are not required to be constant expressions in +GNU C. Here is an example of an initializer with run-time varying +elements: + + foo (float f, float g) + { + float beat_freqs[2] = { f-g, f+g }; + /* ... */ + } + + +File: gcc.info, Node: Compound Literals, Next: Designated Inits, Prev: Initializers, Up: C Extensions + +6.25 Compound Literals +====================== + +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 C90 mode and in C++, though the semantics are somewhat +different in C++. + + Usually, the specified type is a structure. Assume that 'struct foo' +and 'structure' are declared as shown: + + struct foo {int a; char b[2];} structure; + +Here is an example of constructing a 'struct foo' with a compound +literal: + + structure = ((struct foo) {x + y, 'a', 0}); + +This is equivalent to writing the following: + + { + struct foo temp = {x + y, 'a', 0}; + structure = temp; + } + + You can also construct an array, though this is dangerous in C++, as +explained below. If all the elements of the compound literal are (made +up of) simple constant expressions, suitable for use in initializers of +objects of static storage duration, then the compound literal can be +coerced to a pointer to its first element and used in such an +initializer, as shown here: + + char **foo = (char *[]) { "x", "y", "z" }; + + Compound literals for scalar types and union types are also allowed, +but then the compound literal is equivalent to a cast. + + As a GNU extension, GCC allows initialization of objects with static +storage duration by compound literals (which is not possible in ISO C99, +because the initializer is not a constant). It is handled as if the +object is initialized only with the bracket enclosed list if the types +of the compound literal and the object match. The initializer list of +the compound literal must be constant. If the object being initialized +has array type of unknown size, the size is determined by compound +literal size. + + static struct foo x = (struct foo) {1, 'a', 'b'}; + static int y[] = (int []) {1, 2, 3}; + static int z[] = (int [3]) {1}; + +The above lines are equivalent to the following: + static struct foo x = {1, 'a', 'b'}; + static int y[] = {1, 2, 3}; + static int z[] = {1, 0, 0}; + + In C, a compound literal designates an unnamed object with static or +automatic storage duration. In C++, a compound literal designates a +temporary object, which only lives until the end of its full-expression. +As a result, well-defined C code that takes the address of a subobject +of a compound literal can be undefined in C++. For instance, if the +array compound literal example above appeared inside a function, any +subsequent use of 'foo' in C++ has undefined behavior because the +lifetime of the array ends after the declaration of 'foo'. As a result, +the C++ compiler now rejects the conversion of a temporary array to a +pointer. + + As an optimization, the C++ compiler sometimes gives array compound +literals longer lifetimes: when the array either appears outside a +function or has const-qualified type. If 'foo' and its initializer had +elements of 'char *const' type rather than 'char *', or if 'foo' were a +global variable, the array would have static storage duration. But it +is probably safest just to avoid the use of array compound literals in +code compiled as C++. + + +File: gcc.info, Node: Designated Inits, Next: Case Ranges, Prev: Compound Literals, Up: C Extensions + +6.26 Designated Initializers +============================ + +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 C90 mode as well. This extension is not implemented in +GNU C++. + + To specify an array index, write '[INDEX] =' before the element value. +For example, + + int a[6] = { [4] = 29, [2] = 15 }; + +is equivalent to + + int a[6] = { 0, 0, 15, 0, 29, 0 }; + +The index values must be constant expressions, even if the array being +initialized is automatic. + + An alternative syntax for this that has been obsolete since GCC 2.5 but +GCC still accepts is to write '[INDEX]' before the element value, with +no '='. + + To initialize a range of elements to the same value, write '[FIRST ... +LAST] = VALUE'. This is a GNU extension. For example, + + int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 }; + +If the value in it has side-effects, the side-effects happen only once, +not for each initialized field by the range initializer. + +Note that the length of the array is the highest value specified plus +one. + + In a structure initializer, specify the name of a field to initialize +with '.FIELDNAME =' before the element value. For example, given the +following structure, + + struct point { int x, y; }; + +the following initialization + + struct point p = { .y = yvalue, .x = xvalue }; + +is equivalent to + + struct point p = { xvalue, yvalue }; + + Another syntax that has the same meaning, obsolete since GCC 2.5, is +'FIELDNAME:', as shown here: + + struct point p = { y: yvalue, x: xvalue }; + + Omitted field members are implicitly initialized the same as objects +that have static storage duration. + + The '[INDEX]' or '.FIELDNAME' is known as a "designator". You can also +use a designator (or the obsolete colon syntax) when initializing a +union, to specify which element of the union should be used. For +example, + + union foo { int i; double d; }; + + union foo f = { .d = 4 }; + +converts 4 to a 'double' to store it in the union using the second +element. By contrast, casting 4 to type 'union foo' stores it into the +union as the integer 'i', since it is an integer. (*Note Cast to +Union::.) + + You can combine this technique of naming elements with ordinary C +initialization of successive elements. Each initializer element that +does not have a designator applies to the next consecutive element of +the array or structure. For example, + + int a[6] = { [1] = v1, v2, [4] = v4 }; + +is equivalent to + + int a[6] = { 0, v1, v2, 0, v4, 0 }; + + Labeling the elements of an array initializer is especially useful when +the indices are characters or belong to an 'enum' type. For example: + + int whitespace[256] + = { [' '] = 1, ['\t'] = 1, ['\h'] = 1, + ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 }; + + You can also write a series of '.FIELDNAME' and '[INDEX]' designators +before an '=' to specify a nested subobject to initialize; the list is +taken relative to the subobject corresponding to the closest surrounding +brace pair. For example, with the 'struct point' declaration above: + + struct point ptarray[10] = { [2].y = yv2, [2].x = xv2, [0].x = xv0 }; + +If the same field is initialized multiple times, it has the value from +the last initialization. If any such overridden initialization has +side-effect, it is unspecified whether the side-effect happens or not. +Currently, GCC discards them and issues a warning. + + +File: gcc.info, Node: Case Ranges, Next: Cast to Union, Prev: Designated Inits, Up: C Extensions + +6.27 Case Ranges +================ + +You can specify a range of consecutive values in a single 'case' label, +like this: + + case LOW ... HIGH: + +This has the same effect as the proper number of individual 'case' +labels, one for each integer value from LOW to HIGH, inclusive. + + This feature is especially useful for ranges of ASCII character codes: + + case 'A' ... 'Z': + + *Be careful:* Write spaces around the '...', for otherwise it may be +parsed wrong when you use it with integer values. For example, write +this: + + case 1 ... 5: + +rather than this: + + case 1...5: + + +File: gcc.info, Node: Cast to Union, Next: Mixed Declarations, Prev: Case Ranges, Up: C Extensions + +6.28 Cast to a Union Type +========================= + +A cast to union type is similar to other casts, except that the type +specified is a union type. You can specify the type either with 'union +TAG' or with a typedef name. A cast to union is actually a constructor, +not a cast, and hence does not yield an lvalue like normal casts. +(*Note Compound Literals::.) + + The types that may be cast to the union type are those of the members +of the union. Thus, given the following union and variables: + + union foo { int i; double d; }; + int x; + double y; + +both 'x' and 'y' can be cast to type 'union foo'. + + Using the cast as the right-hand side of an assignment to a variable of +union type is equivalent to storing in a member of the union: + + union foo u; + /* ... */ + u = (union foo) x == u.i = x + u = (union foo) y == u.d = y + + You can also use the union cast as a function argument: + + void hack (union foo); + /* ... */ + hack ((union foo) x); + + +File: gcc.info, Node: Mixed Declarations, Next: Function Attributes, Prev: Cast to Union, Up: C Extensions + +6.29 Mixed Declarations and Code +================================ + +ISO C99 and ISO C++ allow declarations and code to be freely mixed +within compound statements. As an extension, GNU C also allows this in +C90 mode. For example, you could do: + + int i; + /* ... */ + i++; + int j = i + 2; + + Each identifier is visible from where it is declared until the end of +the enclosing block. + + +File: gcc.info, Node: Function Attributes, Next: Attribute Syntax, Prev: Mixed Declarations, Up: C Extensions + +6.30 Declaring Attributes of Functions +====================================== + +In GNU C, you declare certain things about functions called in your +program which help the compiler optimize function calls and check your +code more carefully. + + The keyword '__attribute__' allows you to specify special 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: 'aligned', 'alloc_size', +'alloc_align', 'assume_aligned', 'noreturn', 'returns_twice', +'noinline', 'noclone', 'always_inline', 'flatten', 'pure', 'const', +'nothrow', 'sentinel', 'format', 'format_arg', 'no_instrument_function', +'no_split_stack', 'section', 'constructor', 'destructor', 'used', +'unused', 'deprecated', 'weak', 'malloc', 'alias', 'ifunc', +'warn_unused_result', 'nonnull', 'returns_nonnull', 'gnu_inline', +'externally_visible', 'hot', 'cold', 'artificial', +'no_sanitize_address', 'no_address_safety_analysis', +'no_sanitize_undefined', 'error' and 'warning'. Several other +attributes are defined for functions on particular target systems. +Other attributes, including 'section' are supported for variables +declarations (*note Variable Attributes::) and for types (*note Type +Attributes::). + + GCC plugins may provide their own attributes. + + You may also specify attributes with '__' preceding and following each +keyword. This allows you to use them in header files without being +concerned about a possible macro of the same name. For example, you may +use '__noreturn__' instead of 'noreturn'. + + *Note Attribute Syntax::, for details of the exact syntax for using +attributes. + +'alias ("TARGET")' + The 'alias' attribute causes the declaration to be emitted as an + alias for another symbol, which must be specified. For instance, + + void __f () { /* Do something. */; } + void f () __attribute__ ((weak, alias ("__f"))); + + defines 'f' to be a weak alias for '__f'. In C++, the mangled name + for the target must be used. It is an error if '__f' is not + defined in the same translation unit. + + Not all target machines support this attribute. + +'aligned (ALIGNMENT)' + This attribute specifies a minimum alignment for the function, + measured in bytes. + + You cannot use this attribute to decrease the alignment of a + function, only to increase it. However, when you explicitly + specify a function alignment this overrides the effect of the + '-falign-functions' (*note Optimize Options::) option for this + function. + + Note that the effectiveness of 'aligned' attributes may be limited + by inherent limitations in your linker. On many systems, the + linker is only able to arrange for functions to be aligned up to a + certain maximum alignment. (For some linkers, the maximum + supported alignment may be very very small.) See your linker + documentation for further information. + + The 'aligned' attribute can also be used for variables and fields + (*note Variable Attributes::.) + +'alloc_size' + The 'alloc_size' attribute is used to tell the compiler that the + function return value points to memory, where the size is given by + one or two of the functions parameters. GCC uses this information + to improve the correctness of '__builtin_object_size'. + + The function parameter(s) denoting the allocated size are specified + by one or two integer arguments supplied to the attribute. The + allocated size is either the value of the single function argument + specified or the product of the two function arguments specified. + Argument numbering starts at one. + + For instance, + + void* my_calloc(size_t, size_t) __attribute__((alloc_size(1,2))) + void* my_realloc(void*, size_t) __attribute__((alloc_size(2))) + + declares that 'my_calloc' returns memory of the size given by the + product of parameter 1 and 2 and that 'my_realloc' returns memory + of the size given by parameter 2. + +'alloc_align' + The 'alloc_align' attribute is used to tell the compiler that the + function return value points to memory, where the returned pointer + minimum alignment is given by one of the functions parameters. GCC + uses this information to improve pointer alignment analysis. + + The function parameter denoting the allocated alignment is + specified by one integer argument, whose number is the argument of + the attribute. Argument numbering starts at one. + + For instance, + + void* my_memalign(size_t, size_t) __attribute__((alloc_align(1))) + + declares that 'my_memalign' returns memory with minimum alignment + given by parameter 1. + +'assume_aligned' + The 'assume_aligned' attribute is used to tell the compiler that + the function return value points to memory, where the returned + pointer minimum alignment is given by the first argument. If the + attribute has two arguments, the second argument is misalignment + offset. + + For instance + + void* my_alloc1(size_t) __attribute__((assume_aligned(16))) + void* my_alloc2(size_t) __attribute__((assume_aligned(32, 8))) + + declares that 'my_alloc1' returns 16-byte aligned pointer and that + 'my_alloc2' returns a pointer whose value modulo 32 is equal to 8. + +'always_inline' + Generally, functions are not inlined unless optimization is + specified. For functions declared inline, this attribute inlines + the function even if no optimization level is specified. + +'gnu_inline' + This attribute should be used with a function that is also declared + with the 'inline' keyword. It directs GCC to treat the function as + if it were defined in gnu90 mode even when compiling in C99 or + gnu99 mode. + + If the function is declared 'extern', then this definition of the + function is used only for inlining. In no case is the function + compiled as a standalone function, not even if you take its address + explicitly. Such an address becomes an external reference, as if + you had only declared the function, and had not defined it. This + has almost the effect of a macro. The way to use this is to put a + function definition in a header file with this attribute, and put + another copy of the function, without 'extern', in a library file. + The definition in the header file causes most calls to the function + to be inlined. If any uses of the function remain, they refer to + the single copy in the library. Note that the two definitions of + the functions need not be precisely the same, although if they do + not have the same effect your program may behave oddly. + + In C, if the function is neither 'extern' nor 'static', then the + function is compiled as a standalone function, as well as being + inlined where possible. + + This is how GCC traditionally handled functions declared 'inline'. + Since ISO C99 specifies a different semantics for 'inline', this + function attribute is provided as a transition measure and as a + useful feature in its own right. This attribute is available in + GCC 4.1.3 and later. It is available if either of the preprocessor + macros '__GNUC_GNU_INLINE__' or '__GNUC_STDC_INLINE__' are defined. + *Note An Inline Function is As Fast As a Macro: Inline. + + In C++, this attribute does not depend on 'extern' in any way, but + it still requires the 'inline' keyword to enable its special + behavior. + +'artificial' + This attribute is useful for small inline wrappers that if possible + should appear during debugging as a unit. Depending on the debug + info format it either means marking the function as artificial or + using the caller location for all instructions within the inlined + body. + +'bank_switch' + 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. + +'flatten' + Generally, inlining into a function is limited. For a function + marked with this attribute, every call inside this function is + inlined, if possible. Whether the function itself is considered + for inlining depends on its size and the current inlining + parameters. + +'error ("MESSAGE")' + If this attribute is used on a function declaration and a call to + such a function is not eliminated through dead code elimination or + other optimizations, an error that includes MESSAGE is diagnosed. + This is useful for compile-time checking, especially together with + '__builtin_constant_p' and inline functions where checking the + inline function arguments is not possible through 'extern char + [(condition) ? 1 : -1];' tricks. While it is possible to leave the + function undefined and thus invoke a link failure, when using this + attribute the problem is diagnosed earlier and with exact location + of the call even in presence of inline functions or when not + emitting debugging information. + +'warning ("MESSAGE")' + If this attribute is used on a function declaration and a call to + such a function is not eliminated through dead code elimination or + other optimizations, a warning that includes MESSAGE is diagnosed. + This is useful for compile-time checking, especially together with + '__builtin_constant_p' and inline functions. While it is possible + to define the function with a message in '.gnu.warning*' section, + when using this attribute the problem is diagnosed earlier and with + exact location of the call even in presence of inline functions or + when not emitting debugging information. + +'cdecl' + On the Intel 386, the 'cdecl' attribute causes the compiler to + assume that the calling function pops off the stack space used to + pass arguments. This is useful to override the effects of the + '-mrtd' switch. + +'const' + Many functions do not examine any values except their arguments, + and have no effects except the return value. Basically this is + just slightly more strict class than the 'pure' attribute below, + since function is not allowed to read global memory. + + Note that a function that has pointer arguments and examines the + data pointed to must _not_ be declared 'const'. Likewise, a + function that calls a non-'const' function usually must not be + 'const'. It does not make sense for a 'const' function to return + 'void'. + + The attribute 'const' is not implemented in GCC versions earlier + than 2.5. An alternative way to declare that a function has no + side effects, which works in the current version and in some older + versions, is as follows: + + typedef int intfn (); + + extern const intfn square; + + This approach does not work in GNU C++ from 2.6.0 on, since the + language specifies that the 'const' must be attached to the return + value. + +'constructor' +'destructor' +'constructor (PRIORITY)' +'destructor (PRIORITY)' + The 'constructor' attribute causes the function to be called + automatically before execution enters 'main ()'. Similarly, the + 'destructor' attribute causes the function to be called + automatically after 'main ()' completes or 'exit ()' is called. + Functions with these attributes are useful for initializing data + that is used implicitly during the execution of the program. + + You may provide an optional integer priority to control the order + in which constructor and destructor functions are run. A + constructor with a smaller priority number runs before a + constructor with a larger priority number; the opposite + relationship holds for destructors. So, if you have a constructor + that allocates a resource and a destructor that deallocates the + same resource, both functions typically have the same priority. + The priorities for constructor and destructor functions are the + same as those specified for namespace-scope C++ objects (*note C++ + Attributes::). + + These attributes are not currently implemented for Objective-C. + +'deprecated' +'deprecated (MSG)' + The 'deprecated' attribute results in a warning if the function is + used anywhere in the source file. This is useful when identifying + functions that are expected to be removed in a future version of a + program. The warning also includes the location of the declaration + of the deprecated function, to enable users to easily find further + information about why the function is deprecated, or what they + should do instead. Note that the warnings only occurs for uses: + + int old_fn () __attribute__ ((deprecated)); + int old_fn (); + int (*fn_ptr)() = old_fn; + + results in a warning on line 3 but not line 2. The optional MSG + argument, which must be a string, is printed in the warning if + present. + + The 'deprecated' attribute can also be used for variables and types + (*note Variable Attributes::, *note Type Attributes::.) + +'disinterrupt' + On Epiphany and MeP targets, this attribute causes the compiler to + emit instructions to disable interrupts for the duration of the + given function. + +'dllexport' + On Microsoft Windows targets and Symbian OS targets the 'dllexport' + attribute causes the compiler to provide a global pointer to a + pointer in a DLL, so that it can be referenced with the 'dllimport' + attribute. On Microsoft Windows targets, the pointer name is + formed by combining '_imp__' and the function or variable name. + + You can use '__declspec(dllexport)' as a synonym for '__attribute__ + ((dllexport))' for compatibility with other compilers. + + On systems that support the 'visibility' attribute, this attribute + also implies "default" visibility. It is an error to explicitly + specify any other visibility. + + In previous versions of GCC, the 'dllexport' attribute was ignored + for inlined functions, unless the '-fkeep-inline-functions' flag + had been used. The default behavior now is to emit all dllexported + inline functions; however, this can cause object file-size bloat, + in which case the old behavior can be restored by using + '-fno-keep-inline-dllexport'. + + The attribute is also ignored for undefined symbols. + + When applied to C++ classes, the attribute marks defined + non-inlined member functions and static data members as exports. + Static consts initialized in-class are not marked unless they are + also defined out-of-class. + + For Microsoft Windows targets there are alternative methods for + including the symbol in the DLL's export table such as using a + '.def' file with an 'EXPORTS' section or, with GNU ld, using the + '--export-all' linker flag. + +'dllimport' + On Microsoft Windows and Symbian OS targets, the 'dllimport' + attribute causes the compiler to reference a function or variable + via a global pointer to a pointer that is set up by the DLL + exporting the symbol. The attribute implies 'extern'. On + Microsoft Windows targets, the pointer name is formed by combining + '_imp__' and the function or variable name. + + You can use '__declspec(dllimport)' as a synonym for '__attribute__ + ((dllimport))' for compatibility with other compilers. + + On systems that support the 'visibility' attribute, this attribute + also implies "default" visibility. It is an error to explicitly + specify any other visibility. + + Currently, the attribute is ignored for inlined functions. If the + attribute is applied to a symbol _definition_, an error is + reported. If a symbol previously declared 'dllimport' is later + defined, the attribute is ignored in subsequent references, and a + warning is emitted. The attribute is also overridden by a + subsequent declaration as 'dllexport'. + + When applied to C++ classes, the attribute marks non-inlined member + functions and static data members as imports. However, the + attribute is ignored for virtual methods to allow creation of + vtables using thunks. + + On the SH Symbian OS target the '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 dllimported constructor or a non-inline, non-pure + virtual function 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. + + For Microsoft Windows targets the use of the 'dllimport' attribute + on functions is not necessary, but provides a small performance + benefit by eliminating a thunk in the DLL. The use of the + 'dllimport' attribute on imported variables was required on older + versions of the GNU linker, but can now be avoided by passing the + '--enable-auto-import' switch to the GNU linker. As with + functions, using the attribute for a variable eliminates a thunk in + the DLL. + + One drawback to using this attribute is that a pointer to a + _variable_ marked as 'dllimport' cannot be used as a constant + address. However, a pointer to a _function_ with the 'dllimport' + attribute can be used as a constant initializer; in this case, the + address of a stub function in the import lib is referenced. On + Microsoft Windows targets, the attribute can be disabled for + functions by setting the '-mnop-fun-dllimport' flag. + +'eightbit_data' + Use this attribute on the H8/300, H8/300H, and H8S to indicate that + the specified variable should be placed into the eight-bit data + section. The compiler generates more efficient code for certain + operations on data in the eight-bit data area. Note the eight-bit + data area is limited to 256 bytes of data. + + You must use GAS and GLD from GNU binutils version 2.7 or later for + this attribute to work correctly. + +'exception' + Use this attribute on the NDS32 target to indicate that the + specified function is an exception handler. The compiler will + generate corresponding sections for use in an exception handler. + +'exception_handler' + Use this attribute on the Blackfin to indicate that the specified + function is an exception handler. The compiler generates function + entry and exit sequences suitable for use in an exception handler + when this attribute is present. + +'externally_visible' + This attribute, attached to a global variable or function, + nullifies the effect of the '-fwhole-program' command-line option, + so the object remains visible outside the current compilation unit. + + If '-fwhole-program' is used together with '-flto' and 'gold' is + used as the linker plugin, 'externally_visible' attributes are + automatically added to functions (not variable yet due to a current + 'gold' issue) that are accessed outside of LTO objects according to + resolution file produced by 'gold'. For other linkers that cannot + generate resolution file, explicit 'externally_visible' attributes + are still necessary. + +'far' + On 68HC11 and 68HC12 the 'far' attribute causes the compiler to use + a calling convention that takes care of switching memory banks when + entering and leaving a function. This calling convention is also + the default when using the '-mlong-calls' option. + + On 68HC12 the compiler uses the 'call' and 'rtc' instructions to + call and return from a function. + + On 68HC11 the compiler generates a sequence of instructions to + invoke a board-specific routine to switch the memory bank and call + the real function. The board-specific routine simulates a 'call'. + At the end of a function, it jumps to a board-specific routine + instead of using 'rts'. The board-specific return routine + simulates the 'rtc'. + + On MeP targets this causes the compiler to use a calling convention + that assumes the called function is too far away for the built-in + addressing modes. + +'fast_interrupt' + 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 'interrupt' attribute, except that 'freit' is used to return + instead of 'reit'. + +'fastcall' + On the Intel 386, the 'fastcall' attribute causes the compiler to + pass the first argument (if of integral type) in the register ECX + and the second argument (if of integral type) in the register EDX. + Subsequent and other typed arguments are passed on the stack. The + called function pops the arguments off the stack. If the number of + arguments is variable all arguments are pushed on the stack. + +'thiscall' + On the Intel 386, the 'thiscall' attribute causes the compiler to + pass the first argument (if of integral type) in the register ECX. + Subsequent and other typed arguments are passed on the stack. The + called function pops the arguments off the stack. If the number of + arguments is variable all arguments are pushed on the stack. The + 'thiscall' attribute is intended for C++ non-static member + functions. As a GCC extension, this calling convention can be used + for C functions and for static member methods. + +'format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)' + The 'format' attribute specifies that a function takes 'printf', + 'scanf', 'strftime' or 'strfmon' style arguments that should be + type-checked against a format string. For example, the + declaration: + + extern int + my_printf (void *my_object, const char *my_format, ...) + __attribute__ ((format (printf, 2, 3))); + + causes the compiler to check the arguments in calls to 'my_printf' + for consistency with the 'printf' style format string argument + 'my_format'. + + The parameter ARCHETYPE determines how the format string is + interpreted, and should be 'printf', 'scanf', 'strftime', + 'gnu_printf', 'gnu_scanf', 'gnu_strftime' or 'strfmon'. (You can + also use '__printf__', '__scanf__', '__strftime__' or + '__strfmon__'.) On MinGW targets, 'ms_printf', 'ms_scanf', and + 'ms_strftime' are also present. ARCHETYPE values such as 'printf' + refer to the formats accepted by the system's C runtime library, + while values prefixed with 'gnu_' always refer to the formats + accepted by the GNU C Library. On Microsoft Windows targets, + values prefixed with 'ms_' refer to the formats accepted by the + 'msvcrt.dll' library. The parameter STRING-INDEX specifies which + argument is the format string argument (starting from 1), while + FIRST-TO-CHECK is the number of the first argument to check against + the format string. For functions where the arguments are not + available to be checked (such as 'vprintf'), specify the third + parameter as zero. In this case the compiler only checks the + format string for consistency. For 'strftime' formats, the third + parameter is required to be zero. Since non-static C++ methods + have an implicit 'this' argument, the arguments of such methods + should be counted from two, not one, when giving values for + STRING-INDEX and FIRST-TO-CHECK. + + In the example above, the format string ('my_format') is the second + argument of the function 'my_print', and the arguments to check + start with the third argument, so the correct parameters for the + format attribute are 2 and 3. + + The 'format' attribute allows you to identify your own functions + that take format strings as arguments, so that GCC can check the + calls to these functions for errors. The compiler always (unless + '-ffreestanding' or '-fno-builtin' is used) checks formats for the + standard library functions 'printf', 'fprintf', 'sprintf', 'scanf', + 'fscanf', 'sscanf', 'strftime', 'vprintf', 'vfprintf' and + 'vsprintf' whenever such warnings are requested (using '-Wformat'), + so there is no need to modify the header file 'stdio.h'. In C99 + mode, the functions 'snprintf', 'vsnprintf', 'vscanf', 'vfscanf' + and 'vsscanf' are also checked. Except in strictly conforming C + standard modes, the X/Open function 'strfmon' is also checked as + are 'printf_unlocked' and 'fprintf_unlocked'. *Note Options + Controlling C Dialect: C Dialect Options. + + For Objective-C dialects, 'NSString' (or '__NSString__') is + recognized in the same context. Declarations including these + format attributes are parsed for correct syntax, however the result + of checking of such format strings is not yet defined, and is not + carried out by this version of the compiler. + + The target may also provide additional types of format checks. + *Note Format Checks Specific to Particular Target Machines: Target + Format Checks. + +'format_arg (STRING-INDEX)' + The 'format_arg' attribute specifies that a function takes a format + string for a 'printf', 'scanf', 'strftime' or 'strfmon' style + function and modifies it (for example, to translate it into another + language), so the result can be passed to a 'printf', 'scanf', + 'strftime' or 'strfmon' style function (with the remaining + arguments to the format function the same as they would have been + for the unmodified string). For example, the declaration: + + extern char * + my_dgettext (char *my_domain, const char *my_format) + __attribute__ ((format_arg (2))); + + causes the compiler to check the arguments in calls to a 'printf', + 'scanf', 'strftime' or 'strfmon' type function, whose format string + argument is a call to the 'my_dgettext' function, for consistency + with the format string argument 'my_format'. If the 'format_arg' + attribute had not been specified, all the compiler could tell in + such calls to format functions would be that the format string + argument is not constant; this would generate a warning when + '-Wformat-nonliteral' is used, but the calls could not be checked + without the attribute. + + The parameter STRING-INDEX specifies which argument is the format + string argument (starting from one). Since non-static C++ methods + have an implicit 'this' argument, the arguments of such methods + should be counted from two. + + The 'format_arg' attribute allows you to identify your own + functions that modify format strings, so that GCC can check the + calls to 'printf', 'scanf', 'strftime' or 'strfmon' type function + whose operands are a call to one of your own function. The + compiler always treats 'gettext', 'dgettext', and 'dcgettext' in + this manner except when strict ISO C support is requested by + '-ansi' or an appropriate '-std' option, or '-ffreestanding' or + '-fno-builtin' is used. *Note Options Controlling C Dialect: C + Dialect Options. + + For Objective-C dialects, the 'format-arg' attribute may refer to + an 'NSString' reference for compatibility with the 'format' + attribute above. + + The target may also allow additional types in 'format-arg' + attributes. *Note Format Checks Specific to Particular Target + Machines: Target Format Checks. + +'function_vector' + Use this attribute on the H8/300, H8/300H, and H8S to indicate that + the specified function should be called through the function + vector. Calling a function through the function vector reduces + code size, however; the function vector has a limited size (maximum + 128 entries on the H8/300 and 64 entries on the H8/300H and H8S) + and shares space with the interrupt vector. + + On SH2A targets, this attribute declares a function to be called + using the TBR relative addressing mode. The argument to this + attribute is the entry number of the same function in a vector + table containing all the TBR relative addressable functions. For + correct operation the TBR must be setup accordingly to point to the + start of the vector table before any functions with this attribute + are invoked. Usually a good place to do the initialization is the + startup routine. The TBR relative vector table can have at max 256 + function entries. The jumps to these functions are generated using + a SH2A specific, non delayed branch instruction JSR/N @(disp8,TBR). + You must use GAS and GLD from GNU binutils version 2.7 or later for + this attribute to work correctly. + + Please refer the example of M16C target, to see the use of this + attribute while declaring a function, + + In an application, for a function being called once, this attribute + saves at least 8 bytes of code; and if other successive calls are + being made to the same function, it saves 2 bytes of code per each + of these calls. + + On M16C/M32C targets, the 'function_vector' attribute declares a + special page subroutine call function. Use of this attribute + reduces the code size by 2 bytes for each call generated to the + subroutine. The argument to the attribute is the vector number + entry from the special page vector table which contains the 16 + low-order bits of the subroutine's entry address. Each vector + table has special page number (18 to 255) that is used in 'jsrs' + instructions. Jump addresses of the routines are generated by + adding 0x0F0000 (in case of M16C targets) or 0xFF0000 (in case of + M32C targets), to the 2-byte addresses set in the vector table. + Therefore you need to ensure that all the special page vector + routines should get mapped within the address range 0x0F0000 to + 0x0FFFFF (for M16C) and 0xFF0000 to 0xFFFFFF (for M32C). + + In the following example 2 bytes are saved for each call to + function 'foo'. + + void foo (void) __attribute__((function_vector(0x18))); + void foo (void) + { + } + + void bar (void) + { + foo(); + } + + If functions are defined in one file and are called in another + file, then be sure to write this declaration in both files. + + This attribute is ignored for R8C target. + +'ifunc ("RESOLVER")' + The 'ifunc' attribute is used to mark a function as an indirect + function using the STT_GNU_IFUNC symbol type extension to the ELF + standard. This allows the resolution of the symbol value to be + determined dynamically at load time, and an optimized version of + the routine can be selected for the particular processor or other + system characteristics determined then. To use this attribute, + first define the implementation functions available, and a resolver + function that returns a pointer to the selected implementation + function. The implementation functions' declarations must match + the API of the function being implemented, the resolver's + declaration is be a function returning pointer to void function + returning void: + + void *my_memcpy (void *dst, const void *src, size_t len) + { + ... + } + + static void (*resolve_memcpy (void)) (void) + { + return my_memcpy; // we'll just always select this routine + } + + The exported header file declaring the function the user calls + would contain: + + extern void *memcpy (void *, const void *, size_t); + + allowing the user to call this as a regular function, unaware of + the implementation. Finally, the indirect function needs to be + defined in the same translation unit as the resolver function: + + void *memcpy (void *, const void *, size_t) + __attribute__ ((ifunc ("resolve_memcpy"))); + + Indirect functions cannot be weak, and require a recent binutils + (at least version 2.20.1), and GNU C library (at least version + 2.11.1). + +'interrupt' + Use this attribute on the ARC, ARM, AVR, CR16, Epiphany, M32C, + M32R/D, m68k, MeP, MIPS, MSP430, RL78, RX and Xstormy16 ports to + indicate that the specified function is an interrupt handler. The + compiler generates function entry and exit sequences suitable for + use in an interrupt handler when this attribute is present. With + Epiphany targets it may also generate a special section with code + to initialize the interrupt vector table. + + Note, interrupt handlers for the Blackfin, H8/300, H8/300H, H8S, + MicroBlaze, and SH processors can be specified via the + 'interrupt_handler' attribute. + + Note, on the ARC, you must specify the kind of interrupt to be + handled in a parameter to the interrupt attribute like this: + + void f () __attribute__ ((interrupt ("ilink1"))); + + Permissible values for this parameter are: 'ilink1' and 'ilink2'. + + Note, on the AVR, the hardware globally disables interrupts when an + interrupt is executed. The first instruction of an interrupt + handler declared with this attribute is a 'SEI' instruction to + re-enable interrupts. See also the 'signal' function attribute + that does not insert a 'SEI' instruction. If both 'signal' and + 'interrupt' are specified for the same function, 'signal' is + silently ignored. + + Note, for the ARM, you can specify the kind of interrupt to be + handled by adding an optional parameter to the interrupt attribute + like this: + + void f () __attribute__ ((interrupt ("IRQ"))); + + 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. + + Note, for the MSP430 you can provide an argument to the interrupt + attribute which specifies a name or number. If the argument is a + number it indicates the slot in the interrupt vector table (0 - 31) + to which this handler should be assigned. If the argument is a + name it is treated as a symbolic name for the vector slot. These + names should match up with appropriate entries in the linker + script. By default the names 'watchdog' for vector 26, 'nmi' for + vector 30 and 'reset' for vector 31 are recognised. + + You can also use the following function attributes to modify how + normal functions interact with interrupt functions: + + 'critical' + Critical functions disable interrupts upon entry and restore + the previous interrupt state upon exit. Critical functions + cannot also have the 'naked' or 'reentrant' attributes. They + can have the 'interrupt' attribute. + + 'reentrant' + Reentrant functions disable interrupts upon entry and enable + them upon exit. Reentrant functions cannot also have the + 'naked' or 'critical' attributes. They can have the + 'interrupt' attribute. + + 'wakeup' + This attribute only applies to interrupt functions. It is + silently ignored if applied to a non-interrupt function. A + wakeup interrupt function will rouse the processor from any + low-power state that it might be in when the function exits. + + On Epiphany targets one or more optional parameters can be added + like this: + + void __attribute__ ((interrupt ("dma0, dma1"))) universal_dma_handler (); + + Permissible values for these parameters are: 'reset', + 'software_exception', 'page_miss', 'timer0', 'timer1', 'message', + 'dma0', 'dma1', 'wand' and 'swi'. Multiple parameters indicate + that multiple entries in the interrupt vector table should be + initialized for this function, i.e. for each parameter NAME, a jump + to the function is emitted in the section ivt_entry_NAME. The + parameter(s) may be omitted entirely, in which case no interrupt + vector table entry is provided. + + Note, on Epiphany targets, interrupts are enabled inside the + function unless the 'disinterrupt' attribute is also specified. + + On Epiphany targets, you can also use the following attribute to + modify the behavior of an interrupt handler: + 'forwarder_section' + The interrupt handler may be in external memory which cannot + be reached by a branch instruction, so generate a local memory + trampoline to transfer control. The single parameter + identifies the section where the trampoline is placed. + + The following examples are all valid uses of these attributes on + Epiphany targets: + void __attribute__ ((interrupt)) universal_handler (); + void __attribute__ ((interrupt ("dma1"))) dma1_handler (); + void __attribute__ ((interrupt ("dma0, dma1"))) universal_dma_handler (); + void __attribute__ ((interrupt ("timer0"), disinterrupt)) + fast_timer_handler (); + void __attribute__ ((interrupt ("dma0, dma1"), forwarder_section ("tramp"))) + external_dma_handler (); + + On MIPS targets, you can use the following attributes to modify the + behavior of an interrupt handler: + 'use_shadow_register_set' + Assume that the handler uses a shadow register set, instead of + the main general-purpose registers. + + 'keep_interrupts_masked' + Keep interrupts masked for the whole function. Without this + attribute, GCC tries to reenable interrupts for as much of the + function as it can. + + 'use_debug_exception_return' + Return using the 'deret' instruction. Interrupt handlers that + don't have this attribute return using 'eret' instead. + + You can use any combination of these attributes, as shown below: + 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 (); + + On NDS32 target, this attribute is to indicate that the specified + function is an interrupt handler. The compiler will generate + corresponding sections for use in an interrupt handler. You can + use the following attributes to modify the behavior: + 'nested' + This interrupt service routine is interruptible. + 'not_nested' + This interrupt service routine is not interruptible. + 'nested_ready' + This interrupt service routine is interruptible after + 'PSW.GIE' (global interrupt enable) is set. This allows + interrupt service routine to finish some short critical code + before enabling interrupts. + 'save_all' + The system will help save all registers into stack before + entering interrupt handler. + 'partial_save' + The system will help save caller registers into stack before + entering interrupt handler. + + On RL78, use 'brk_interrupt' instead of 'interrupt' for handlers + intended to be used with the 'BRK' opcode (i.e. those that must end + with 'RETB' instead of 'RETI'). + +'interrupt_handler' + Use this attribute on the Blackfin, m68k, H8/300, H8/300H, H8S, and + SH to indicate that the specified function is an interrupt handler. + The compiler generates function entry and exit sequences suitable + for use in an interrupt handler when this attribute is present. + +'interrupt_thread' + Use this attribute on fido, a subarchitecture of the m68k, to + indicate that the specified function is an interrupt handler that + is designed to run as a thread. The compiler omits generate + prologue/epilogue sequences and replaces the return instruction + with a 'sleep' instruction. This attribute is available only on + fido. + +'isr' + Use this attribute on ARM to write Interrupt Service Routines. + This is an alias to the 'interrupt' attribute above. + +'kspisusp' + When used together with 'interrupt_handler', 'exception_handler' or + 'nmi_handler', code is generated to load the stack pointer from the + USP register in the function prologue. + +'l1_text' + This attribute specifies a function to be placed into L1 + Instruction SRAM. The function is put into a specific section + named '.l1.text'. With '-mfdpic', function calls with a such + function as the callee or caller uses inlined PLT. + +'l2' + On the Blackfin, this attribute specifies a function to be placed + into L2 SRAM. The function is put into a specific section named + '.l1.text'. With '-mfdpic', callers of such functions use an + inlined PLT. + +'leaf' + Calls to external functions with this attribute must return to the + current compilation unit only by return or by exception handling. + In particular, leaf functions are not allowed to call callback + function passed to it from the current compilation unit or directly + call functions exported by the unit or longjmp into the unit. Leaf + function might still call functions from other compilation units + and thus they are not necessarily leaf in the sense that they + contain no function calls at all. + + The attribute is intended for library functions to improve dataflow + analysis. The compiler takes the hint that any data not escaping + the current compilation unit can not be used or modified by the + leaf function. For example, the 'sin' function is a leaf function, + but 'qsort' is not. + + Note that leaf functions might invoke signals and signal handlers + might be defined in the current compilation unit and use static + variables. The only compliant way to write such a signal handler + is to declare such variables 'volatile'. + + The attribute has no effect on functions defined within the current + compilation unit. This is to allow easy merging of multiple + compilation units into one, for example, by using the link-time + optimization. For this reason the attribute is not allowed on + types to annotate indirect calls. + +'long_call/medium_call/short_call' + These attributes specify how a particular function is called on + ARC, ARM and Epiphany - with 'medium_call' being specific to ARC. + These attributes override the '-mlong-calls' (*note ARM Options:: + and *note ARC Options::) and '-mmedium-calls' (*note ARC Options::) + command-line switches and '#pragma long_calls' settings. For ARM, + the 'long_call' attribute indicates that the function might be far + away from the call site and require a different (more expensive) + calling sequence. The 'short_call' attribute always places the + offset to the function from the call site into the 'BL' instruction + directly. + + For ARC, a function marked with the 'long_call' attribute is always + called using register-indirect jump-and-link instructions, thereby + enabling the called function to be placed anywhere within the + 32-bit address space. A function marked with the 'medium_call' + attribute will always be close enough to be called with an + unconditional branch-and-link instruction, which has a 25-bit + offset from the call site. A function marked with the 'short_call' + attribute will always be close enough to be called with a + conditional branch-and-link instruction, which has a 21-bit offset + from the call site. + +'longcall/shortcall' + On the Blackfin, RS/6000 and PowerPC, 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, on the + RS/6000 and PowerPC, the '#pragma longcall' setting. + + *Note RS/6000 and PowerPC Options::, for more information on + whether long calls are necessary. + +'long_call/near/far' + These attributes specify how a particular function is called on + MIPS. The attributes override the '-mlong-calls' (*note MIPS + Options::) command-line switch. The 'long_call' and 'far' + attributes are synonyms, and cause the compiler to always call the + function by first loading its address into a register, and then + using the contents of that register. The 'near' attribute has the + opposite effect; it specifies that non-PIC calls should be made + using the more efficient 'jal' instruction. + +'malloc' + The 'malloc' attribute is used to tell the compiler that a function + may be treated as if any non-'NULL' pointer it returns cannot alias + any other pointer valid when the function returns and that the + memory has undefined content. This often improves optimization. + Standard functions with this property include 'malloc' and + 'calloc'. 'realloc'-like functions do not have this property as + the memory pointed to does not have undefined content. + +'mips16/nomips16' + + On MIPS targets, you can use the 'mips16' and 'nomips16' function + attributes to locally select or turn off MIPS16 code generation. A + function with the 'mips16' attribute is emitted as MIPS16 code, + while MIPS16 code generation is disabled for functions with the + 'nomips16' attribute. These attributes override the '-mips16' and + '-mno-mips16' options on the command line (*note MIPS Options::). + + When compiling files containing mixed MIPS16 and non-MIPS16 code, + the preprocessor symbol '__mips16' reflects the setting on the + command line, not that within individual functions. Mixed MIPS16 + and non-MIPS16 code may interact badly with some GCC extensions + such as '__builtin_apply' (*note Constructing Calls::). + +'micromips/nomicromips' + + On MIPS targets, you can use the 'micromips' and 'nomicromips' + function attributes to locally select or turn off microMIPS code + generation. A function with the 'micromips' attribute is emitted + as microMIPS code, while microMIPS code generation is disabled for + functions with the 'nomicromips' attribute. These attributes + override the '-mmicromips' and '-mno-micromips' options on the + command line (*note MIPS Options::). + + When compiling files containing mixed microMIPS and non-microMIPS + code, the preprocessor symbol '__mips_micromips' reflects the + setting on the command line, not that within individual functions. + Mixed microMIPS and non-microMIPS code may interact badly with some + GCC extensions such as '__builtin_apply' (*note Constructing + Calls::). + +'model (MODEL-NAME)' + + On the M32R/D, use this attribute to set the addressability of an + object, and of the code generated for a function. The identifier + MODEL-NAME is one of 'small', 'medium', or 'large', representing + each of the code models. + + Small model objects live in the lower 16MB of memory (so that their + addresses can be loaded with the 'ld24' instruction), and are + callable with the 'bl' instruction. + + Medium model objects may live anywhere in the 32-bit address space + (the compiler generates 'seth/add3' instructions to load their + addresses), and are callable with the 'bl' instruction. + + Large model objects may live anywhere in the 32-bit address space + (the compiler generates 'seth/add3' instructions to load their + addresses), and may not be reachable with the 'bl' instruction (the + compiler generates the much slower 'seth/add3/jl' instruction + sequence). + + On IA-64, use this attribute to set the addressability of an + object. At present, the only supported identifier for MODEL-NAME + is 'small', indicating addressability via "small" (22-bit) + addresses (so that their addresses can be loaded with the 'addl' + instruction). Caveat: such addressing is by definition not + position independent and hence this attribute must not be used for + objects defined by shared libraries. + +'ms_abi/sysv_abi' + + On 32-bit and 64-bit (i?86|x86_64)-*-* targets, you can use an ABI + attribute to indicate which calling convention should be used for a + function. The 'ms_abi' attribute tells the compiler to use the + Microsoft ABI, while the 'sysv_abi' attribute tells the compiler to + use the ABI used on GNU/Linux and other systems. The default is to + use the Microsoft ABI when targeting Windows. On all other + systems, the default is the x86/AMD ABI. + + Note, the 'ms_abi' attribute for Microsoft Windows 64-bit targets + currently requires the '-maccumulate-outgoing-args' option. + +'callee_pop_aggregate_return (NUMBER)' + + On 32-bit i?86-*-* targets, you can use this attribute to control + how aggregates are returned in memory. If the caller is + responsible for popping the hidden pointer together with the rest + of the arguments, specify NUMBER equal to zero. If callee is + responsible for popping the hidden pointer, specify NUMBER equal to + one. + + The default i386 ABI assumes that the callee pops the stack for + hidden pointer. However, on 32-bit i386 Microsoft Windows targets, + the compiler assumes that the caller pops the stack for hidden + pointer. + +'ms_hook_prologue' + + On 32-bit i[34567]86-*-* targets and 64-bit x86_64-*-* 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. + +'hotpatch [(PROLOGUE-HALFWORDS)]' + + On S/390 System z targets, you can use this function attribute to + make GCC generate a "hot-patching" function prologue. The + 'hotpatch' has no effect on funtions that are explicitly inline. + If the '-mhotpatch' or '-mno-hotpatch' command-line option is used + at the same time, the 'hotpatch' attribute takes precedence. If an + argument is given, the maximum allowed value is 1000000. + +'naked' + Use this attribute on the ARM, AVR, MCORE, MSP430, NDS32, RL78, 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 'asm' statements + that do not have operands. All other statements, including + declarations of local variables, 'if' statements, and so forth, + should be avoided. Naked functions should be used to implement the + body of an assembly function, while allowing the compiler to + construct the requisite function declaration for the assembler. + +'near' + On 68HC11 and 68HC12 the 'near' attribute causes the compiler to + use the normal calling convention based on 'jsr' and 'rts'. This + attribute can be used to cancel the effect of the '-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 '-mtf' command-line option. + +'nesting' + Use this attribute together with 'interrupt_handler', + 'exception_handler' or 'nmi_handler' to indicate that the function + entry code should enable nested interrupts or exceptions. + +'nmi_handler' + Use this attribute on the Blackfin to indicate that the specified + function is an NMI handler. The compiler generates function entry + and exit sequences suitable for use in an NMI handler when this + attribute is present. + +'nocompression' + On MIPS targets, you can use the 'nocompression' function attribute + to locally turn off MIPS16 and microMIPS code generation. This + attribute overrides the '-mips16' and '-mmicromips' options on the + command line (*note MIPS Options::). + +'no_instrument_function' + If '-finstrument-functions' is given, profiling function calls are + generated at entry and exit of most user-compiled functions. + Functions with this attribute are not so instrumented. + +'no_split_stack' + If '-fsplit-stack' is given, functions have a small prologue which + decides whether to split the stack. Functions with the + 'no_split_stack' attribute do not have that prologue, and thus may + run with only a small amount of stack space available. + +'noinline' + This function attribute prevents a function from being considered + for inlining. If the function does not have side-effects, there + are optimizations other than inlining that cause function calls to + be optimized away, although the function call is live. To keep + such calls from being optimized away, put + asm (""); + + (*note Extended Asm::) in the called function, to serve as a + special side-effect. + +'noclone' + This function attribute prevents a function from being considered + for cloning--a mechanism that produces specialized copies of + functions and which is (currently) performed by interprocedural + constant propagation. + +'nonnull (ARG-INDEX, ...)' + The 'nonnull' attribute specifies that some function parameters + should be non-null pointers. For instance, the declaration: + + extern void * + my_memcpy (void *dest, const void *src, size_t len) + __attribute__((nonnull (1, 2))); + + causes the compiler to check that, in calls to 'my_memcpy', + arguments DEST and SRC are non-null. If the compiler determines + that a null pointer is passed in an argument slot marked as + non-null, and the '-Wnonnull' option is enabled, a warning is + issued. The compiler may also choose to make optimizations based + on the knowledge that certain function arguments will never be + null. + + If no argument index list is given to the 'nonnull' attribute, all + pointer arguments are marked as non-null. To illustrate, the + following declaration is equivalent to the previous example: + + extern void * + my_memcpy (void *dest, const void *src, size_t len) + __attribute__((nonnull)); + +'returns_nonnull' + The 'returns_nonnull' attribute specifies that the function return + value should be a non-null pointer. For instance, the declaration: + + extern void * + mymalloc (size_t len) __attribute__((returns_nonnull)); + + lets the compiler optimize callers based on the knowledge that the + return value will never be null. + +'noreturn' + A few standard library functions, such as 'abort' and 'exit', + cannot return. GCC knows this automatically. Some programs define + their own functions that never return. You can declare them + 'noreturn' to tell the compiler this fact. For example, + + void fatal () __attribute__ ((noreturn)); + + void + fatal (/* ... */) + { + /* ... */ /* Print error message. */ /* ... */ + exit (1); + } + + The 'noreturn' keyword tells the compiler to assume that 'fatal' + cannot return. It can then optimize without regard to what would + happen if 'fatal' ever did return. This makes slightly better + code. More importantly, it helps avoid spurious warnings of + uninitialized variables. + + The 'noreturn' keyword does not affect the exceptional path when + that applies: a 'noreturn'-marked function may still return to the + caller by throwing an exception or calling 'longjmp'. + + Do not assume that registers saved by the calling function are + restored before calling the 'noreturn' function. + + It does not make sense for a 'noreturn' function to have a return + type other than 'void'. + + The attribute 'noreturn' is not implemented in GCC versions earlier + than 2.5. An alternative way to declare that a function does not + return, which works in the current version and in some older + versions, is as follows: + + typedef void voidfn (); + + volatile voidfn fatal; + + This approach does not work in GNU C++. + +'nothrow' + The 'nothrow' attribute is used to inform the compiler that a + function cannot throw an exception. For example, most functions in + the standard C library can be guaranteed not to throw an exception + with the notable exceptions of 'qsort' and 'bsearch' that take + function pointer arguments. The 'nothrow' attribute is not + implemented in GCC versions earlier than 3.3. + +'nosave_low_regs' + Use this attribute on SH targets to indicate that an + 'interrupt_handler' function should not save and restore registers + R0..R7. This can be used on SH3* and SH4* targets that have a + second R0..R7 register bank for non-reentrant interrupt handlers. + +'optimize' + The 'optimize' attribute is used to specify that a function is to + be compiled with different optimization options than specified on + the command line. Arguments can either be numbers or strings. + Numbers are assumed to be an optimization level. Strings that + begin with 'O' are assumed to be an optimization option, while + other options are assumed to be used with a '-f' prefix. You can + also use the '#pragma GCC optimize' pragma to set the optimization + options that affect more than one function. *Note Function + Specific Option Pragmas::, for details about the '#pragma GCC + optimize' pragma. + + This can be used for instance to have frequently-executed functions + compiled with more aggressive optimization options that produce + faster and larger code, while other functions can be compiled with + less aggressive options. + +'OS_main/OS_task' + On AVR, functions with the 'OS_main' or 'OS_task' attribute do not + save/restore any call-saved register in their prologue/epilogue. + + The 'OS_main' attribute can be used when there _is guarantee_ that + interrupts are disabled at the time when the function is entered. + This saves resources when the stack pointer has to be changed to + set up a frame for local variables. + + The 'OS_task' attribute can be used when there is _no guarantee_ + that interrupts are disabled at that time when the function is + entered like for, e.g. task functions in a multi-threading + operating system. In that case, changing the stack pointer + register is guarded by save/clear/restore of the global interrupt + enable flag. + + The differences to the 'naked' function attribute are: + * 'naked' functions do not have a return instruction whereas + 'OS_main' and 'OS_task' functions have a 'RET' or 'RETI' + return instruction. + * 'naked' functions do not set up a frame for local variables or + a frame pointer whereas 'OS_main' and 'OS_task' do this as + needed. + +'pcs' + + The '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 it) then valid + values for the argument are '"aapcs"' and '"aapcs-vfp"'. In order + to use a variant other than '"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 '"aapcs-vfp"'). + For example, + + /* Argument passed in r0, and result returned in r0+r1. */ + double f2d (float) __attribute__((pcs("aapcs"))); + + Variadic functions always use the '"aapcs"' calling convention and + the compiler rejects attempts to specify an alternative. + +'pure' + Many functions have no effects except the return value and their + return value depends only on the parameters and/or global + variables. Such a function can be subject to common subexpression + elimination and loop optimization just as an arithmetic operator + would be. These functions should be declared with the attribute + 'pure'. For example, + + int square (int) __attribute__ ((pure)); + + says that the hypothetical function 'square' is safe to call fewer + times than the program says. + + Some of common examples of pure functions are 'strlen' or 'memcmp'. + Interesting non-pure functions are functions with infinite loops or + those depending on volatile memory or other system resource, that + may change between two consecutive calls (such as 'feof' in a + multithreading environment). + + The attribute 'pure' is not implemented in GCC versions earlier + than 2.96. + +'hot' + The 'hot' attribute on a function is used to inform the compiler + that the function is a hot spot of the compiled program. The + function is optimized more aggressively and on many target it is + placed into special subsection of the text section so all hot + functions appears close together improving locality. + + When profile feedback is available, via '-fprofile-use', hot + functions are automatically detected and this attribute is ignored. + + The 'hot' attribute on functions is not implemented in GCC versions + earlier than 4.3. + + The 'hot' attribute on a label is used to inform the compiler that + path following the label are more likely than paths that are not so + annotated. This attribute is used in cases where + '__builtin_expect' cannot be used, for instance with computed goto + or 'asm goto'. + + The 'hot' attribute on labels is not implemented in GCC versions + earlier than 4.8. + +'cold' + The 'cold' attribute on functions is used to inform the compiler + that the function is unlikely to be executed. The function is + optimized for size rather than speed and on many targets it is + placed into special subsection of the text section so all cold + functions appears close together improving code locality of + non-cold parts of program. The paths leading to call of cold + functions within code are marked as unlikely by the branch + prediction mechanism. It is thus useful to mark functions used to + handle unlikely conditions, such as 'perror', as cold to improve + optimization of hot functions that do call marked functions in rare + occasions. + + When profile feedback is available, via '-fprofile-use', cold + functions are automatically detected and this attribute is ignored. + + The 'cold' attribute on functions is not implemented in GCC + versions earlier than 4.3. + + The 'cold' attribute on labels is used to inform the compiler that + the path following the label is unlikely to be executed. This + attribute is used in cases where '__builtin_expect' cannot be used, + for instance with computed goto or 'asm goto'. + + The 'cold' attribute on labels is not implemented in GCC versions + earlier than 4.8. + +'no_sanitize_address' +'no_address_safety_analysis' + The 'no_sanitize_address' attribute on functions is used to inform + the compiler that it should not instrument memory accesses in the + function when compiling with the '-fsanitize=address' option. The + 'no_address_safety_analysis' is a deprecated alias of the + 'no_sanitize_address' attribute, new code should use + 'no_sanitize_address'. + +'no_sanitize_undefined' + The 'no_sanitize_undefined' attribute on functions is used to + inform the compiler that it should not check for undefined behavior + in the function when compiling with the '-fsanitize=undefined' + option. + +'regparm (NUMBER)' + On the Intel 386, the 'regparm' attribute causes the compiler to + pass arguments number one to NUMBER if they are of integral type in + registers EAX, EDX, and ECX instead of on the stack. Functions + that take a variable number of arguments continue to be passed all + of their arguments on the stack. + + Beware that on some ELF systems this attribute is unsuitable for + global functions in shared libraries with lazy binding (which is + the default). Lazy binding sends the first call via resolving code + in the loader, which might assume EAX, EDX and ECX can be + clobbered, as per the standard calling conventions. Solaris 8 is + affected by this. Systems with the GNU C Library version 2.1 or + higher and FreeBSD are believed to be safe since the loaders there + save EAX, EDX and ECX. (Lazy binding can be disabled with the + linker or the loader if desired, to avoid the problem.) + +'reset' + Use this attribute on the NDS32 target to indicate that the + specified function is a reset handler. The compiler will generate + corresponding sections for use in a reset handler. You can use the + following attributes to provide extra exception handling: + 'nmi' + Provide a user-defined function to handle NMI exception. + 'warm' + Provide a user-defined function to handle warm reset + exception. + +'sseregparm' + On the Intel 386 with SSE support, the 'sseregparm' attribute + causes the compiler to pass up to 3 floating-point arguments in SSE + registers instead of on the stack. Functions that take a variable + number of arguments continue to pass all of their floating-point + arguments on the stack. + +'force_align_arg_pointer' + On the Intel x86, the 'force_align_arg_pointer' attribute may be + applied to individual function definitions, generating an alternate + prologue and epilogue that realigns the run-time stack if + necessary. This supports mixing legacy codes that run with a + 4-byte aligned stack with modern codes that keep a 16-byte stack + for SSE compatibility. + +'renesas' + On SH targets this attribute specifies that the function or struct + follows the Renesas ABI. + +'resbank' + On the SH2A target, this attribute enables the high-speed register + saving and restoration using a register bank for + 'interrupt_handler' routines. Saving to the bank is performed + automatically after the CPU accepts an interrupt that uses a + register bank. + + The nineteen 32-bit registers comprising general register R0 to + R14, control register GBR, and system registers MACH, MACL, and PR + and the vector table address offset are saved into a register bank. + Register banks are stacked in first-in last-out (FILO) sequence. + Restoration from the bank is executed by issuing a RESBANK + instruction. + +'returns_twice' + The 'returns_twice' attribute tells the compiler that a function + may return more than one time. The compiler ensures that all + registers are dead before calling such a function and emits a + warning about the variables that may be clobbered after the second + return from the function. Examples of such functions are 'setjmp' + and 'vfork'. The 'longjmp'-like counterpart of such function, if + any, might need to be marked with the 'noreturn' attribute. + +'saveall' + Use this attribute on the Blackfin, H8/300, H8/300H, and H8S to + indicate that all registers except the stack pointer should be + saved in the prologue regardless of whether they are used or not. + +'save_volatiles' + Use this attribute on the MicroBlaze to indicate that the function + is an interrupt handler. All volatile registers (in addition to + non-volatile registers) are saved in the function prologue. If the + function is a leaf function, only volatiles used by the function + are saved. A normal function return is generated instead of a + return from interrupt. + +'section ("SECTION-NAME")' + Normally, the compiler places the code it generates in the 'text' + section. Sometimes, however, you need additional sections, or you + need certain particular functions to appear in special sections. + The 'section' attribute specifies that a function lives in a + particular section. For example, the declaration: + + extern void foobar (void) __attribute__ ((section ("bar"))); + + puts the function 'foobar' in the 'bar' section. + + Some file formats do not support arbitrary sections so the + 'section' attribute is not available on all platforms. If you need + to map the entire contents of a module to a particular section, + consider using the facilities of the linker instead. + +'sentinel' + This function attribute ensures that a parameter in a function call + is an explicit 'NULL'. The attribute is only valid on variadic + functions. By default, the sentinel is located at position zero, + the last parameter of the function call. If an optional integer + position argument P is supplied to the attribute, the sentinel must + be located at position P counting backwards from the end of the + argument list. + + __attribute__ ((sentinel)) + is equivalent to + __attribute__ ((sentinel(0))) + + The attribute is automatically set with a position of 0 for the + built-in functions 'execl' and 'execlp'. The built-in function + 'execle' has the attribute set with a position of 1. + + A valid 'NULL' in this context is defined as zero with any pointer + type. If your system defines the 'NULL' macro with an integer type + then you need to add an explicit cast. GCC replaces 'stddef.h' + with a copy that redefines NULL appropriately. + + The warnings for missing or incorrect sentinels are enabled with + '-Wformat'. + +'short_call' + See 'long_call/short_call'. + +'shortcall' + See 'longcall/shortcall'. + +'signal' + Use this attribute on the AVR to indicate that the specified + function is an interrupt handler. The compiler generates function + entry and exit sequences suitable for use in an interrupt handler + when this attribute is present. + + See also the 'interrupt' function attribute. + + The AVR hardware globally disables interrupts when an interrupt is + executed. Interrupt handler functions defined with the 'signal' + attribute do not re-enable interrupts. It is save to enable + interrupts in a 'signal' handler. This "save" only applies to the + code generated by the compiler and not to the IRQ layout of the + application which is responsibility of the application. + + If both 'signal' and 'interrupt' are specified for the same + function, 'signal' is silently ignored. + +'sp_switch' + Use this attribute on the SH to indicate an 'interrupt_handler' + function should switch to an alternate stack. It expects a string + argument that names a global variable holding the address of the + alternate stack. + + void *alt_stack; + void f () __attribute__ ((interrupt_handler, + sp_switch ("alt_stack"))); + +'stdcall' + On the Intel 386, the 'stdcall' attribute causes the compiler to + assume that the called function pops off the stack space used to + pass arguments, unless it takes a variable number of arguments. + +'syscall_linkage' + This attribute is used to modify the IA-64 calling convention by + marking all input registers as live at all function exits. This + makes it possible to restart a system call after an interrupt + without having to save/restore the input registers. This also + prevents kernel data from leaking into application code. + +'target' + The 'target' attribute is used to specify that a function is to be + compiled with different target options than specified on the + command line. This can be used for instance to have functions + compiled with a different ISA (instruction set architecture) than + the default. You can also use the '#pragma GCC target' pragma to + set more than one function to be compiled with specific target + options. *Note Function Specific Option Pragmas::, for details + about the '#pragma GCC target' pragma. + + For instance on a 386, you could compile one function with + 'target("sse4.1,arch=core2")' and another with + 'target("sse4a,arch=amdfam10")'. This is equivalent to compiling + the first function with '-msse4.1' and '-march=core2' options, and + the second function with '-msse4a' and '-march=amdfam10' options. + It is up to the user to make sure that a function is only invoked + on a machine that supports the particular ISA it is compiled for + (for example by using 'cpuid' on 386 to determine what feature bits + and architecture family are used). + + int core2_func (void) __attribute__ ((__target__ ("arch=core2"))); + int sse3_func (void) __attribute__ ((__target__ ("sse3"))); + + You can either use multiple strings to specify multiple options, or + separate the options with a comma (','). + + The 'target' attribute is presently implemented for i386/x86_64, + PowerPC, and Nios II targets only. The options supported are + specific to each target. + + On the 386, the following options are allowed: + + 'abm' + 'no-abm' + Enable/disable the generation of the advanced bit + instructions. + + 'aes' + 'no-aes' + Enable/disable the generation of the AES instructions. + + 'default' + *Note Function Multiversioning::, where it is used to specify + the default function version. + + 'mmx' + 'no-mmx' + Enable/disable the generation of the MMX instructions. + + 'pclmul' + 'no-pclmul' + Enable/disable the generation of the PCLMUL instructions. + + 'popcnt' + 'no-popcnt' + Enable/disable the generation of the POPCNT instruction. + + 'sse' + 'no-sse' + Enable/disable the generation of the SSE instructions. + + 'sse2' + 'no-sse2' + Enable/disable the generation of the SSE2 instructions. + + 'sse3' + 'no-sse3' + Enable/disable the generation of the SSE3 instructions. + + 'sse4' + 'no-sse4' + Enable/disable the generation of the SSE4 instructions (both + SSE4.1 and SSE4.2). + + 'sse4.1' + 'no-sse4.1' + Enable/disable the generation of the sse4.1 instructions. + + 'sse4.2' + 'no-sse4.2' + Enable/disable the generation of the sse4.2 instructions. + + 'sse4a' + 'no-sse4a' + Enable/disable the generation of the SSE4A instructions. + + 'fma4' + 'no-fma4' + Enable/disable the generation of the FMA4 instructions. + + 'xop' + 'no-xop' + Enable/disable the generation of the XOP instructions. + + 'lwp' + 'no-lwp' + Enable/disable the generation of the LWP instructions. + + 'ssse3' + 'no-ssse3' + Enable/disable the generation of the SSSE3 instructions. + + 'cld' + 'no-cld' + Enable/disable the generation of the CLD before string moves. + + 'fancy-math-387' + 'no-fancy-math-387' + Enable/disable the generation of the 'sin', 'cos', and 'sqrt' + instructions on the 387 floating-point unit. + + 'fused-madd' + 'no-fused-madd' + Enable/disable the generation of the fused multiply/add + instructions. + + 'ieee-fp' + 'no-ieee-fp' + Enable/disable the generation of floating point that depends + on IEEE arithmetic. + + 'inline-all-stringops' + 'no-inline-all-stringops' + Enable/disable inlining of string operations. + + 'inline-stringops-dynamically' + 'no-inline-stringops-dynamically' + Enable/disable the generation of the inline code to do small + string operations and calling the library routines for large + operations. + + 'align-stringops' + 'no-align-stringops' + Do/do not align destination of inlined string operations. + + 'recip' + 'no-recip' + Enable/disable the generation of RCPSS, RCPPS, RSQRTSS and + RSQRTPS instructions followed an additional Newton-Raphson + step instead of doing a floating-point division. + + 'arch=ARCH' + Specify the architecture to generate code for in compiling the + function. + + 'tune=TUNE' + Specify the architecture to tune for in compiling the + function. + + 'fpmath=FPMATH' + Specify which floating-point unit to use. The + 'target("fpmath=sse,387")' option must be specified as + 'target("fpmath=sse+387")' because the comma would separate + different 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. + + When compiling for Nios II, the following options are allowed: + + 'custom-INSN=N' + 'no-custom-INSN' + Each 'custom-INSN=N' attribute locally enables use of a custom + instruction with encoding N when generating code that uses + INSN. Similarly, 'no-custom-INSN' locally inhibits use of the + custom instruction INSN. These target attributes correspond + to the '-mcustom-INSN=N' and '-mno-custom-INSN' command-line + options, and support the same set of INSN keywords. *Note + Nios II Options::, for more information. + + 'custom-fpu-cfg=NAME' + This attribute corresponds to the '-mcustom-fpu-cfg=NAME' + command-line option, to select a predefined set of custom + instructions named NAME. *Note Nios II Options::, for more + information. + + On the 386/x86_64 and PowerPC back ends, 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. For example a function declared with 'target("sse3")' can + inline a function with 'target("sse2")', since '-msse3' implies + '-msse2'. + +'tiny_data' + Use this attribute on the H8/300H and H8S to indicate that the + specified variable should be placed into the tiny data section. + The compiler generates more efficient code for loads and stores on + data in the tiny data section. Note the tiny data area is limited + to slightly under 32KB of data. + +'trap_exit' + Use this attribute on the SH for an 'interrupt_handler' to return + using 'trapa' instead of 'rte'. This attribute expects an integer + argument specifying the trap number to be used. + +'trapa_handler' + On SH targets this function attribute is similar to + 'interrupt_handler' but it does not save and restore all registers. + +'unused' + This attribute, attached to a function, means that the function is + meant to be possibly unused. GCC does not produce a warning for + this function. + +'used' + This attribute, attached to a function, means that code must be + emitted for the function even if it appears that the function is + not referenced. This is useful, for example, when the function is + referenced only in inline assembly. + + When applied to a member function of a C++ class template, the + attribute also means that the function is instantiated if the class + itself is instantiated. + +'version_id' + This IA-64 HP-UX attribute, attached to a global variable or + function, renames a symbol to contain a version string, thus + allowing for function level versioning. HP-UX system header files + may use function level versioning for some system calls. + + extern int foo () __attribute__((version_id ("20040821"))); + + Calls to FOO are mapped to calls to FOO{20040821}. + +'visibility ("VISIBILITY_TYPE")' + This attribute affects the linkage of the declaration to which it + is attached. There are four supported VISIBILITY_TYPE values: + default, hidden, protected or internal visibility. + + void __attribute__ ((visibility ("protected"))) + f () { /* Do something. */; } + int i __attribute__ ((visibility ("hidden"))); + + The possible values of VISIBILITY_TYPE correspond to the visibility + settings in the ELF gABI. + + "default" + Default visibility is the normal case for the object file + format. This value is available for the visibility attribute + to override other options that may change the assumed + visibility of entities. + + On ELF, default visibility means that the declaration is + visible to other modules and, in shared libraries, means that + the declared entity may be overridden. + + On Darwin, default visibility means that the declaration is + visible to other modules. + + Default visibility corresponds to "external linkage" in the + language. + + "hidden" + Hidden visibility indicates that the entity declared has a new + form of linkage, which we call "hidden linkage". Two + declarations of an object with hidden linkage refer to the + same object if they are in the same shared object. + + "internal" + Internal visibility is like hidden visibility, but with + additional processor specific semantics. Unless otherwise + specified by the psABI, GCC defines internal visibility to + mean that a function is _never_ called from another module. + Compare this with hidden functions which, while they cannot be + referenced directly by other modules, can be referenced + indirectly via function pointers. By indicating that a + function cannot be called from outside the module, GCC may for + instance omit the load of a PIC register since it is known + that the calling function loaded the correct value. + + "protected" + Protected visibility is like default visibility except that it + indicates that references within the defining module bind to + the definition in that module. That is, the declared entity + cannot be overridden by another module. + + All visibilities are supported on many, but not all, ELF targets + (supported when the assembler supports the '.visibility' + pseudo-op). Default visibility is supported everywhere. Hidden + visibility is supported on Darwin targets. + + The visibility attribute should be applied only to declarations + that would otherwise have external linkage. The attribute should + be applied consistently, so that the same entity should not be + declared with different settings of the attribute. + + In C++, the visibility attribute applies to types as well as + functions and objects, because in C++ types have linkage. A class + must not have greater visibility than its non-static data member + types and bases, and class members default to the visibility of + their class. Also, a declaration without explicit visibility is + limited to the visibility of its type. + + In C++, you can mark member functions and static member variables + of a class with the visibility attribute. This is useful if you + know a particular method or static member variable should only be + used from one shared object; then you can mark it hidden while the + rest of the class has default visibility. Care must be taken to + avoid breaking the One Definition Rule; for example, it is usually + not useful to mark an inline method as hidden without marking the + whole class as hidden. + + A C++ namespace declaration can also have the visibility attribute. + + namespace nspace1 __attribute__ ((visibility ("protected"))) + { /* Do something. */; } + + This attribute applies only to the particular namespace body, not + to other definitions of the same namespace; it is equivalent to + using '#pragma GCC visibility' before and after the namespace + definition (*note Visibility Pragmas::). + + In C++, if a template argument has limited visibility, this + restriction is implicitly propagated to the template instantiation. + Otherwise, template instantiations and specializations default to + the visibility of their template. + + If both the template and enclosing class have explicit visibility, + the visibility from the template is used. + +'vliw' + On MeP, the '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. + +'warn_unused_result' + The 'warn_unused_result' attribute causes a warning to be emitted + if a caller of the function with this attribute does not use its + return value. This is useful for functions where not checking the + result is either a security problem or always a bug, such as + 'realloc'. + + int fn () __attribute__ ((warn_unused_result)); + int foo () + { + if (fn () < 0) return -1; + fn (); + return 0; + } + + results in warning on line 5. + +'weak' + The 'weak' attribute causes the declaration to be emitted as a weak + symbol rather than a global. This is primarily useful in defining + library functions that can be overridden in user code, though it + can also be used with non-function declarations. Weak symbols are + supported for ELF targets, and also for a.out targets when using + the GNU assembler and linker. + +'weakref' +'weakref ("TARGET")' + The 'weakref' attribute marks a declaration as a weak reference. + Without arguments, it should be accompanied by an 'alias' attribute + naming the target symbol. Optionally, the TARGET may be given as + an argument to 'weakref' itself. In either case, 'weakref' + implicitly marks the declaration as 'weak'. Without a TARGET, + given as an argument to 'weakref' or to 'alias', 'weakref' is + equivalent to 'weak'. + + static int x() __attribute__ ((weakref ("y"))); + /* is equivalent to... */ + static int x() __attribute__ ((weak, weakref, alias ("y"))); + /* and to... */ + static int x() __attribute__ ((weakref)); + static int x() __attribute__ ((alias ("y"))); + + A weak reference is an alias that does not by itself require a + definition to be given for the target symbol. If the target symbol + is only referenced through weak references, then it becomes a + 'weak' undefined symbol. If it is directly referenced, however, + then such strong references prevail, and a definition is required + for the symbol, not necessarily in the same translation unit. + + The effect is equivalent to moving all references to the alias to a + separate translation unit, renaming the alias to the aliased + symbol, declaring it as weak, compiling the two separate + translation units and performing a reloadable link on them. + + At present, a declaration to which 'weakref' is attached can only + be 'static'. + + You can specify multiple attributes in a declaration by separating them +by commas within the double parentheses or by immediately following an +attribute declaration with another attribute declaration. + + Some people object to the '__attribute__' feature, suggesting that ISO +C's '#pragma' should be used instead. At the time '__attribute__' was +designed, there were two reasons for not doing this. + + 1. It is impossible to generate '#pragma' commands from a macro. + + 2. There is no telling what the same '#pragma' might mean in another + compiler. + + These two reasons applied to almost any application that might have +been proposed for '#pragma'. It was basically a mistake to use +'#pragma' for _anything_. + + The ISO C99 standard includes '_Pragma', which now allows pragmas to be +generated from macros. In addition, a '#pragma GCC' namespace is now in +use for GCC-specific pragmas. However, it has been found convenient to +use '__attribute__' to achieve a natural attachment of attributes to +their corresponding declarations, whereas '#pragma GCC' is of use for +constructs that do not naturally form part of the grammar. *Note +Pragmas Accepted by GCC: Pragmas. + + +File: gcc.info, Node: Attribute Syntax, Next: Function Prototypes, Prev: Function Attributes, Up: C Extensions + +6.31 Attribute Syntax +===================== + +This section describes the syntax with which '__attribute__' may be +used, and the constructs to which attribute specifiers bind, for the C +language. Some details may vary for C++ and Objective-C. Because of +infelicities in the grammar for attributes, some forms described here +may not be successfully parsed in all cases. + + There are some problems with the semantics of attributes in C++. For +example, there are no manglings for attributes, although they may affect +code generation, so problems may arise when attributed types are used in +conjunction with templates or overloading. Similarly, 'typeid' does not +distinguish between types with different attributes. Support for +attributes in C++ may be restricted in future to attributes on +declarations only, but not on nested declarators. + + *Note Function Attributes::, for details of the semantics of attributes +applying to functions. *Note Variable Attributes::, for details of the +semantics of attributes applying to variables. *Note Type Attributes::, +for details of the semantics of attributes applying to structure, union +and enumerated types. + + An "attribute specifier" is of the form '__attribute__ +((ATTRIBUTE-LIST))'. An "attribute list" is a possibly empty +comma-separated sequence of "attributes", where each attribute is one of +the following: + + * Empty. Empty attributes are ignored. + + * A word (which may be an identifier such as 'unused', or a reserved + word such as 'const'). + + * A word, followed by, in parentheses, parameters for the attribute. + These parameters take one of the following forms: + + * An identifier. For example, 'mode' attributes use this form. + + * An identifier followed by a comma and a non-empty + comma-separated list of expressions. For example, 'format' + attributes use this form. + + * A possibly empty comma-separated list of expressions. For + example, 'format_arg' attributes use this form with the list + being a single integer constant expression, and 'alias' + attributes use this form with the list being a single string + constant. + + An "attribute specifier list" is a sequence of one or more attribute +specifiers, not separated by any other tokens. + + In GNU C, an attribute specifier list may appear after the colon +following a label, other than a 'case' or 'default' label. The only +attribute it makes sense to use after a label is 'unused'. This feature +is intended for program-generated code that may contain unused labels, +but which is compiled with '-Wall'. It is not normally 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 '#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 'struct', 'union' +or 'enum' specifier. It may go either immediately after the 'struct', +'union' or 'enum' keyword, or after the closing brace. The former +syntax is preferred. Where attribute specifiers follow the closing +brace, they are considered to relate to the structure, union or +enumerated type defined, not to any enclosing declaration the type +specifier appears in, and the type defined is not complete until after +the attribute specifiers. + + Otherwise, an attribute specifier appears as part of a declaration, +counting declarations of unnamed parameters and type names, and relates +to that declaration (which may be nested in another declaration, for +example in the case of a parameter declaration), or to a particular +declarator within a declaration. Where an attribute specifier is +applied to a parameter declared as a function or an array, it should +apply to the function or array rather than the pointer to which the +parameter is implicitly converted, but this is not yet correctly +implemented. + + Any list of specifiers and qualifiers at the start of a declaration may +contain attribute specifiers, whether or not such a list may in that +context contain storage class specifiers. (Some attributes, however, +are essentially in the nature of storage class specifiers, and only make +sense where storage class specifiers may be used; for example, +'section'.) There is one necessary limitation to this syntax: the first +old-style parameter declaration in a function definition cannot begin +with an attribute specifier, because such an attribute applies to the +function instead by syntax described below (which, however, is not yet +implemented in this case). In some other cases, attribute specifiers +are permitted by this grammar but not yet supported by the compiler. +All attribute specifiers in this place relate to the declaration as a +whole. In the obsolescent usage where a type of 'int' is implied by the +absence of type specifiers, such a list of specifiers and qualifiers may +be an attribute specifier list with no other specifiers or qualifiers. + + At present, the first parameter in a function prototype must have some +type specifier that is not an attribute specifier; this resolves an +ambiguity in the interpretation of 'void f(int (__attribute__((foo)) +x))', but is subject to change. At present, if the parentheses of a +function declarator contain only attributes then those attributes are +ignored, rather than yielding an error or warning or implying a single +parameter of type int, but this is subject to change. + + An attribute specifier list may appear immediately before a declarator +(other than the first) in a comma-separated list of declarators in a +declaration of more than one identifier using a single list of +specifiers and qualifiers. Such attribute specifiers apply only to the +identifier before whose declarator they appear. For example, in + + __attribute__((noreturn)) void d0 (void), + __attribute__((format(printf, 1, 2))) d1 (const char *, ...), + d2 (void) + +the 'noreturn' attribute applies to all the functions declared; the +'format' attribute only applies to 'd1'. + + An attribute specifier list may appear immediately before the comma, +'=' or semicolon terminating the declaration of an identifier other than +a function definition. Such attribute specifiers apply to the declared +object or function. Where an assembler name for an object or function +is specified (*note Asm Labels::), the attribute must follow the 'asm' +specification. + + An attribute specifier list may, in future, be permitted to appear +after the declarator in a function definition (before any old-style +parameter declarations or the function body). + + Attribute specifiers may be mixed with type qualifiers appearing inside +the '[]' of a parameter array declarator, in the C99 construct by which +such qualifiers are applied to the pointer to which the array is +implicitly converted. Such attribute specifiers apply to the pointer, +not to the array, but at present this is not implemented and they are +ignored. + + An attribute specifier list may appear at the start of a nested +declarator. At present, there are some limitations in this usage: the +attributes correctly apply to the declarator, but for most individual +attributes the semantics this implies are not implemented. When +attribute specifiers follow the '*' of a pointer declarator, they may be +mixed with any type qualifiers present. The following describes the +formal semantics of this syntax. It makes the most sense if you are +familiar with the formal specification of declarators in the ISO C +standard. + + Consider (as in C99 subclause 6.7.5 paragraph 4) a declaration 'T D1', +where 'T' contains declaration specifiers that specify a type TYPE (such +as 'int') and 'D1' is a declarator that contains an identifier IDENT. +The type specified for IDENT for derived declarators whose type does not +include an attribute specifier is as in the ISO C standard. + + If 'D1' has the form '( ATTRIBUTE-SPECIFIER-LIST D )', and the +declaration 'T D' specifies the type "DERIVED-DECLARATOR-TYPE-LIST TYPE" +for IDENT, then 'T D1' specifies the type "DERIVED-DECLARATOR-TYPE-LIST +ATTRIBUTE-SPECIFIER-LIST TYPE" for IDENT. + + If 'D1' has the form '* TYPE-QUALIFIER-AND-ATTRIBUTE-SPECIFIER-LIST D', +and the declaration 'T D' specifies the type +"DERIVED-DECLARATOR-TYPE-LIST TYPE" for IDENT, then 'T D1' specifies the +type "DERIVED-DECLARATOR-TYPE-LIST +TYPE-QUALIFIER-AND-ATTRIBUTE-SPECIFIER-LIST pointer to TYPE" for IDENT. + + For example, + + void (__attribute__((noreturn)) ****f) (void); + +specifies the type "pointer to pointer to pointer to pointer to +non-returning function returning 'void'". As another example, + + char *__attribute__((aligned(8))) *f; + +specifies the type "pointer to 8-byte-aligned pointer to 'char'". Note +again that this does not work with most attributes; for example, the +usage of 'aligned' and 'noreturn' attributes given above is not yet +supported. + + For compatibility with existing code written for compiler versions that +did not implement attributes on nested declarators, some laxity is +allowed in the placing of attributes. If an attribute that only applies +to types is applied to a declaration, it is treated as applying to the +type of that declaration. If an attribute that only applies to +declarations is applied to the type of a declaration, it is treated as +applying to that declaration; and, for compatibility with code placing +the attributes immediately before the identifier declared, such an +attribute applied to a function return type is treated as applying to +the function type, and such an attribute applied to an array element +type is treated as applying to the array type. If an attribute that +only applies to function types is applied to a pointer-to-function type, +it is treated as applying to the pointer target type; if such an +attribute is applied to a function return type that is not a +pointer-to-function type, it is treated as applying to the function +type. + + +File: gcc.info, Node: Function Prototypes, Next: C++ Comments, Prev: Attribute Syntax, Up: C Extensions + +6.32 Prototypes and Old-Style Function Definitions +================================================== + +GNU C extends ISO C to allow a function prototype to override a later +old-style non-prototype definition. Consider the following example: + + /* Use prototypes unless the compiler is old-fashioned. */ + #ifdef __STDC__ + #define P(x) x + #else + #define P(x) () + #endif + + /* Prototype function declaration. */ + int isroot P((uid_t)); + + /* Old-style function definition. */ + int + isroot (x) /* ??? lossage here ??? */ + uid_t x; + { + return x == 0; + } + + Suppose the type 'uid_t' happens to be 'short'. ISO C does not allow +this example, because subword arguments in old-style non-prototype +definitions are promoted. Therefore in this example the function +definition's argument is really an 'int', which does not match the +prototype argument type of 'short'. + + This restriction of ISO C makes it hard to write code that is portable +to traditional C compilers, because the programmer does not know whether +the 'uid_t' type is 'short', 'int', or 'long'. Therefore, in cases like +these GNU C allows a prototype to override a later old-style definition. +More precisely, in GNU C, a function prototype argument type overrides +the argument type specified by a later old-style definition if the +former type is the same as the latter type before promotion. Thus in +GNU C the above example is equivalent to the following: + + int isroot (uid_t); + + int + isroot (uid_t x) + { + return x == 0; + } + +GNU C++ does not support old-style function definitions, so this +extension is irrelevant. + + +File: gcc.info, Node: C++ Comments, Next: Dollar Signs, Prev: Function Prototypes, Up: C Extensions + +6.33 C++ Style Comments +======================= + +In GNU C, you may use C++ style comments, which start with '//' and +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 '-std' option +specifying a version of ISO C before C99, or '-ansi' (equivalent to +'-std=c90'). + + +File: gcc.info, Node: Dollar Signs, Next: Character Escapes, Prev: C++ Comments, Up: C Extensions + +6.34 Dollar Signs in Identifier Names +===================================== + +In GNU C, you may normally use dollar signs in identifier names. This +is because many traditional C implementations allow such identifiers. +However, dollar signs in identifiers are not supported on a few target +machines, typically because the target assembler does not allow them. + + +File: gcc.info, Node: Character Escapes, Next: Variable Attributes, Prev: Dollar Signs, Up: C Extensions + +6.35 The Character <ESC> in Constants +===================================== + +You can use the sequence '\e' in a string or character constant to stand +for the ASCII character <ESC>. + + +File: gcc.info, Node: Variable Attributes, Next: Type Attributes, Prev: Character Escapes, Up: C Extensions + +6.36 Specifying Attributes of Variables +======================================= + +The keyword '__attribute__' allows you to specify special attributes of +variables or structure fields. This keyword is followed by an attribute +specification inside double parentheses. Some attributes are currently +defined generically for variables. Other attributes are defined for +variables on particular target systems. Other attributes are available +for functions (*note Function Attributes::) and for types (*note Type +Attributes::). Other front ends might define more attributes (*note +Extensions to the C++ Language: C++ Extensions.). + + You may also specify attributes with '__' preceding and following each +keyword. This allows you to use them in header files without being +concerned about a possible macro of the same name. For example, you may +use '__aligned__' instead of 'aligned'. + + *Note Attribute Syntax::, for details of the exact syntax for using +attributes. + +'aligned (ALIGNMENT)' + This attribute specifies a minimum alignment for the variable or + structure field, measured in bytes. For example, the declaration: + + int x __attribute__ ((aligned (16))) = 0; + + causes the compiler to allocate the global variable 'x' on a + 16-byte boundary. On a 68040, this could be used in conjunction + with an 'asm' expression to access the 'move16' instruction which + requires 16-byte aligned operands. + + You can also specify the alignment of structure fields. For + example, to create a double-word aligned 'int' pair, you could + write: + + struct foo { int x[2] __attribute__ ((aligned (8))); }; + + This is an alternative to creating a union with a 'double' member, + which forces the union to be double-word aligned. + + As in the preceding examples, you can explicitly specify the + alignment (in bytes) that you wish the compiler to use for a given + variable or structure field. Alternatively, you can leave out the + alignment factor and just ask the compiler to align a variable or + field to the default alignment for the target architecture you are + compiling for. The default alignment is sufficient for all scalar + types, but may not be enough for all vector types on a target that + supports vector operations. The default alignment is fixed for a + particular target ABI. + + GCC also provides a target specific macro '__BIGGEST_ALIGNMENT__', + which is the largest alignment ever used for any data type on the + target machine you are compiling for. For example, you could + write: + + short array[3] __attribute__ ((aligned (__BIGGEST_ALIGNMENT__))); + + The compiler automatically sets the alignment for the declared + variable or field to '__BIGGEST_ALIGNMENT__'. Doing this can often + make copy operations more efficient, because the compiler can use + whatever instructions copy the biggest chunks of memory when + performing copies to or from the variables or fields that you have + aligned this way. Note that the value of '__BIGGEST_ALIGNMENT__' + may change depending on command-line options. + + When used on a struct, or struct member, the 'aligned' attribute + can only increase the alignment; in order to decrease it, the + 'packed' attribute must be specified as well. When used as part of + a typedef, the 'aligned' attribute can both increase and decrease + alignment, and specifying the 'packed' attribute generates a + warning. + + Note that the effectiveness of 'aligned' attributes may be limited + by inherent limitations in your linker. On many systems, the + linker is only able to arrange for variables to be aligned up to a + certain maximum alignment. (For some linkers, the maximum + supported alignment may be very very small.) If your linker is + only able to align variables up to a maximum of 8-byte alignment, + then specifying 'aligned(16)' in an '__attribute__' still only + provides you with 8-byte alignment. See your linker documentation + for further information. + + The 'aligned' attribute can also be used for functions (*note + Function Attributes::.) + +'cleanup (CLEANUP_FUNCTION)' + The 'cleanup' attribute runs a function when the variable goes out + of scope. This attribute can only be applied to auto function + scope variables; it may not be applied to parameters or variables + with static storage duration. The function must take one + parameter, a pointer to a type compatible with the variable. The + return value of the function (if any) is ignored. + + If '-fexceptions' is enabled, then CLEANUP_FUNCTION is run during + the stack unwinding that happens during the processing of the + exception. Note that the 'cleanup' attribute does not allow the + exception to be caught, only to perform an action. It is undefined + what happens if CLEANUP_FUNCTION does not return normally. + +'common' +'nocommon' + The 'common' attribute requests GCC to place a variable in "common" + storage. The 'nocommon' attribute requests the opposite--to + allocate space for it directly. + + These attributes override the default chosen by the '-fno-common' + and '-fcommon' flags respectively. + +'deprecated' +'deprecated (MSG)' + The 'deprecated' attribute results in a warning if the variable is + used anywhere in the source file. This is useful when identifying + variables that are expected to be removed in a future version of a + program. The warning also includes the location of the declaration + of the deprecated variable, to enable users to easily find further + information about why the variable is deprecated, or what they + should do instead. Note that the warning only occurs for uses: + + extern int old_var __attribute__ ((deprecated)); + extern int old_var; + int new_fn () { return old_var; } + + results in a warning on line 3 but not line 2. The optional MSG + argument, which must be a string, is printed in the warning if + present. + + The 'deprecated' attribute can also be used for functions and types + (*note Function Attributes::, *note Type Attributes::.) + +'mode (MODE)' + This attribute specifies the data type for the + declaration--whichever type corresponds to the mode MODE. This in + effect lets you request an integer or floating-point type according + to its width. + + You may also specify a mode of 'byte' or '__byte__' to indicate the + mode corresponding to a one-byte integer, 'word' or '__word__' for + the mode of a one-word integer, and 'pointer' or '__pointer__' for + the mode used to represent pointers. + +'packed' + The 'packed' attribute specifies that a variable or structure field + should have the smallest possible alignment--one byte for a + variable, and one bit for a field, unless you specify a larger + value with the 'aligned' attribute. + + Here is a structure in which the field 'x' is packed, so that it + immediately follows 'a': + + struct foo + { + char a; + int x[2] __attribute__ ((packed)); + }; + + _Note:_ The 4.1, 4.2 and 4.3 series of GCC ignore the 'packed' + attribute on bit-fields of type 'char'. This has been fixed in GCC + 4.4 but the change can lead to differences in the structure layout. + See the documentation of '-Wpacked-bitfield-compat' for more + information. + +'section ("SECTION-NAME")' + Normally, the compiler places the objects it generates in sections + like 'data' and 'bss'. Sometimes, however, you need additional + sections, or you need certain particular variables to appear in + special sections, for example to map to special hardware. The + 'section' attribute specifies that a variable (or function) lives + in a particular section. For example, this small program uses + several specific section names: + + struct duart a __attribute__ ((section ("DUART_A"))) = { 0 }; + struct duart b __attribute__ ((section ("DUART_B"))) = { 0 }; + char stack[10000] __attribute__ ((section ("STACK"))) = { 0 }; + int init_data __attribute__ ((section ("INITDATA"))); + + main() + { + /* Initialize stack pointer */ + init_sp (stack + sizeof (stack)); + + /* Initialize initialized data */ + memcpy (&init_data, &data, &edata - &data); + + /* Turn on the serial ports */ + init_duart (&a); + init_duart (&b); + } + + Use the 'section' attribute with _global_ variables and not _local_ + variables, as shown in the example. + + You may use the 'section' attribute with initialized or + uninitialized global variables but the linker requires each object + be defined once, with the exception that uninitialized variables + tentatively go in the 'common' (or 'bss') section and can be + multiply "defined". Using the 'section' attribute changes what + section the variable goes into and may cause the linker to issue an + error if an uninitialized variable has multiple definitions. You + can force a variable to be initialized with the '-fno-common' flag + or the 'nocommon' attribute. + + Some file formats do not support arbitrary sections so the + 'section' attribute is not available on all platforms. If you need + to map the entire contents of a module to a particular section, + consider using the facilities of the linker instead. + +'shared' + On Microsoft Windows, in addition to putting variable definitions + in a named section, the section can also be shared among all + running copies of an executable or DLL. For example, this small + program defines shared data by putting it in a named section + 'shared' and marking the section shareable: + + int foo __attribute__((section ("shared"), shared)) = 0; + + int + main() + { + /* Read and write foo. All running + copies see the same value. */ + return 0; + } + + You may only use the 'shared' attribute along with 'section' + attribute with a fully-initialized global definition because of the + way linkers work. See 'section' attribute for more information. + + The 'shared' attribute is only available on Microsoft Windows. + +'tls_model ("TLS_MODEL")' + The 'tls_model' attribute sets thread-local storage model (*note + Thread-Local::) of a particular '__thread' variable, overriding + '-ftls-model=' command-line switch on a per-variable basis. The + TLS_MODEL argument should be one of 'global-dynamic', + 'local-dynamic', 'initial-exec' or 'local-exec'. + + Not all targets support this attribute. + +'unused' + This attribute, attached to a variable, means that the variable is + meant to be possibly unused. GCC does not produce a warning for + this variable. + +'used' + This attribute, attached to a variable with the static storage, + means that the variable must be emitted even if it appears that the + variable is not referenced. + + When applied to a static data member of a C++ class template, the + attribute also means that the member is instantiated if the class + itself is instantiated. + +'vector_size (BYTES)' + This attribute specifies the vector size for the variable, measured + in bytes. For example, the declaration: + + int foo __attribute__ ((vector_size (16))); + + causes the compiler to set the mode for 'foo', to be 16 bytes, + divided into 'int' sized units. Assuming a 32-bit int (a vector of + 4 units of 4 bytes), the corresponding mode of 'foo' is V4SI. + + This attribute is only applicable to integral and float scalars, + although arrays, pointers, and function return values are allowed + in conjunction with this construct. + + Aggregates with this attribute are invalid, even if they are of the + same size as a corresponding scalar. For example, the declaration: + + struct S { int a; }; + struct S __attribute__ ((vector_size (16))) foo; + + is invalid even if the size of the structure is the same as the + size of the 'int'. + +'selectany' + The 'selectany' attribute causes an initialized global variable to + have link-once semantics. When multiple definitions of the + variable are encountered by the linker, the first is selected and + the remainder are discarded. Following usage by the Microsoft + compiler, the linker is told _not_ to warn about size or content + differences of the multiple definitions. + + Although the primary usage of this attribute is for POD types, the + attribute can also be applied to global C++ objects that are + initialized by a constructor. In this case, the static + initialization and destruction code for the object is emitted in + each translation defining the object, but the calls to the + constructor and destructor are protected by a link-once guard + variable. + + The 'selectany' attribute is only available on Microsoft Windows + targets. You can use '__declspec (selectany)' as a synonym for + '__attribute__ ((selectany))' for compatibility with other + compilers. + +'weak' + The 'weak' attribute is described in *note Function Attributes::. + +'dllimport' + The 'dllimport' attribute is described in *note Function + Attributes::. + +'dllexport' + The 'dllexport' attribute is described in *note Function + Attributes::. + +6.36.1 AVR Variable Attributes +------------------------------ + +'progmem' + The 'progmem' attribute is used on the AVR to place read-only data + in the non-volatile program memory (flash). The 'progmem' + attribute accomplishes this by putting respective variables into a + section whose name starts with '.progmem'. + + This attribute works similar to the 'section' attribute but adds + additional checking. Notice that just like the 'section' + attribute, 'progmem' affects the location of the data but not how + this data is accessed. + + In order to read data located with the 'progmem' attribute (inline) + assembler must be used. + /* Use custom macros from AVR-LibC (http://nongnu.org/avr-libc/user-manual/) */ + #include <avr/pgmspace.h> + + /* Locate var in flash memory */ + const int var[2] PROGMEM = { 1, 2 }; + + int read_var (int i) + { + /* Access var[] by accessor macro from avr/pgmspace.h */ + return (int) pgm_read_word (& var[i]); + } + + AVR is a Harvard architecture processor and data and read-only data + normally resides in the data memory (RAM). + + See also the *note AVR Named Address Spaces:: section for an + alternate way to locate and access data in flash memory. + +6.36.2 Blackfin Variable Attributes +----------------------------------- + +Three attributes are currently defined for the Blackfin. + +'l1_data' +'l1_data_A' +'l1_data_B' + Use these attributes on the Blackfin to place the variable into L1 + Data SRAM. Variables with 'l1_data' attribute are put into the + specific section named '.l1.data'. Those with 'l1_data_A' + attribute are put into the specific section named '.l1.data.A'. + Those with 'l1_data_B' attribute are put into the specific section + named '.l1.data.B'. + +'l2' + Use this attribute on the Blackfin to place the variable into L2 + SRAM. Variables with 'l2' attribute are put into the specific + section named '.l2.data'. + +6.36.3 M32R/D Variable Attributes +--------------------------------- + +One attribute is currently defined for the M32R/D. + +'model (MODEL-NAME)' + Use this attribute on the M32R/D to set the addressability of an + object. The identifier MODEL-NAME is one of 'small', 'medium', or + 'large', representing each of the code models. + + Small model objects live in the lower 16MB of memory (so that their + addresses can be loaded with the 'ld24' instruction). + + Medium and large model objects may live anywhere in the 32-bit + address space (the compiler generates 'seth/add3' instructions to + load their addresses). + +6.36.4 MeP Variable Attributes +------------------------------ + +The MeP target has a number of addressing modes and busses. The 'near' +space spans the standard memory space's first 16 megabytes (24 bits). +The 'far' space spans the entire 32-bit memory space. The 'based' space +is a 128-byte region in the memory space that is addressed relative to +the '$tp' register. The 'tiny' space is a 65536-byte region relative to +the '$gp' register. In addition to these memory regions, the MeP target +has a separate 16-bit control bus which is specified with 'cb' +attributes. + +'based' + Any variable with the 'based' attribute is assigned to the '.based' + section, and is accessed with relative to the '$tp' register. + +'tiny' + Likewise, the 'tiny' attribute assigned variables to the '.tiny' + section, relative to the '$gp' register. + +'near' + Variables with the 'near' attribute are assumed to have addresses + that fit in a 24-bit addressing mode. This is the default for + large variables ('-mtiny=4' is the default) but this attribute can + override '-mtiny=' for small variables, or override '-ml'. + +'far' + Variables with the '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. + +'io' +'io (ADDR)' + Variables with the '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 assigns an address). Example: + + int timer_count __attribute__((io(0x123))); + +'cb' +'cb (ADDR)' + Variables with the 'cb' attribute are used to access the control + bus, using special instructions. 'addr' indicates the control bus + address. Example: + + int cpu_clock __attribute__((cb(0x123))); + +6.36.5 i386 Variable Attributes +------------------------------- + +Two attributes are currently defined for i386 configurations: +'ms_struct' and 'gcc_struct' + +'ms_struct' +'gcc_struct' + + If 'packed' is used on a structure, or if bit-fields are used, it + may be that the Microsoft ABI lays out the structure differently + than the way GCC normally does. Particularly when moving packed + data between functions compiled with GCC and the native Microsoft + compiler (either via function call or as data in a file), it may be + necessary to access either format. + + Currently '-m[no-]ms-bitfields' is provided for the Microsoft + Windows X86 compilers to match the native Microsoft compiler. + + The Microsoft structure layout algorithm is fairly simple with the + exception of the bit-field packing. The padding and alignment of + members of structures and whether a bit-field can straddle a + storage-unit boundary are determine by these rules: + + 1. Structure members are stored sequentially in the order in + which they are declared: the first member has the lowest + memory address and the last member the highest. + + 2. Every data object has an alignment requirement. The alignment + requirement for all data except structures, unions, and arrays + is either the size of the object or the current packing size + (specified with either the 'aligned' attribute or the 'pack' + pragma), whichever is less. For structures, unions, and + arrays, the alignment requirement is the largest alignment + requirement of its members. Every object is allocated an + offset so that: + + offset % alignment_requirement == 0 + + 3. Adjacent bit-fields are packed into the same 1-, 2-, or 4-byte + allocation unit if the integral types are the same size and if + the next bit-field fits into the current allocation unit + without crossing the boundary imposed by the common alignment + requirements of the bit-fields. + + MSVC interprets zero-length bit-fields in the following ways: + + 1. If a zero-length bit-field is inserted between two bit-fields + that are normally coalesced, the bit-fields are not coalesced. + + For example: + + struct + { + unsigned long bf_1 : 12; + unsigned long : 0; + unsigned long bf_2 : 12; + } t1; + + The size of 't1' is 8 bytes with the zero-length bit-field. + If the zero-length bit-field were removed, 't1''s size would + be 4 bytes. + + 2. If a zero-length bit-field is inserted after a bit-field, + 'foo', and the alignment of the zero-length bit-field is + greater than the member that follows it, 'bar', 'bar' is + aligned as the type of the zero-length bit-field. + + For example: + + struct + { + char foo : 4; + short : 0; + char bar; + } t2; + + struct + { + char foo : 4; + short : 0; + double bar; + } t3; + + For 't2', 'bar' is placed at offset 2, rather than offset 1. + Accordingly, the size of 't2' is 4. For 't3', the zero-length + bit-field does not affect the alignment of 'bar' or, as a + result, the size of the structure. + + Taking this into account, it is important to note the + following: + + 1. If a zero-length bit-field follows a normal bit-field, + the type of the zero-length bit-field may affect the + alignment of the structure as whole. For example, 't2' + has a size of 4 bytes, since the zero-length bit-field + follows a normal bit-field, and is of type short. + + 2. Even if a zero-length bit-field is not followed by a + normal bit-field, it may still affect the alignment of + the structure: + + struct + { + char foo : 6; + long : 0; + } t4; + + Here, 't4' takes up 4 bytes. + + 3. Zero-length bit-fields following non-bit-field members are + ignored: + + struct + { + char foo; + long : 0; + char bar; + } t5; + + Here, 't5' takes up 2 bytes. + +6.36.6 PowerPC Variable Attributes +---------------------------------- + +Three attributes currently are defined for PowerPC configurations: +'altivec', 'ms_struct' and 'gcc_struct'. + + For full documentation of the struct attributes please see the +documentation in *note i386 Variable Attributes::. + + For documentation of 'altivec' attribute please see the documentation +in *note PowerPC Type Attributes::. + +6.36.7 SPU Variable Attributes +------------------------------ + +The SPU supports the 'spu_vector' attribute for variables. For +documentation of this attribute please see the documentation in *note +SPU Type Attributes::. + +6.36.8 Xstormy16 Variable Attributes +------------------------------------ + +One attribute is currently defined for xstormy16 configurations: +'below100'. + +'below100' + + If a variable has the 'below100' attribute ('BELOW100' is allowed + also), GCC places the variable in the first 0x100 bytes of memory + and use special opcodes to access it. Such variables are placed in + either the '.bss_below100' section or the '.data_below100' section. + + +File: gcc.info, Node: Type Attributes, Next: Alignment, Prev: Variable Attributes, Up: C Extensions + +6.37 Specifying Attributes of Types +=================================== + +The keyword '__attribute__' allows you to specify special attributes of +'struct' and 'union' types when you define such types. This keyword is +followed by an attribute specification inside double parentheses. Seven +attributes are currently defined for types: 'aligned', 'packed', +'transparent_union', 'unused', 'deprecated', 'visibility', and +'may_alias'. Other attributes are defined for functions (*note Function +Attributes::) and for variables (*note Variable Attributes::). + + You may also specify any one of these attributes with '__' preceding +and following its keyword. This allows you to use these attributes in +header files without being concerned about a possible macro of the same +name. For example, you may use '__aligned__' instead of 'aligned'. + + You may specify type attributes in an enum, struct or union type +declaration or definition, or for other types in a 'typedef' +declaration. + + For an enum, struct or union type, you may specify attributes either +between the enum, struct or union tag and the name of the type, or just +past the closing curly brace of the _definition_. The former syntax is +preferred. + + *Note Attribute Syntax::, for details of the exact syntax for using +attributes. + +'aligned (ALIGNMENT)' + This attribute specifies a minimum alignment (in bytes) for + variables of the specified type. For example, the declarations: + + struct S { short f[3]; } __attribute__ ((aligned (8))); + typedef int more_aligned_int __attribute__ ((aligned (8))); + + force the compiler to ensure (as far as it can) that each variable + whose type is 'struct S' or 'more_aligned_int' is allocated and + aligned _at least_ on a 8-byte boundary. On a SPARC, having all + variables of type 'struct S' aligned to 8-byte boundaries allows + the compiler to use the 'ldd' and 'std' (doubleword load and store) + instructions when copying one variable of type 'struct S' to + another, thus improving run-time efficiency. + + Note that the alignment of any given 'struct' or 'union' type is + required by the ISO C standard to be at least a perfect multiple of + the lowest common multiple of the alignments of all of the members + of the 'struct' or 'union' in question. This means that you _can_ + effectively adjust the alignment of a 'struct' or 'union' type by + attaching an 'aligned' attribute to any one of the members of such + a type, but the notation illustrated in the example above is a more + obvious, intuitive, and readable way to request the compiler to + adjust the alignment of an entire 'struct' or 'union' type. + + As in the preceding example, you can explicitly specify the + alignment (in bytes) that you wish the compiler to use for a given + 'struct' or 'union' type. Alternatively, you can leave out the + alignment factor and just ask the compiler to align a type to the + maximum useful alignment for the target machine you are compiling + for. For example, you could write: + + struct S { short f[3]; } __attribute__ ((aligned)); + + Whenever you leave out the alignment factor in an 'aligned' + attribute specification, the compiler automatically sets the + alignment for the type to the largest alignment that is ever used + for any data type on the target machine you are compiling for. + Doing this can often make copy operations more efficient, because + the compiler can use whatever instructions copy the biggest chunks + of memory when performing copies to or from the variables that have + types that you have aligned this way. + + In the example above, if the size of each 'short' is 2 bytes, then + the size of the entire 'struct S' type is 6 bytes. The smallest + power of two that is greater than or equal to that is 8, so the + compiler sets the alignment for the entire 'struct S' type to 8 + bytes. + + Note that although you can ask the compiler to select a + time-efficient alignment for a given type and then declare only + individual stand-alone objects of that type, the compiler's ability + to select a time-efficient alignment is primarily useful only when + you plan to create arrays of variables having the relevant + (efficiently aligned) type. If you declare or use arrays of + variables of an efficiently-aligned type, then it is likely that + your program also does pointer arithmetic (or subscripting, which + amounts to the same thing) on pointers to the relevant type, and + the code that the compiler generates for these pointer arithmetic + operations is often more efficient for efficiently-aligned types + than for other types. + + The 'aligned' attribute can only increase the alignment; but you + can decrease it by specifying 'packed' as well. See below. + + Note that the effectiveness of 'aligned' attributes may be limited + by inherent limitations in your linker. On many systems, the + linker is only able to arrange for variables to be aligned up to a + certain maximum alignment. (For some linkers, the maximum + supported alignment may be very very small.) If your linker is + only able to align variables up to a maximum of 8-byte alignment, + then specifying 'aligned(16)' in an '__attribute__' still only + provides you with 8-byte alignment. See your linker documentation + for further information. + +'packed' + This attribute, attached to 'struct' or 'union' type definition, + specifies that each member (other than zero-width bit-fields) of + the structure or union is placed to minimize the memory required. + When attached to an 'enum' definition, it indicates that the + smallest integral type should be used. + + Specifying this attribute for 'struct' and 'union' types is + equivalent to specifying the 'packed' attribute on each of the + structure or union members. Specifying the '-fshort-enums' flag on + the line is equivalent to specifying the 'packed' attribute on all + 'enum' definitions. + + In the following example 'struct my_packed_struct''s members are + packed closely together, but the internal layout of its 's' member + is not packed--to do that, 'struct my_unpacked_struct' needs to be + packed too. + + struct my_unpacked_struct + { + char c; + int i; + }; + + struct __attribute__ ((__packed__)) my_packed_struct + { + char c; + int i; + struct my_unpacked_struct s; + }; + + You may only specify this attribute on the definition of an 'enum', + 'struct' or 'union', not on a 'typedef' that does not also define + the enumerated type, structure or union. + +'transparent_union' + This attribute, attached to a 'union' type definition, indicates + that any function parameter having that union type causes calls to + that function to be treated in a special way. + + First, the argument corresponding to a transparent union type can + be of any type in the union; no cast is required. Also, if the + union contains a pointer type, the corresponding argument can be a + null pointer constant or a void pointer expression; and if the + union contains a void pointer type, the corresponding argument can + be any pointer expression. If the union member type is a pointer, + qualifiers like 'const' on the referenced type must be respected, + just as with normal pointer conversions. + + Second, the argument is passed to the function using the calling + conventions of the first member of the transparent union, not the + calling conventions of the union itself. All members of the union + must have the same machine representation; this is necessary for + this argument passing to work properly. + + Transparent unions are designed for library functions that have + multiple interfaces for compatibility reasons. For example, + suppose the 'wait' function must accept either a value of type 'int + *' to comply with POSIX, or a value of type 'union wait *' to + comply with the 4.1BSD interface. If 'wait''s parameter were 'void + *', 'wait' would accept both kinds of arguments, but it would also + accept any other pointer type and this would make argument type + checking less useful. Instead, '<sys/wait.h>' might define the + interface as follows: + + typedef union __attribute__ ((__transparent_union__)) + { + int *__ip; + union wait *__up; + } wait_status_ptr_t; + + pid_t wait (wait_status_ptr_t); + + This interface allows either 'int *' or 'union wait *' arguments to + be passed, using the 'int *' calling convention. The program can + call 'wait' with arguments of either type: + + int w1 () { int w; return wait (&w); } + int w2 () { union wait w; return wait (&w); } + + With this interface, 'wait''s implementation might look like this: + + pid_t wait (wait_status_ptr_t p) + { + return waitpid (-1, p.__ip, 0); + } + +'unused' + When attached to a type (including a 'union' or a 'struct'), this + attribute means that variables of that type are meant to appear + possibly unused. GCC does not produce a warning for any variables + of that type, even if the variable appears to do nothing. This is + often the case with lock or thread classes, which are usually + defined and then not referenced, but contain constructors and + destructors that have nontrivial bookkeeping functions. + +'deprecated' +'deprecated (MSG)' + The '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. + If possible, the warning also includes the location of the + declaration of the deprecated type, to enable users to easily find + further information about why the type is deprecated, or what they + should do instead. Note that the warnings only occur for uses and + then only if the type is being applied to an identifier that itself + is not being declared as deprecated. + + typedef int T1 __attribute__ ((deprecated)); + T1 x; + typedef T1 T2; + T2 y; + typedef T1 T3 __attribute__ ((deprecated)); + 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. The optional MSG argument, + which must be a string, is printed in the warning if present. + + The 'deprecated' attribute can also be used for functions and + variables (*note Function Attributes::, *note Variable + Attributes::.) + +'may_alias' + Accesses through pointers to types with this attribute are not + subject to type-based alias analysis, but are instead assumed to be + able to alias any other type of objects. In the context of section + 6.5 paragraph 7 of the C99 standard, an lvalue expression + dereferencing such a pointer is treated like having a character + type. See '-fstrict-aliasing' for more information on aliasing + issues. This extension exists to support some vector APIs, in + which pointers to one vector type are permitted to alias pointers + to a different vector type. + + Note that an object of a type with this attribute does not have any + special semantics. + + Example of use: + + typedef short __attribute__((__may_alias__)) short_a; + + int + main (void) + { + int a = 0x12345678; + short_a *b = (short_a *) &a; + + b[1] = 0; + + if (a == 0x12345678) + abort(); + + exit(0); + } + + If you replaced 'short_a' with 'short' in the variable declaration, + the above program would abort when compiled with + '-fstrict-aliasing', which is on by default at '-O2' or above in + recent GCC versions. + +'visibility' + In C++, attribute visibility (*note Function Attributes::) can also + be applied to class, struct, union and enum types. Unlike other + type attributes, the attribute must appear between the initial + keyword and the name of the type; it cannot appear after the body + of the type. + + Note that the type visibility is applied to vague linkage entities + associated with the class (vtable, typeinfo node, etc.). In + particular, if a class is thrown as an exception in one shared + object and caught in another, the class must have default + visibility. Otherwise the two shared objects are unable to use the + same typeinfo node and exception handling will break. + + To specify multiple attributes, separate them by commas within the +double parentheses: for example, '__attribute__ ((aligned (16), +packed))'. + +6.37.1 ARM Type Attributes +-------------------------- + +On those ARM targets that support 'dllimport' (such as Symbian OS), you +can use the 'notshared' attribute to indicate that the virtual table and +other similar data for a class should not be exported from a DLL. For +example: + + class __declspec(notshared) C { + public: + __declspec(dllimport) C(); + virtual void f(); + } + + __declspec(dllexport) + C::C() {} + +In this code, 'C::C' is exported from the current DLL, but the virtual +table for 'C' is not exported. (You can use '__attribute__' instead of +'__declspec' if you prefer, but most Symbian OS code uses '__declspec'.) + +6.37.2 MeP Type Attributes +-------------------------- + +Many of the MeP variable attributes may be applied to types as well. +Specifically, the 'based', 'tiny', 'near', and 'far' attributes may be +applied to either. The 'io' and 'cb' attributes may not be applied to +types. + +6.37.3 i386 Type Attributes +--------------------------- + +Two attributes are currently defined for i386 configurations: +'ms_struct' and 'gcc_struct'. + +'ms_struct' +'gcc_struct' + + If 'packed' is used on a structure, or if bit-fields are used it + may be that the Microsoft ABI packs them differently than GCC + normally packs them. Particularly when moving packed data between + functions compiled with GCC and the native Microsoft compiler + (either via function call or as data in a file), it may be + necessary to access either format. + + Currently '-m[no-]ms-bitfields' is provided for the Microsoft + Windows X86 compilers to match the native Microsoft compiler. + +6.37.4 PowerPC Type Attributes +------------------------------ + +Three attributes currently are defined for PowerPC configurations: +'altivec', 'ms_struct' and 'gcc_struct'. + + For full documentation of the 'ms_struct' and 'gcc_struct' attributes +please see the documentation in *note i386 Type Attributes::. + + The 'altivec' attribute allows one to declare AltiVec vector data types +supported by the AltiVec Programming Interface Manual. The attribute +requires an argument to specify one of three vector types: 'vector__', +'pixel__' (always followed by unsigned short), and 'bool__' (always +followed by unsigned). + + __attribute__((altivec(vector__))) + __attribute__((altivec(pixel__))) unsigned short + __attribute__((altivec(bool__))) unsigned + + These attributes mainly are intended to support the '__vector', +'__pixel', and '__bool' AltiVec keywords. + +6.37.5 SPU Type Attributes +-------------------------- + +The SPU supports the 'spu_vector' attribute for types. This attribute +allows one to declare vector data types supported by the +Sony/Toshiba/IBM SPU Language Extensions Specification. It is intended +to support the '__vector' keyword. + + +File: gcc.info, Node: Alignment, Next: Inline, Prev: Type Attributes, Up: C Extensions + +6.38 Inquiring on Alignment of Types or Variables +================================================= + +The keyword '__alignof__' allows you to inquire about how an object is +aligned, or the minimum alignment usually required by a type. Its +syntax is just like 'sizeof'. + + For example, if the target machine requires a 'double' value to be +aligned on an 8-byte boundary, then '__alignof__ (double)' is 8. This +is true on many RISC machines. On more traditional machine designs, +'__alignof__ (double)' is 4 or even 2. + + Some machines never actually require alignment; they allow reference to +any data type even at an odd address. For these machines, '__alignof__' +reports the smallest alignment that GCC gives the data type, usually as +mandated by the target ABI. + + If the operand of '__alignof__' is an lvalue rather than a type, its +value is the required alignment for its type, taking into account any +minimum alignment specified with GCC's '__attribute__' extension (*note +Variable Attributes::). For example, after this declaration: + + struct foo { int x; char y; } foo1; + +the value of '__alignof__ (foo1.y)' is 1, even though its actual +alignment is probably 2 or 4, the same as '__alignof__ (int)'. + + It is an error to ask for the alignment of an incomplete type. + + +File: gcc.info, Node: Inline, Next: Volatiles, Prev: Alignment, Up: C Extensions + +6.39 An Inline Function is As Fast As a Macro +============================================= + +By declaring a function inline, you can direct GCC to make calls to that +function faster. One way GCC can achieve this is to integrate that +function's code into the code for its callers. This makes execution +faster by eliminating the function-call overhead; in addition, if any of +the actual argument values are constant, their known values may permit +simplifications at compile time so that not all of the inline function's +code needs to be included. The effect on code size is less predictable; +object code may be larger or smaller with function inlining, depending +on the particular case. You can also direct GCC to try to integrate all +"simple enough" functions into their callers with the option +'-finline-functions'. + + GCC implements three different semantics of declaring a function +inline. One is available with '-std=gnu89' or '-fgnu89-inline' or when +'gnu_inline' attribute is present on all inline declarations, another +when '-std=c99', '-std=c11', '-std=gnu99' or '-std=gnu11' (without +'-fgnu89-inline'), and the third is used when compiling C++. + + To declare a function inline, use the 'inline' keyword in its +declaration, like this: + + static inline int + inc (int *a) + { + return (*a)++; + } + + If you are writing a header file to be included in ISO C90 programs, +write '__inline__' instead of 'inline'. *Note Alternate Keywords::. + + The three types of inlining behave similarly in two important cases: +when the 'inline' keyword is used on a 'static' function, like the +example above, and when a function is first declared without using the +'inline' keyword and then is defined with 'inline', like this: + + extern int inc (int *a); + inline int + inc (int *a) + { + return (*a)++; + } + + In both of these common cases, the program behaves the same as if you +had not used the 'inline' keyword, except for its speed. + + When a function is both inline and 'static', if all calls to the +function are integrated into the caller, and the function's address is +never used, then the function's own assembler code is never referenced. +In this case, GCC does not actually output assembler code for the +function, unless you specify the option '-fkeep-inline-functions'. Some +calls cannot be integrated for various reasons (in particular, calls +that precede the function's definition cannot be integrated, and neither +can recursive calls within the definition). If there is a nonintegrated +call, then the function is compiled to assembler code as usual. The +function must also be compiled as usual if the program refers to its +address, because that can't be inlined. + + Note that certain usages in a function definition can make it +unsuitable for inline substitution. Among these usages are: variadic +functions, use of 'alloca', use of variable-length data types (*note +Variable Length::), use of computed goto (*note Labels as Values::), use +of nonlocal goto, and nested functions (*note Nested Functions::). +Using '-Winline' warns when a function marked 'inline' could not be +substituted, and gives the reason for the failure. + + As required by ISO C++, GCC considers member functions defined within +the body of a class to be marked inline even if they are not explicitly +declared with the 'inline' keyword. You can override this with +'-fno-default-inline'; *note Options Controlling C++ Dialect: C++ +Dialect Options. + + GCC does not inline any functions when not optimizing unless you +specify the 'always_inline' attribute for the function, like this: + + /* Prototype. */ + inline void foo (const char) __attribute__((always_inline)); + + The remainder of this section is specific to GNU C90 inlining. + + When an inline function is not 'static', then the compiler must assume +that there may be calls from other source files; since a global symbol +can be defined only once in any program, the function must not be +defined in the other source files, so the calls therein cannot be +integrated. Therefore, a non-'static' inline function is always +compiled on its own in the usual fashion. + + If you specify both 'inline' and 'extern' in the function definition, +then the definition is used only for inlining. In no case is the +function compiled on its own, not even if you refer to its address +explicitly. Such an address becomes an external reference, as if you +had only declared the function, and had not defined it. + + This combination of 'inline' and 'extern' has almost the effect of a +macro. The way to use it is to put a function definition in a header +file with these keywords, and put another copy of the definition +(lacking 'inline' and 'extern') in a library file. The definition in +the header file causes most calls to the function to be inlined. If any +uses of the function remain, they refer to the single copy in the +library. + + +File: gcc.info, Node: Volatiles, Next: Extended Asm, Prev: Inline, Up: C Extensions + +6.40 When is a Volatile Object Accessed? +======================================== + +C has the concept of volatile objects. These are normally accessed by +pointers and used for accessing hardware or inter-thread communication. +The standard encourages compilers to refrain from optimizations +concerning accesses to volatile objects, but leaves it implementation +defined as to what constitutes a volatile access. The minimum +requirement is that at a sequence point all previous accesses to +volatile objects have stabilized and no subsequent accesses have +occurred. Thus an implementation is free to reorder and combine +volatile accesses that occur between sequence points, but cannot do so +for accesses across a sequence point. The use of volatile does not +allow you to violate the restriction on updating objects multiple times +between two sequence points. + + Accesses to non-volatile objects are not ordered with respect to +volatile accesses. You cannot use a volatile object as a memory barrier +to order a sequence of writes to non-volatile memory. For instance: + + int *ptr = SOMETHING; + volatile int vobj; + *ptr = SOMETHING; + vobj = 1; + +Unless *PTR and VOBJ can be aliased, it is not guaranteed that the write +to *PTR occurs by the time the update of VOBJ happens. If you need this +guarantee, you must use a stronger memory barrier such as: + + int *ptr = SOMETHING; + volatile int vobj; + *ptr = SOMETHING; + asm volatile ("" : : : "memory"); + vobj = 1; + + A scalar volatile object is read when it is accessed in a void context: + + volatile int *src = SOMEVALUE; + *src; + + Such expressions are rvalues, and GCC implements this as a read of the +volatile object being pointed to. + + Assignments are also expressions and have an rvalue. However when +assigning to a scalar volatile, the volatile object is not reread, +regardless of whether the assignment expression's rvalue is used or not. +If the assignment's rvalue is used, the value is that assigned to the +volatile object. For instance, there is no read of VOBJ in all the +following cases: + + int obj; + volatile int vobj; + vobj = SOMETHING; + obj = vobj = SOMETHING; + obj ? vobj = ONETHING : vobj = ANOTHERTHING; + obj = (SOMETHING, vobj = ANOTHERTHING); + + If you need to read the volatile object after an assignment has +occurred, you must use a separate expression with an intervening +sequence point. + + As bit-fields are not individually addressable, volatile bit-fields may +be implicitly read when written to, or when adjacent bit-fields are +accessed. Bit-field operations may be optimized such that adjacent +bit-fields are only partially accessed, if they straddle a storage unit +boundary. For these reasons it is unwise to use volatile bit-fields to +access hardware. + + +File: gcc.info, Node: Extended Asm, Next: Constraints, Prev: Volatiles, Up: C Extensions + +6.41 Assembler Instructions with C Expression Operands +====================================================== + +In an assembler instruction using 'asm', you can specify the operands of +the instruction using C expressions. This means you need not guess +which registers or memory locations contain the data you want to use. + + You must specify an assembler instruction template much like what +appears in a machine description, plus an operand constraint string for +each operand. + + For example, here is how to use the 68881's 'fsinx' instruction: + + asm ("fsinx %1,%0" : "=f" (result) : "f" (angle)); + +Here 'angle' is the C expression for the input operand while 'result' is +that of the output operand. Each has '"f"' as its operand constraint, +saying that a floating-point register is required. The '=' in '=f' +indicates that the operand is an output; all output operands' +constraints must use '='. The constraints use the same language used in +the machine description (*note Constraints::). + + Each operand is described by an operand-constraint string followed by +the C expression in parentheses. A colon separates the assembler +template from the first output operand and another separates the last +output operand from the first input, if any. Commas separate the +operands within each group. The total number of operands is currently +limited to 30; this limitation may be lifted in some future version of +GCC. + + If there are no output operands but there are input operands, you must +place two consecutive colons surrounding the place where the output +operands would go. + + As of GCC version 3.1, it is also possible to specify input and output +operands using symbolic names which can be referenced within the +assembler code. These names are specified inside square brackets +preceding the constraint string, and can be referenced inside the +assembler code using '%[NAME]' instead of a percentage sign followed by +the operand number. Using named operands the above example could look +like: + + asm ("fsinx %[angle],%[output]" + : [output] "=f" (result) + : [angle] "f" (angle)); + +Note that the symbolic operand names have no relation whatsoever to +other C identifiers. You may use any name you like, even those of +existing C symbols, but you must ensure that no two operands within the +same assembler construct use the same symbolic name. + + Output operand expressions must be lvalues; the compiler can check +this. The input operands need not be lvalues. The compiler cannot +check whether the operands have data types that are reasonable for the +instruction being executed. It does not parse the assembler instruction +template and does not know what it means or even whether it is valid +assembler input. The extended 'asm' feature is most often used for +machine instructions the compiler itself does not know exist. If the +output expression cannot be directly addressed (for example, it is a +bit-field), your constraint must allow a register. In that case, GCC +uses the register as the output of the 'asm', and then stores that +register into the output. + + The ordinary output operands must be write-only; GCC assumes that the +values in these operands before the instruction are dead and need not be +generated. Extended asm supports input-output or read-write operands. +Use the constraint character '+' to indicate such an operand and list it +with the output operands. + + You may, as an alternative, logically split its function into two +separate operands, one input operand and one write-only output operand. +The connection between them is expressed by constraints that say they +need to be in the same location when the instruction executes. You can +use the same C expression for both operands, or different expressions. +For example, here we write the (fictitious) 'combine' instruction with +'bar' as its read-only source operand and 'foo' as its read-write +destination: + + asm ("combine %2,%0" : "=r" (foo) : "0" (foo), "g" (bar)); + +The constraint '"0"' for operand 1 says that it must occupy the same +location as operand 0. A number in constraint is allowed only in an +input operand and it must refer to an output operand. + + Only a number in the constraint can guarantee that one operand is in +the same place as another. The mere fact that 'foo' is the value of +both operands is not enough to guarantee that they are in the same place +in the generated assembler code. The following does not work reliably: + + asm ("combine %2,%0" : "=r" (foo) : "r" (foo), "g" (bar)); + + Various optimizations or reloading could cause operands 0 and 1 to be +in different registers; GCC knows no reason not to do so. For example, +the compiler might find a copy of the value of 'foo' in one register and +use it for operand 1, but generate the output operand 0 in a different +register (copying it afterward to 'foo''s own address). Of course, +since the register for operand 1 is not even mentioned in the assembler +code, the result will not work, but GCC can't tell that. + + As of GCC version 3.1, one may write '[NAME]' instead of the operand +number for a matching constraint. For example: + + asm ("cmoveq %1,%2,%[result]" + : [result] "=r"(result) + : "r" (test), "r"(new), "[result]"(old)); + + Sometimes you need to make an 'asm' operand be a specific register, but +there's no matching constraint letter for that register _by itself_. To +force the operand into that register, use a local variable for the +operand and specify the register in the variable declaration. *Note +Explicit Reg Vars::. Then for the 'asm' operand, use any register +constraint letter that matches the register: + + register int *p1 asm ("r0") = ...; + register int *p2 asm ("r1") = ...; + register int *result asm ("r0"); + asm ("sysint" : "=r" (result) : "0" (p1), "r" (p2)); + + In the above example, beware that a register that is call-clobbered by +the target ABI will be overwritten by any function call in the +assignment, including library calls for arithmetic operators. Also a +register may be clobbered when generating some operations, like variable +shift, memory copy or memory move on x86. Assuming it is a +call-clobbered register, this may happen to 'r0' above by the assignment +to 'p2'. If you have to use such a register, use temporary variables +for expressions between the register assignment and use: + + int t1 = ...; + register int *p1 asm ("r0") = ...; + register int *p2 asm ("r1") = t1; + register int *result asm ("r0"); + asm ("sysint" : "=r" (result) : "0" (p1), "r" (p2)); + + Some instructions clobber specific hard registers. To describe this, +write a third colon after the input operands, followed by the names of +the clobbered hard registers (given as strings). Here is a realistic +example for the VAX: + + asm volatile ("movc3 %0,%1,%2" + : /* no outputs */ + : "g" (from), "g" (to), "g" (count) + : "r0", "r1", "r2", "r3", "r4", "r5"); + + You may not write a clobber description in a way that overlaps with an +input or output operand. For example, you may not have an operand +describing a register class with one member if you mention that register +in the clobber list. Variables declared to live in specific registers +(*note Explicit Reg Vars::), and used as asm input or output operands +must have no part mentioned in the clobber description. There is no way +for you to specify that an input operand is modified without also +specifying it as an output operand. Note that if all the output +operands you specify are for this purpose (and hence unused), you then +also need to specify 'volatile' for the 'asm' construct, as described +below, to prevent GCC from deleting the 'asm' statement as unused. + + If you refer to a particular hardware register from the assembler code, +you probably have to list the register after the third colon to tell the +compiler the register's value is modified. In some assemblers, the +register names begin with '%'; to produce one '%' in the assembler code, +you must write '%%' in the input. + + If your assembler instruction can alter the condition code register, +add 'cc' to the list of clobbered registers. GCC on some machines +represents the condition codes as a specific hardware register; 'cc' +serves to name this register. On other machines, the condition code is +handled differently, and specifying 'cc' has no effect. But it is valid +no matter what the machine. + + If your assembler instructions access memory in an unpredictable +fashion, add 'memory' to the list of clobbered registers. This causes +GCC to not keep memory values cached in registers across the assembler +instruction and not optimize stores or loads to that memory. You also +should add the 'volatile' keyword if the memory affected is not listed +in the inputs or outputs of the 'asm', as the 'memory' clobber does not +count as a side-effect of the 'asm'. If you know how large the accessed +memory is, you can add it as input or output but if this is not known, +you should add 'memory'. As an example, if you access ten bytes of a +string, you can use a memory input like: + + {"m"( ({ struct { char x[10]; } *p = (void *)ptr ; *p; }) )}. + + Note that in the following example the memory input is necessary, +otherwise GCC might optimize the store to 'x' away: + int foo () + { + int x = 42; + int *y = &x; + int result; + asm ("magic stuff accessing an 'int' pointed to by '%1'" + : "=&d" (result) : "a" (y), "m" (*y)); + return result; + } + + You can put multiple assembler instructions together in a single 'asm' +template, separated by the characters normally used in assembly code for +the system. A combination that works in most places is a newline to +break the line, plus a tab character to move to the instruction field +(written as '\n\t'). Sometimes semicolons can be used, if the assembler +allows semicolons as a line-breaking character. Note that some +assembler dialects use semicolons to start a comment. The input +operands are guaranteed not to use any of the clobbered registers, and +neither do the output operands' addresses, so you can read and write the +clobbered registers as many times as you like. Here is an example of +multiple instructions in a template; it assumes the subroutine '_foo' +accepts arguments in registers 9 and 10: + + asm ("movl %0,r9\n\tmovl %1,r10\n\tcall _foo" + : /* no outputs */ + : "g" (from), "g" (to) + : "r9", "r10"); + + Unless an output operand has the '&' constraint modifier, GCC may +allocate it in the same register as an unrelated input operand, on the +assumption the inputs are consumed before the outputs are produced. +This assumption may be false if the assembler code actually consists of +more than one instruction. In such a case, use '&' for each output +operand that may not overlap an input. *Note Modifiers::. + + If you want to test the condition code produced by an assembler +instruction, you must include a branch and a label in the 'asm' +construct, as follows: + + asm ("clr %0\n\tfrob %1\n\tbeq 0f\n\tmov #1,%0\n0:" + : "g" (result) + : "g" (input)); + +This assumes your assembler supports local labels, as the GNU assembler +and most Unix assemblers do. + + Speaking of labels, jumps from one '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. *Note +Extended asm with goto::. + + Usually the most convenient way to use these 'asm' instructions is to +encapsulate them in macros that look like functions. For example, + + #define sin(x) \ + ({ double __value, __arg = (x); \ + asm ("fsinx %1,%0": "=f" (__value): "f" (__arg)); \ + __value; }) + +Here the variable '__arg' is used to make sure that the instruction +operates on a proper 'double' value, and to accept only those arguments +'x' that can convert automatically to a 'double'. + + Another way to make sure the instruction operates on the correct data +type is to use a cast in the 'asm'. This is different from using a +variable '__arg' in that it converts more different types. For example, +if the desired type is 'int', casting the argument to 'int' accepts a +pointer with no complaint, while assigning the argument to an 'int' +variable named '__arg' warns about using a pointer unless the caller +explicitly casts it. + + If an 'asm' has output operands, GCC assumes for optimization purposes +the instruction has no side effects except to change the output +operands. This does not mean instructions with a side effect cannot be +used, but you must be careful, because the compiler may eliminate them +if the output operands aren't used, or move them out of loops, or +replace two with one if they constitute a common subexpression. Also, +if your instruction does have a side effect on a variable that otherwise +appears not to change, the old value of the variable may be reused later +if it happens to be found in a register. + + You can prevent an 'asm' instruction from being deleted by writing the +keyword 'volatile' after the 'asm'. For example: + + #define get_and_set_priority(new) \ + ({ int __old; \ + asm volatile ("get_and_set_priority %0, %1" \ + : "=g" (__old) : "g" (new)); \ + __old; }) + +The 'volatile' keyword indicates that the instruction has important +side-effects. GCC does not delete a volatile 'asm' if it is reachable. +(The instruction can still be deleted if GCC can prove that control flow +never reaches the location of the instruction.) Note that even a +volatile 'asm' instruction can be moved relative to other code, +including across jump instructions. For example, on many targets there +is a system register that can be set to control the rounding mode of +floating-point operations. You might try setting it with a volatile +'asm', like this PowerPC example: + + asm volatile("mtfsf 255,%0" : : "f" (fpenv)); + sum = x + y; + +This does not work reliably, as the compiler may move the addition back +before the volatile 'asm'. To make it work you need to add an +artificial dependency to the 'asm' referencing a variable in the code +you don't want moved, for example: + + asm volatile ("mtfsf 255,%1" : "=X"(sum): "f"(fpenv)); + sum = x + y; + + Similarly, you can't expect a sequence of volatile 'asm' instructions +to remain perfectly consecutive. If you want consecutive output, use a +single 'asm'. Also, GCC performs some optimizations across a volatile +'asm' instruction; GCC does not "forget everything" when it encounters a +volatile 'asm' instruction the way some other compilers do. + + An 'asm' instruction without any output operands is treated identically +to a volatile 'asm' instruction. + + It is a natural idea to look for a way to give access to the condition +code left by the assembler instruction. However, when we attempted to +implement this, we found no way to make it work reliably. The problem +is that output operands might need reloading, which result in additional +following "store" instructions. On most machines, these instructions +alter the condition code before there is time to test it. This problem +doesn't arise for ordinary "test" and "compare" instructions because +they don't have any output operands. + + 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. + + As of GCC version 4.5, '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 'asm' is also +assumed to fall through to the next statement. + + This form of '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 'asm goto' may be lifted in +some future version of the compiler. In the meantime, 'asm goto' may +include a memory clobber, and so leave outputs in memory. + + 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; + } + +In this (inefficient) example, the 'frob' instruction sets the carry bit +to indicate an error. The 'jc' instruction detects this and branches to +the 'error' label. Finally, the output of the 'frob' instruction +('%r5') is stored into the memory for variable 'y', which is later read +by the 'return' statement. + + 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); + } + +In this (also inefficient) example, the 'mfsr' instruction reads an +address from some out-of-band machine register, and the following 'jmp' +instruction branches to that address. The address read by the 'mfsr' +instruction is assumed to have been previously set via some +application-specific mechanism to be one of the four values stored in +the 'doit_table' section. Finally, the 'asm' is followed by a call to +'__builtin_unreachable' to indicate that the 'asm' does not in fact fall +through. + + #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__) + +In this example (which in fact inspired the 'asm goto' feature) we want +on rare occasions to call the 'trace' function; on other occasions we'd +like to keep the overhead to the absolute minimum. The normal code path +consists of a single 'nop' instruction. However, we record the address +of this 'nop' together with the address of a label that calls the +'trace' function. This allows the 'nop' instruction to be patched at +run time to be an unconditional branch to the stored label. It is +assumed that an optimizing compiler moves the labeled block out of line, +to optimize the fall through path from the 'asm'. + + If you are writing a header file that should be includable in ISO C +programs, write '__asm__' instead of 'asm'. *Note Alternate Keywords::. + +6.41.1 Size of an 'asm' +----------------------- + +Some targets require that GCC track the size of each instruction used in +order to generate correct code. Because the final length of an 'asm' is +only known by the assembler, GCC must make an estimate as to how big it +will be. The estimate is formed by counting the number of statements in +the pattern of the 'asm' and multiplying that by the length of the +longest instruction on that processor. Statements in the 'asm' are +identified by newline characters and whatever statement separator +characters are supported by the assembler; on most processors this is +the ';' character. + + Normally, GCC's estimate is perfectly adequate to ensure that correct +code is generated, but it is possible to confuse the compiler if you use +pseudo instructions or assembler macros that expand into multiple real +instructions or if you use assembler directives that expand to more +space in the object file than is needed for a single instruction. If +this happens then the assembler produces a diagnostic saying that a +label is unreachable. + +6.41.2 i386 floating-point asm operands +--------------------------------------- + +On i386 targets, there are several rules on the usage of stack-like +registers in the operands of an 'asm'. These rules apply only to the +operands that are stack-like registers: + + 1. Given a set of input registers that die in an 'asm', it is + necessary to know which are implicitly popped by the 'asm', and + which must be explicitly popped by GCC. + + An input register that is implicitly popped by the 'asm' must be + explicitly clobbered, unless it is constrained to match an output + operand. + + 2. For any input register that is implicitly popped by an 'asm', it is + necessary to know how to adjust the stack to compensate for the + pop. If any non-popped input is closer to the top of the reg-stack + than the implicitly popped register, it would not be possible to + know what the stack looked like--it's not clear how the rest of the + stack "slides up". + + All implicitly popped input registers must be closer to the top of + the reg-stack than any input that is not implicitly popped. + + It is possible that if an input dies in an 'asm', the compiler + might use the input register for an output reload. Consider this + example: + + asm ("foo" : "=t" (a) : "f" (b)); + + This code says that input 'b' is not popped by the 'asm', and that + the 'asm' pushes a result onto the reg-stack, i.e., the stack is + one deeper after the 'asm' than it was before. But, it is possible + that reload may think that it can use the same register for both + the input and the output. + + To prevent this from happening, if any input operand uses the 'f' + constraint, all output register constraints must use the '&' + early-clobber modifier. + + The example above would be correctly written as: + + asm ("foo" : "=&t" (a) : "f" (b)); + + 3. Some operands need to be in particular places on the stack. All + output operands fall in this category--GCC has no other way to know + which registers the outputs appear in unless you indicate this in + the constraints. + + Output operands must specifically indicate which register an output + appears in after an 'asm'. '=f' is not allowed: the operand + constraints must select a class with a single register. + + 4. Output operands may not be "inserted" between existing stack + registers. Since no 387 opcode uses a read/write operand, all + output operands are dead before the 'asm', and are pushed by the + 'asm'. It makes no sense to push anywhere but the top of the + reg-stack. + + Output operands must start at the top of the reg-stack: output + operands may not "skip" a register. + + 5. Some 'asm' statements may need extra stack space for internal + calculations. This can be guaranteed by clobbering stack registers + unrelated to the inputs and outputs. + + Here are a couple of reasonable 'asm's to want to write. This 'asm' +takes one input, which is internally popped, and produces two outputs. + + asm ("fsincos" : "=t" (cos), "=u" (sin) : "0" (inp)); + +This 'asm' takes two inputs, which are popped by the 'fyl2xp1' opcode, +and replaces them with one output. The 'st(1)' clobber is necessary for +the compiler to know that 'fyl2xp1' pops both inputs. + + asm ("fyl2xp1" : "=t" (result) : "0" (x), "u" (y) : "st(1)"); + + +File: gcc.info, Node: Constraints, Next: Asm Labels, Prev: Extended Asm, Up: C Extensions + +6.42 Constraints for 'asm' Operands +=================================== + +Here are specific details on what constraint letters you can use with +'asm' operands. Constraints can say whether an operand may be in a +register, and which kinds of register; whether the operand can be a +memory reference, and which kinds of address; whether the operand may be +an immediate constant, and which possible values it may have. +Constraints can also require two operands to match. Side-effects aren't +allowed in operands of inline 'asm', unless '<' or '>' constraints are +used, because there is no guarantee that the side-effects will happen +exactly once in an instruction that can update the addressing register. + +* Menu: + +* Simple Constraints:: Basic use of constraints. +* Multi-Alternative:: When an insn has two alternative constraint-patterns. +* Modifiers:: More precise control over effects of constraints. +* Machine Constraints:: Special constraints for some particular machines. + + +File: gcc.info, Node: Simple Constraints, Next: Multi-Alternative, Up: Constraints + +6.42.1 Simple Constraints +------------------------- + +The simplest kind of constraint is a string full of letters, each of +which describes one kind of operand that is permitted. Here are the +letters that are allowed: + +whitespace + Whitespace characters are ignored and can be inserted at any + position except the first. This enables each alternative for + different operands to be visually aligned in the machine + description even if they have different number of constraints and + modifiers. + +'m' + A memory operand is allowed, with any kind of address that the + machine supports in general. Note that the letter used for the + general memory constraint can be re-defined by a back end using the + 'TARGET_MEM_CONSTRAINT' macro. + +'o' + A memory operand is allowed, but only if the address is + "offsettable". This means that adding a small integer (actually, + the width in bytes of the operand, as determined by its machine + mode) may be added to the address and the result is also a valid + memory address. + + For example, an address which is constant is offsettable; so is an + address that is the sum of a register and a constant (as long as a + slightly larger constant is also within the range of + address-offsets supported by the machine); but an autoincrement or + autodecrement address is not offsettable. More complicated + indirect/indexed addresses may or may not be offsettable depending + on the other addressing modes that the machine supports. + + Note that in an output operand which can be matched by another + operand, the constraint letter 'o' is valid only when accompanied + by both '<' (if the target machine has predecrement addressing) and + '>' (if the target machine has preincrement addressing). + +'V' + A memory operand that is not offsettable. In other words, anything + that would fit the 'm' constraint but not the 'o' constraint. + +'<' + A memory operand with autodecrement addressing (either predecrement + or postdecrement) is allowed. In inline 'asm' this constraint is + only allowed if the operand is used exactly once in an instruction + that can handle the side-effects. Not using an operand with '<' in + constraint string in the inline 'asm' pattern at all or using it in + multiple instructions isn't valid, because the side-effects + wouldn't be performed or would be performed more than once. + Furthermore, on some targets the operand with '<' in constraint + string must be accompanied by special instruction suffixes like + '%U0' instruction suffix on PowerPC or '%P0' on IA-64. + +'>' + A memory operand with autoincrement addressing (either preincrement + or postincrement) is allowed. In inline 'asm' the same + restrictions as for '<' apply. + +'r' + A register operand is allowed provided that it is in a general + register. + +'i' + An immediate integer operand (one with constant value) is allowed. + This includes symbolic constants whose values will be known only at + assembly time or later. + +'n' + An immediate integer operand with a known numeric value is allowed. + Many systems cannot support assembly-time constants for operands + less than a word wide. Constraints for these operands should use + 'n' rather than 'i'. + +'I', 'J', 'K', ... 'P' + Other letters in the range 'I' through 'P' may be defined in a + machine-dependent fashion to permit immediate integer operands with + explicit integer values in specified ranges. For example, on the + 68000, 'I' is defined to stand for the range of values 1 to 8. + This is the range permitted as a shift count in the shift + instructions. + +'E' + An immediate floating operand (expression code 'const_double') is + allowed, but only if the target floating point format is the same + as that of the host machine (on which the compiler is running). + +'F' + An immediate floating operand (expression code 'const_double' or + 'const_vector') is allowed. + +'G', 'H' + 'G' and 'H' may be defined in a machine-dependent fashion to permit + immediate floating operands in particular ranges of values. + +'s' + An immediate integer operand whose value is not an explicit integer + is allowed. + + This might appear strange; if an insn allows a constant operand + with a value not known at compile time, it certainly must allow any + known value. So why use 's' instead of 'i'? Sometimes it allows + better code to be generated. + + For example, on the 68000 in a fullword instruction it is possible + to use an immediate operand; but if the immediate value is between + -128 and 127, better code results from loading the value into a + register and using the register. This is because the load into the + register can be done with a 'moveq' instruction. We arrange for + this to happen by defining the letter 'K' to mean "any integer + outside the range -128 to 127", and then specifying 'Ks' in the + operand constraints. + +'g' + Any register, memory or immediate integer operand is allowed, + except for registers that are not general registers. + +'X' + Any operand whatsoever is allowed. + +'0', '1', '2', ... '9' + An operand that matches the specified operand number is allowed. + If a digit is used together with letters within the same + alternative, the digit should come last. + + This number is allowed to be more than a single digit. If multiple + digits are encountered consecutively, they are interpreted as a + single decimal integer. There is scant chance for ambiguity, since + to-date it has never been desirable that '10' be interpreted as + matching either operand 1 _or_ operand 0. Should this be desired, + one can use multiple alternatives instead. + + This is called a "matching constraint" and what it really means is + that the assembler has only a single operand that fills two roles + which 'asm' distinguishes. For example, an add instruction uses + two input operands and an output operand, but on most CISC machines + an add instruction really has only two operands, one of them an + input-output operand: + + addl #35,r12 + + Matching constraints are used in these circumstances. More + precisely, the two operands that match must include one input-only + operand and one output-only operand. Moreover, the digit must be a + smaller number than the number of the operand that uses it in the + constraint. + +'p' + An operand that is a valid memory address is allowed. This is for + "load address" and "push address" instructions. + + 'p' in the constraint must be accompanied by 'address_operand' as + the predicate in the 'match_operand'. This predicate interprets + the mode specified in the 'match_operand' as the mode of the memory + reference for which the address would be valid. + +OTHER-LETTERS + Other letters can be defined in machine-dependent fashion to stand + for particular classes of registers or other arbitrary operand + types. 'd', 'a' and 'f' are defined on the 68000/68020 to stand + for data, address and floating point registers. + + +File: gcc.info, Node: Multi-Alternative, Next: Modifiers, Prev: Simple Constraints, Up: Constraints + +6.42.2 Multiple Alternative Constraints +--------------------------------------- + +Sometimes a single instruction has multiple alternative sets of possible +operands. For example, on the 68000, a logical-or instruction can +combine register or an immediate value into memory, or it can combine +any kind of operand into a register; but it cannot combine one memory +location into another. + + These constraints are represented as multiple alternatives. An +alternative can be described by a series of letters for each operand. +The overall constraint for an operand is made from the letters for this +operand from the first alternative, a comma, the letters for this +operand from the second alternative, a comma, and so on until the last +alternative. + + If all the operands fit any one alternative, the instruction is valid. +Otherwise, for each alternative, the compiler counts how many +instructions must be added to copy the operands so that that alternative +applies. The alternative requiring the least copying is chosen. If two +alternatives need the same amount of copying, the one that comes first +is chosen. These choices can be altered with the '?' and '!' +characters: + +'?' + Disparage slightly the alternative that the '?' appears in, as a + choice when no alternative applies exactly. The compiler regards + this alternative as one unit more costly for each '?' that appears + in it. + +'!' + Disparage severely the alternative that the '!' appears in. This + alternative can still be used if it fits without reloading, but if + reloading is needed, some other alternative will be used. + + +File: gcc.info, Node: Modifiers, Next: Machine Constraints, Prev: Multi-Alternative, Up: Constraints + +6.42.3 Constraint Modifier Characters +------------------------------------- + +Here are constraint modifier characters. + +'=' + Means that this operand is write-only for this instruction: the + previous value is discarded and replaced by output data. + +'+' + Means that this operand is both read and written by the + instruction. + + When the compiler fixes up the operands to satisfy the constraints, + it needs to know which operands are inputs to the instruction and + which are outputs from it. '=' identifies an output; '+' + identifies an operand that is both input and output; all other + operands are assumed to be input only. + + If you specify '=' or '+' in a constraint, you put it in the first + character of the constraint string. + +'&' + Means (in a particular alternative) that this operand is an + "earlyclobber" operand, which is modified before the instruction is + finished using the input operands. Therefore, this operand may not + lie in a register that is used as an input operand or as part of + any memory address. + + '&' applies only to the alternative in which it is written. In + constraints with multiple alternatives, sometimes one alternative + requires '&' while others do not. See, for example, the 'movdf' + insn of the 68000. + + An input operand can be tied to an earlyclobber operand if its only + use as an input occurs before the early result is written. Adding + alternatives of this form often allows GCC to produce better code + when only some of the inputs can be affected by the earlyclobber. + See, for example, the 'mulsi3' insn of the ARM. + + '&' does not obviate the need to write '='. + +'%' + Declares the instruction to be commutative for this operand and the + following operand. This means that the compiler may interchange + the two operands if that is the cheapest way to make all operands + fit the constraints. GCC can only handle one commutative pair in + an asm; if you use more, the compiler may fail. Note that you need + not use the modifier if the two alternatives are strictly + identical; this would only waste time in the reload pass. The + modifier is not operational after register allocation, so the + result of 'define_peephole2' and 'define_split's performed after + reload cannot rely on '%' to make the intended insn match. + +'#' + Says that all following characters, up to the next comma, are to be + ignored as a constraint. They are significant only for choosing + register preferences. + +'*' + Says that the following character should be ignored when choosing + register preferences. '*' has no effect on the meaning of the + constraint as a constraint, and no effect on reloading. For LRA + '*' additionally disparages slightly the alternative if the + following character matches the operand. + + +File: gcc.info, Node: Machine Constraints, Prev: Modifiers, Up: Constraints + +6.42.4 Constraints for Particular Machines +------------------------------------------ + +Whenever possible, you should use the general-purpose constraint letters +in 'asm' arguments, since they will convey meaning more readily to +people reading your code. Failing that, use the constraint letters that +usually have very similar meanings across architectures. The most +commonly used constraints are 'm' and 'r' (for memory and +general-purpose registers respectively; *note Simple Constraints::), and +'I', usually the letter indicating the most common immediate-constant +format. + + Each architecture defines additional constraints. These constraints +are used by the compiler itself for instruction generation, as well as +for 'asm' statements; therefore, some of the constraints are not +particularly useful for 'asm'. Here is a summary of some of the +machine-dependent constraints available on some particular machines; it +includes both constraints that are useful for 'asm' and constraints that +aren't. The compiler source file mentioned in the table heading for +each architecture is the definitive reference for the meanings of that +architecture's constraints. + +_AArch64 family--'config/aarch64/constraints.md'_ + 'k' + The stack pointer register ('SP') + + 'w' + Floating point or SIMD vector register + + 'I' + Integer constant that is valid as an immediate operand in an + 'ADD' instruction + + 'J' + Integer constant that is valid as an immediate operand in a + 'SUB' instruction (once negated) + + 'K' + Integer constant that can be used with a 32-bit logical + instruction + + 'L' + Integer constant that can be used with a 64-bit logical + instruction + + 'M' + Integer constant that is valid as an immediate operand in a + 32-bit 'MOV' pseudo instruction. The 'MOV' may be assembled + to one of several different machine instructions depending on + the value + + 'N' + Integer constant that is valid as an immediate operand in a + 64-bit 'MOV' pseudo instruction + + 'S' + An absolute symbolic address or a label reference + + 'Y' + Floating point constant zero + + 'Z' + Integer constant zero + + 'Ush' + The high part (bits 12 and upwards) of the pc-relative address + of a symbol within 4GB of the instruction + + 'Q' + A memory address which uses a single base register with no + offset + + 'Ump' + A memory address suitable for a load/store pair instruction in + SI, DI, SF and DF modes + +_ARC --'config/arc/constraints.md'_ + 'q' + Registers usable in ARCompact 16-bit instructions: 'r0'-'r3', + 'r12'-'r15'. This constraint can only match when the '-mq' + option is in effect. + + 'e' + Registers usable as base-regs of memory addresses in ARCompact + 16-bit memory instructions: 'r0'-'r3', 'r12'-'r15', 'sp'. + This constraint can only match when the '-mq' option is in + effect. + 'D' + ARC FPX (dpfp) 64-bit registers. 'D0', 'D1'. + + 'I' + A signed 12-bit integer constant. + + 'Cal' + constant for arithmetic/logical operations. This might be any + constant that can be put into a long immediate by the assmbler + or linker without involving a PIC relocation. + + 'K' + A 3-bit unsigned integer constant. + + 'L' + A 6-bit unsigned integer constant. + + 'CnL' + One's complement of a 6-bit unsigned integer constant. + + 'CmL' + Two's complement of a 6-bit unsigned integer constant. + + 'M' + A 5-bit unsigned integer constant. + + 'O' + A 7-bit unsigned integer constant. + + 'P' + A 8-bit unsigned integer constant. + + 'H' + Any const_double value. + +_ARM family--'config/arm/constraints.md'_ + 'w' + VFP floating-point register + + 'G' + The floating-point constant 0.0 + + 'I' + Integer that is valid as an immediate operand in a data + processing instruction. That is, an integer in the range 0 to + 255 rotated by a multiple of 2 + + 'J' + Integer in the range -4095 to 4095 + + 'K' + Integer that satisfies constraint 'I' when inverted (ones + complement) + + 'L' + Integer that satisfies constraint 'I' when negated (twos + complement) + + 'M' + Integer in the range 0 to 32 + + 'Q' + A memory reference where the exact address is in a single + register (''m'' is preferable for 'asm' statements) + + 'R' + An item in the constant pool + + 'S' + A symbol in the text segment of the current file + + 'Uv' + A memory reference suitable for VFP load/store insns + (reg+constant offset) + + 'Uy' + A memory reference suitable for iWMMXt load/store + instructions. + + 'Uq' + A memory reference suitable for the ARMv4 ldrsb instruction. + +_AVR family--'config/avr/constraints.md'_ + 'l' + Registers from r0 to r15 + + 'a' + Registers from r16 to r23 + + 'd' + Registers from r16 to r31 + + 'w' + Registers from r24 to r31. These registers can be used in + 'adiw' command + + 'e' + Pointer register (r26-r31) + + 'b' + Base pointer register (r28-r31) + + 'q' + Stack pointer register (SPH:SPL) + + 't' + Temporary register r0 + + 'x' + Register pair X (r27:r26) + + 'y' + Register pair Y (r29:r28) + + 'z' + Register pair Z (r31:r30) + + 'I' + Constant greater than -1, less than 64 + + 'J' + Constant greater than -64, less than 1 + + 'K' + Constant integer 2 + + 'L' + Constant integer 0 + + 'M' + Constant that fits in 8 bits + + 'N' + Constant integer -1 + + 'O' + Constant integer 8, 16, or 24 + + 'P' + Constant integer 1 + + 'G' + A floating point constant 0.0 + + 'Q' + A memory address based on Y or Z pointer with displacement. + +_Epiphany--'config/epiphany/constraints.md'_ + 'U16' + An unsigned 16-bit constant. + + 'K' + An unsigned 5-bit constant. + + 'L' + A signed 11-bit constant. + + 'Cm1' + A signed 11-bit constant added to -1. Can only match when the + '-m1reg-REG' option is active. + + 'Cl1' + Left-shift of -1, i.e., a bit mask with a block of leading + ones, the rest being a block of trailing zeroes. Can only + match when the '-m1reg-REG' option is active. + + 'Cr1' + Right-shift of -1, i.e., a bit mask with a trailing block of + ones, the rest being zeroes. Or to put it another way, one + less than a power of two. Can only match when the + '-m1reg-REG' option is active. + + 'Cal' + Constant for arithmetic/logical operations. This is like 'i', + except that for position independent code, no symbols / + expressions needing relocations are allowed. + + 'Csy' + Symbolic constant for call/jump instruction. + + 'Rcs' + The register class usable in short insns. This is a register + class constraint, and can thus drive register allocation. + This constraint won't match unless '-mprefer-short-insn-regs' + is in effect. + + 'Rsc' + The the register class of registers that can be used to hold a + sibcall call address. I.e., a caller-saved register. + + 'Rct' + Core control register class. + + 'Rgs' + The register group usable in short insns. This constraint + does not use a register class, so that it only passively + matches suitable registers, and doesn't drive register + allocation. + + 'Rra' + Matches the return address if it can be replaced with the link + register. + + 'Rcc' + Matches the integer condition code register. + + 'Sra' + Matches the return address if it is in a stack slot. + + 'Cfm' + Matches control register values to switch fp mode, which are + encapsulated in 'UNSPEC_FP_MODE'. + +_CR16 Architecture--'config/cr16/cr16.h'_ + + 'b' + Registers from r0 to r14 (registers without stack pointer) + + 't' + Register from r0 to r11 (all 16-bit registers) + + 'p' + Register from r12 to r15 (all 32-bit registers) + + 'I' + Signed constant that fits in 4 bits + + 'J' + Signed constant that fits in 5 bits + + 'K' + Signed constant that fits in 6 bits + + 'L' + Unsigned constant that fits in 4 bits + + 'M' + Signed constant that fits in 32 bits + + 'N' + Check for 64 bits wide constants for add/sub instructions + + 'G' + Floating point constant that is legal for store immediate + +_Hewlett-Packard PA-RISC--'config/pa/pa.h'_ + 'a' + General register 1 + + 'f' + Floating point register + + 'q' + Shift amount register + + 'x' + Floating point register (deprecated) + + 'y' + Upper floating point register (32-bit), floating point + register (64-bit) + + 'Z' + Any register + + 'I' + Signed 11-bit integer constant + + 'J' + Signed 14-bit integer constant + + 'K' + Integer constant that can be deposited with a 'zdepi' + instruction + + 'L' + Signed 5-bit integer constant + + 'M' + Integer constant 0 + + 'N' + Integer constant that can be loaded with a 'ldil' instruction + + 'O' + Integer constant whose value plus one is a power of 2 + + 'P' + Integer constant that can be used for 'and' operations in + 'depi' and 'extru' instructions + + 'S' + Integer constant 31 + + 'U' + Integer constant 63 + + 'G' + Floating-point constant 0.0 + + 'A' + A 'lo_sum' data-linkage-table memory operand + + 'Q' + A memory operand that can be used as the destination operand + of an integer store instruction + + 'R' + A scaled or unscaled indexed memory operand + + 'T' + A memory operand for floating-point loads and stores + + 'W' + A register indirect memory operand + +_picoChip family--'picochip.h'_ + 'k' + Stack register. + + 'f' + Pointer register. A register which can be used to access + memory without supplying an offset. Any other register can be + used to access memory, but will need a constant offset. In + the case of the offset being zero, it is more efficient to use + a pointer register, since this reduces code size. + + 't' + A twin register. A register which may be paired with an + adjacent register to create a 32-bit register. + + 'a' + Any absolute memory address (e.g., symbolic constant, symbolic + constant + offset). + + 'I' + 4-bit signed integer. + + 'J' + 4-bit unsigned integer. + + 'K' + 8-bit signed integer. + + 'M' + Any constant whose absolute value is no greater than 4-bits. + + 'N' + 10-bit signed integer + + 'O' + 16-bit signed integer. + +_PowerPC and IBM RS6000--'config/rs6000/constraints.md'_ + 'b' + Address base register + + 'd' + Floating point register (containing 64-bit value) + + 'f' + Floating point register (containing 32-bit value) + + 'v' + Altivec vector register + + 'wa' + Any VSX register if the -mvsx option was used or NO_REGS. + + 'wd' + VSX vector register to hold vector double data or NO_REGS. + + 'wf' + VSX vector register to hold vector float data or NO_REGS. + + 'wg' + If '-mmfpgpr' was used, a floating point register or NO_REGS. + + 'wl' + Floating point register if the LFIWAX instruction is enabled + or NO_REGS. + + 'wm' + VSX register if direct move instructions are enabled, or + NO_REGS. + + 'wn' + No register (NO_REGS). + + 'wr' + General purpose register if 64-bit instructions are enabled or + NO_REGS. + + 'ws' + VSX vector register to hold scalar double values or NO_REGS. + + 'wt' + VSX vector register to hold 128 bit integer or NO_REGS. + + 'wu' + Altivec register to use for float/32-bit int loads/stores or + NO_REGS. + + 'wv' + Altivec register to use for double loads/stores or NO_REGS. + + 'ww' + FP or VSX register to perform float operations under '-mvsx' + or NO_REGS. + + 'wx' + Floating point register if the STFIWX instruction is enabled + or NO_REGS. + + 'wy' + VSX vector register to hold scalar float values or NO_REGS. + + 'wz' + Floating point register if the LFIWZX instruction is enabled + or NO_REGS. + + 'wD' + Int constant that is the element number of the 64-bit scalar + in a vector. + + 'wQ' + A memory address that will work with the 'lq' and 'stq' + instructions. + + 'h' + 'MQ', 'CTR', or 'LINK' register + + 'q' + 'MQ' register + + 'c' + 'CTR' register + + 'l' + 'LINK' register + + 'x' + 'CR' register (condition register) number 0 + + 'y' + 'CR' register (condition register) + + 'z' + 'XER[CA]' carry bit (part of the XER register) + + 'I' + Signed 16-bit constant + + 'J' + Unsigned 16-bit constant shifted left 16 bits (use 'L' instead + for 'SImode' constants) + + 'K' + Unsigned 16-bit constant + + 'L' + Signed 16-bit constant shifted left 16 bits + + 'M' + Constant larger than 31 + + 'N' + Exact power of 2 + + 'O' + Zero + + 'P' + Constant whose negation is a signed 16-bit constant + + 'G' + Floating point constant that can be loaded into a register + with one instruction per word + + 'H' + Integer/Floating point constant that can be loaded into a + register using three instructions + + 'm' + Memory operand. Normally, 'm' does not allow addresses that + update the base register. If '<' or '>' constraint is also + used, they are allowed and therefore on PowerPC targets in + that case it is only safe to use 'm<>' in an 'asm' statement + if that 'asm' statement accesses the operand exactly once. + The 'asm' statement must also use '%U<OPNO>' as a placeholder + for the "update" flag in the corresponding load or store + instruction. For example: + + asm ("st%U0 %1,%0" : "=m<>" (mem) : "r" (val)); + + is correct but: + + asm ("st %1,%0" : "=m<>" (mem) : "r" (val)); + + is not. + + 'es' + A "stable" memory operand; that is, one which does not include + any automodification of the base register. This used to be + useful when 'm' allowed automodification of the base register, + but as those are now only allowed when '<' or '>' is used, + 'es' is basically the same as 'm' without '<' and '>'. + + 'Q' + Memory operand that is an offset from a register (it is + usually better to use 'm' or 'es' in 'asm' statements) + + 'Z' + Memory operand that is an indexed or indirect from a register + (it is usually better to use 'm' or 'es' in 'asm' statements) + + 'R' + AIX TOC entry + + 'a' + Address operand that is an indexed or indirect from a register + ('p' is preferable for 'asm' statements) + + 'S' + Constant suitable as a 64-bit mask operand + + 'T' + Constant suitable as a 32-bit mask operand + + 'U' + System V Release 4 small data area reference + + 't' + AND masks that can be performed by two rldic{l, r} + instructions + + 'W' + Vector constant that does not require memory + + 'j' + Vector constant that is all zeros. + +_Intel 386--'config/i386/constraints.md'_ + 'R' + Legacy register--the eight integer registers available on all + i386 processors ('a', 'b', 'c', 'd', 'si', 'di', 'bp', 'sp'). + + 'q' + Any register accessible as 'Rl'. In 32-bit mode, 'a', 'b', + 'c', and 'd'; in 64-bit mode, any integer register. + + 'Q' + Any register accessible as 'Rh': 'a', 'b', 'c', and 'd'. + + 'a' + The 'a' register. + + 'b' + The 'b' register. + + 'c' + The 'c' register. + + 'd' + The 'd' register. + + 'S' + The 'si' register. + + 'D' + The 'di' register. + + 'A' + The 'a' and 'd' registers. This class is used for + instructions that return double word results in the 'ax:dx' + register pair. Single word values will be allocated either in + 'ax' or 'dx'. For example on i386 the following implements + 'rdtsc': + + unsigned long long rdtsc (void) + { + unsigned long long tick; + __asm__ __volatile__("rdtsc":"=A"(tick)); + return tick; + } + + This is not correct on x86_64 as it would allocate tick in + either 'ax' or 'dx'. You have to use the following variant + instead: + + unsigned long long rdtsc (void) + { + unsigned int tickl, tickh; + __asm__ __volatile__("rdtsc":"=a"(tickl),"=d"(tickh)); + return ((unsigned long long)tickh << 32)|tickl; + } + + 'f' + Any 80387 floating-point (stack) register. + + 't' + Top of 80387 floating-point stack ('%st(0)'). + + 'u' + Second from top of 80387 floating-point stack ('%st(1)'). + + 'y' + Any MMX register. + + 'x' + Any SSE register. + + 'Yz' + First SSE register ('%xmm0'). + + 'I' + Integer constant in the range 0 ... 31, for 32-bit shifts. + + 'J' + Integer constant in the range 0 ... 63, for 64-bit shifts. + + 'K' + Signed 8-bit integer constant. + + 'L' + '0xFF' or '0xFFFF', for andsi as a zero-extending move. + + 'M' + 0, 1, 2, or 3 (shifts for the 'lea' instruction). + + 'N' + Unsigned 8-bit integer constant (for 'in' and 'out' + instructions). + + 'G' + Standard 80387 floating point constant. + + 'C' + Standard SSE floating point constant. + + 'e' + 32-bit signed integer constant, or a symbolic reference known + to fit that range (for immediate operands in sign-extending + x86-64 instructions). + + 'Z' + 32-bit unsigned integer constant, or a symbolic reference + known to fit that range (for immediate operands in + zero-extending x86-64 instructions). + +_Intel IA-64--'config/ia64/ia64.h'_ + 'a' + General register 'r0' to 'r3' for 'addl' instruction + + 'b' + Branch register + + 'c' + Predicate register ('c' as in "conditional") + + 'd' + Application register residing in M-unit + + 'e' + Application register residing in I-unit + + 'f' + Floating-point register + + 'm' + Memory operand. If used together with '<' or '>', the operand + can have postincrement and postdecrement which require + printing with '%Pn' on IA-64. + + 'G' + Floating-point constant 0.0 or 1.0 + + 'I' + 14-bit signed integer constant + + 'J' + 22-bit signed integer constant + + 'K' + 8-bit signed integer constant for logical instructions + + 'L' + 8-bit adjusted signed integer constant for compare pseudo-ops + + 'M' + 6-bit unsigned integer constant for shift counts + + 'N' + 9-bit signed integer constant for load and store + postincrements + + 'O' + The constant zero + + 'P' + 0 or -1 for 'dep' instruction + + 'Q' + Non-volatile memory for floating-point loads and stores + + 'R' + Integer constant in the range 1 to 4 for 'shladd' instruction + + 'S' + Memory operand except postincrement and postdecrement. This + is now roughly the same as 'm' when not used together with '<' + or '>'. + +_FRV--'config/frv/frv.h'_ + 'a' + Register in the class 'ACC_REGS' ('acc0' to 'acc7'). + + 'b' + Register in the class 'EVEN_ACC_REGS' ('acc0' to 'acc7'). + + 'c' + Register in the class 'CC_REGS' ('fcc0' to 'fcc3' and 'icc0' + to 'icc3'). + + 'd' + Register in the class 'GPR_REGS' ('gr0' to 'gr63'). + + 'e' + Register in the class 'EVEN_REGS' ('gr0' to 'gr63'). Odd + registers are excluded not in the class but through the use of + a machine mode larger than 4 bytes. + + 'f' + Register in the class 'FPR_REGS' ('fr0' to 'fr63'). + + 'h' + Register in the class 'FEVEN_REGS' ('fr0' to 'fr63'). Odd + registers are excluded not in the class but through the use of + a machine mode larger than 4 bytes. + + 'l' + Register in the class 'LR_REG' (the 'lr' register). + + 'q' + Register in the class 'QUAD_REGS' ('gr2' to 'gr63'). Register + numbers not divisible by 4 are excluded not in the class but + through the use of a machine mode larger than 8 bytes. + + 't' + Register in the class 'ICC_REGS' ('icc0' to 'icc3'). + + 'u' + Register in the class 'FCC_REGS' ('fcc0' to 'fcc3'). + + 'v' + Register in the class 'ICR_REGS' ('cc4' to 'cc7'). + + 'w' + Register in the class 'FCR_REGS' ('cc0' to 'cc3'). + + 'x' + Register in the class 'QUAD_FPR_REGS' ('fr0' to 'fr63'). + Register numbers not divisible by 4 are excluded not in the + class but through the use of a machine mode larger than 8 + bytes. + + 'z' + Register in the class 'SPR_REGS' ('lcr' and 'lr'). + + 'A' + Register in the class 'QUAD_ACC_REGS' ('acc0' to 'acc7'). + + 'B' + Register in the class 'ACCG_REGS' ('accg0' to 'accg7'). + + 'C' + Register in the class 'CR_REGS' ('cc0' to 'cc7'). + + 'G' + Floating point constant zero + + 'I' + 6-bit signed integer constant + + 'J' + 10-bit signed integer constant + + 'L' + 16-bit signed integer constant + + 'M' + 16-bit unsigned integer constant + + 'N' + 12-bit signed integer constant that is negative--i.e. in the + range of -2048 to -1 + + 'O' + Constant zero + + 'P' + 12-bit signed integer constant that is greater than zero--i.e. + in the range of 1 to 2047. + +_Blackfin family--'config/bfin/constraints.md'_ + 'a' + P register + + 'd' + D register + + 'z' + A call clobbered P register. + + 'qN' + A single register. If N is in the range 0 to 7, the + corresponding D register. If it is 'A', then the register P0. + + 'D' + Even-numbered D register + + 'W' + Odd-numbered D register + + 'e' + Accumulator register. + + 'A' + Even-numbered accumulator register. + + 'B' + Odd-numbered accumulator register. + + 'b' + I register + + 'v' + B register + + 'f' + M register + + 'c' + Registers used for circular buffering, i.e. I, B, or L + registers. + + 'C' + The CC register. + + 't' + LT0 or LT1. + + 'k' + LC0 or LC1. + + 'u' + LB0 or LB1. + + 'x' + Any D, P, B, M, I or L register. + + 'y' + Additional registers typically used only in prologues and + epilogues: RETS, RETN, RETI, RETX, RETE, ASTAT, SEQSTAT and + USP. + + 'w' + Any register except accumulators or CC. + + 'Ksh' + Signed 16 bit integer (in the range -32768 to 32767) + + 'Kuh' + Unsigned 16 bit integer (in the range 0 to 65535) + + 'Ks7' + Signed 7 bit integer (in the range -64 to 63) + + 'Ku7' + Unsigned 7 bit integer (in the range 0 to 127) + + 'Ku5' + Unsigned 5 bit integer (in the range 0 to 31) + + 'Ks4' + Signed 4 bit integer (in the range -8 to 7) + + 'Ks3' + Signed 3 bit integer (in the range -3 to 4) + + 'Ku3' + Unsigned 3 bit integer (in the range 0 to 7) + + 'PN' + Constant N, where N is a single-digit constant in the range 0 + to 4. + + 'PA' + An integer equal to one of the MACFLAG_XXX constants that is + suitable for use with either accumulator. + + 'PB' + An integer equal to one of the MACFLAG_XXX constants that is + suitable for use only with accumulator A1. + + 'M1' + Constant 255. + + 'M2' + Constant 65535. + + 'J' + An integer constant with exactly a single bit set. + + 'L' + An integer constant with all bits set except exactly one. + + 'H' + + 'Q' + Any SYMBOL_REF. + +_M32C--'config/m32c/m32c.c'_ + 'Rsp' + 'Rfb' + 'Rsb' + '$sp', '$fb', '$sb'. + + 'Rcr' + Any control register, when they're 16 bits wide (nothing if + control registers are 24 bits wide) + + 'Rcl' + Any control register, when they're 24 bits wide. + + 'R0w' + 'R1w' + 'R2w' + 'R3w' + $r0, $r1, $r2, $r3. + + 'R02' + $r0 or $r2, or $r2r0 for 32 bit values. + + 'R13' + $r1 or $r3, or $r3r1 for 32 bit values. + + 'Rdi' + A register that can hold a 64 bit value. + + 'Rhl' + $r0 or $r1 (registers with addressable high/low bytes) + + 'R23' + $r2 or $r3 + + 'Raa' + Address registers + + 'Raw' + Address registers when they're 16 bits wide. + + 'Ral' + Address registers when they're 24 bits wide. + + 'Rqi' + Registers that can hold QI values. + + 'Rad' + Registers that can be used with displacements ($a0, $a1, $sb). + + 'Rsi' + Registers that can hold 32 bit values. + + 'Rhi' + Registers that can hold 16 bit values. + + 'Rhc' + Registers chat can hold 16 bit values, including all control + registers. + + 'Rra' + $r0 through R1, plus $a0 and $a1. + + 'Rfl' + The flags register. + + 'Rmm' + The memory-based pseudo-registers $mem0 through $mem15. + + 'Rpi' + Registers that can hold pointers (16 bit registers for r8c, + m16c; 24 bit registers for m32cm, m32c). + + 'Rpa' + Matches multiple registers in a PARALLEL to form a larger + register. Used to match function return values. + + 'Is3' + -8 ... 7 + + 'IS1' + -128 ... 127 + + 'IS2' + -32768 ... 32767 + + 'IU2' + 0 ... 65535 + + 'In4' + -8 ... -1 or 1 ... 8 + + 'In5' + -16 ... -1 or 1 ... 16 + + 'In6' + -32 ... -1 or 1 ... 32 + + 'IM2' + -65536 ... -1 + + 'Ilb' + An 8 bit value with exactly one bit set. + + 'Ilw' + A 16 bit value with exactly one bit set. + + 'Sd' + The common src/dest memory addressing modes. + + 'Sa' + Memory addressed using $a0 or $a1. + + 'Si' + Memory addressed with immediate addresses. + + 'Ss' + Memory addressed using the stack pointer ($sp). + + 'Sf' + Memory addressed using the frame base register ($fb). + + 'Ss' + Memory addressed using the small base register ($sb). + + 'S1' + $r1h + +_MeP--'config/mep/constraints.md'_ + + 'a' + The $sp register. + + 'b' + The $tp register. + + 'c' + Any control register. + + 'd' + Either the $hi or the $lo register. + + 'em' + Coprocessor registers that can be directly loaded ($c0-$c15). + + 'ex' + Coprocessor registers that can be moved to each other. + + 'er' + Coprocessor registers that can be moved to core registers. + + 'h' + The $hi register. + + 'j' + The $rpc register. + + 'l' + The $lo register. + + 't' + Registers which can be used in $tp-relative addressing. + + 'v' + The $gp register. + + 'x' + The coprocessor registers. + + 'y' + The coprocessor control registers. + + 'z' + The $0 register. + + 'A' + User-defined register set A. + + 'B' + User-defined register set B. + + 'C' + User-defined register set C. + + 'D' + User-defined register set D. + + 'I' + Offsets for $gp-rel addressing. + + 'J' + Constants that can be used directly with boolean insns. + + 'K' + Constants that can be moved directly to registers. + + 'L' + Small constants that can be added to registers. + + 'M' + Long shift counts. + + 'N' + Small constants that can be compared to registers. + + 'O' + Constants that can be loaded into the top half of registers. + + 'S' + Signed 8-bit immediates. + + 'T' + Symbols encoded for $tp-rel or $gp-rel addressing. + + 'U' + Non-constant addresses for loading/saving coprocessor + registers. + + 'W' + The top half of a symbol's value. + + 'Y' + A register indirect address without offset. + + 'Z' + Symbolic references to the control bus. + +_MicroBlaze--'config/microblaze/constraints.md'_ + 'd' + A general register ('r0' to 'r31'). + + 'z' + A status register ('rmsr', '$fcc1' to '$fcc7'). + +_MIPS--'config/mips/constraints.md'_ + 'd' + An address register. This is equivalent to 'r' unless + generating MIPS16 code. + + 'f' + A floating-point register (if available). + + 'h' + Formerly the 'hi' register. This constraint is no longer + supported. + + 'l' + The 'lo' register. Use this register to store values that are + no bigger than a word. + + 'x' + The concatenated 'hi' and 'lo' registers. Use this register + to store doubleword values. + + 'c' + A register suitable for use in an indirect jump. This will + always be '$25' for '-mabicalls'. + + 'v' + Register '$3'. Do not use this constraint in new code; it is + retained only for compatibility with glibc. + + 'y' + Equivalent to 'r'; retained for backwards compatibility. + + 'z' + A floating-point condition code register. + + 'I' + A signed 16-bit constant (for arithmetic instructions). + + 'J' + Integer zero. + + 'K' + An unsigned 16-bit constant (for logic instructions). + + 'L' + A signed 32-bit constant in which the lower 16 bits are zero. + Such constants can be loaded using 'lui'. + + 'M' + A constant that cannot be loaded using 'lui', 'addiu' or + 'ori'. + + 'N' + A constant in the range -65535 to -1 (inclusive). + + 'O' + A signed 15-bit constant. + + 'P' + A constant in the range 1 to 65535 (inclusive). + + 'G' + Floating-point zero. + + 'R' + An address that can be used in a non-macro load or store. + + 'ZC' + When compiling microMIPS code, this constraint matches a + memory operand whose address is formed from a base register + and a 12-bit offset. These operands can be used for microMIPS + instructions such as 'll' and 'sc'. When not compiling for + microMIPS code, 'ZC' is equivalent to 'R'. + + 'ZD' + When compiling microMIPS code, this constraint matches an + address operand that is formed from a base register and a + 12-bit offset. These operands can be used for microMIPS + instructions such as 'prefetch'. When not compiling for + microMIPS code, 'ZD' is equivalent to 'p'. + +_Motorola 680x0--'config/m68k/constraints.md'_ + 'a' + Address register + + 'd' + Data register + + 'f' + 68881 floating-point register, if available + + 'I' + Integer in the range 1 to 8 + + 'J' + 16-bit signed number + + 'K' + Signed number whose magnitude is greater than 0x80 + + 'L' + Integer in the range -8 to -1 + + 'M' + Signed number whose magnitude is greater than 0x100 + + 'N' + Range 24 to 31, rotatert:SI 8 to 1 expressed as rotate + + 'O' + 16 (for rotate using swap) + + 'P' + Range 8 to 15, rotatert:HI 8 to 1 expressed as rotate + + 'R' + Numbers that mov3q can handle + + 'G' + Floating point constant that is not a 68881 constant + + 'S' + Operands that satisfy 'm' when -mpcrel is in effect + + 'T' + Operands that satisfy 's' when -mpcrel is not in effect + + 'Q' + Address register indirect addressing mode + + 'U' + Register offset addressing + + 'W' + const_call_operand + + 'Cs' + symbol_ref or const + + 'Ci' + const_int + + 'C0' + const_int 0 + + 'Cj' + Range of signed numbers that don't fit in 16 bits + + 'Cmvq' + Integers valid for mvq + + 'Capsw' + Integers valid for a moveq followed by a swap + + 'Cmvz' + Integers valid for mvz + + 'Cmvs' + Integers valid for mvs + + 'Ap' + push_operand + + 'Ac' + Non-register operands allowed in clr + +_Moxie--'config/moxie/constraints.md'_ + 'A' + An absolute address + + 'B' + An offset address + + 'W' + A register indirect memory operand + + 'I' + A constant in the range of 0 to 255. + + 'N' + A constant in the range of 0 to -255. + +_MSP430-'config/msp430/constraints.md'_ + + 'R12' + Register R12. + + 'R13' + Register R13. + + 'K' + Integer constant 1. + + 'L' + Integer constant -1^20..1^19. + + 'M' + Integer constant 1-4. + + 'Ya' + Memory references which do not require an extended MOVX + instruction. + + 'Yl' + Memory reference, labels only. + + 'Ys' + Memory reference, stack only. + +_NDS32--'config/nds32/constraints.md'_ + 'w' + LOW register class $r0 to $r7 constraint for V3/V3M ISA. + 'l' + LOW register class $r0 to $r7. + 'd' + MIDDLE register class $r0 to $r11, $r16 to $r19. + 'h' + HIGH register class $r12 to $r14, $r20 to $r31. + 't' + Temporary assist register $ta (i.e. $r15). + 'k' + Stack register $sp. + 'Iu03' + Unsigned immediate 3-bit value. + 'In03' + Negative immediate 3-bit value in the range of -7-0. + 'Iu04' + Unsigned immediate 4-bit value. + 'Is05' + Signed immediate 5-bit value. + 'Iu05' + Unsigned immediate 5-bit value. + 'In05' + Negative immediate 5-bit value in the range of -31-0. + 'Ip05' + Unsigned immediate 5-bit value for movpi45 instruction with + range 16-47. + 'Iu06' + Unsigned immediate 6-bit value constraint for addri36.sp + instruction. + 'Iu08' + Unsigned immediate 8-bit value. + 'Iu09' + Unsigned immediate 9-bit value. + 'Is10' + Signed immediate 10-bit value. + 'Is11' + Signed immediate 11-bit value. + 'Is15' + Signed immediate 15-bit value. + 'Iu15' + Unsigned immediate 15-bit value. + 'Ic15' + A constant which is not in the range of imm15u but ok for bclr + instruction. + 'Ie15' + A constant which is not in the range of imm15u but ok for bset + instruction. + 'It15' + A constant which is not in the range of imm15u but ok for btgl + instruction. + 'Ii15' + A constant whose compliment value is in the range of imm15u + and ok for bitci instruction. + 'Is16' + Signed immediate 16-bit value. + 'Is17' + Signed immediate 17-bit value. + 'Is19' + Signed immediate 19-bit value. + 'Is20' + Signed immediate 20-bit value. + 'Ihig' + The immediate value that can be simply set high 20-bit. + 'Izeb' + The immediate value 0xff. + 'Izeh' + The immediate value 0xffff. + 'Ixls' + The immediate value 0x01. + 'Ix11' + The immediate value 0x7ff. + 'Ibms' + The immediate value with power of 2. + 'Ifex' + The immediate value with power of 2 minus 1. + 'U33' + Memory constraint for 333 format. + 'U45' + Memory constraint for 45 format. + 'U37' + Memory constraint for 37 format. + +_Nios II family--'config/nios2/constraints.md'_ + + 'I' + Integer that is valid as an immediate operand in an + instruction taking a signed 16-bit number. Range -32768 to + 32767. + + 'J' + Integer that is valid as an immediate operand in an + instruction taking an unsigned 16-bit number. Range 0 to + 65535. + + 'K' + Integer that is valid as an immediate operand in an + instruction taking only the upper 16-bits of a 32-bit number. + Range 32-bit numbers with the lower 16-bits being 0. + + 'L' + Integer that is valid as an immediate operand for a shift + instruction. Range 0 to 31. + + 'M' + Integer that is valid as an immediate operand for only the + value 0. Can be used in conjunction with the format modifier + 'z' to use 'r0' instead of '0' in the assembly output. + + 'N' + Integer that is valid as an immediate operand for a custom + instruction opcode. Range 0 to 255. + + 'S' + Matches immediates which are addresses in the small data + section and therefore can be added to 'gp' as a 16-bit + immediate to re-create their 32-bit value. + +_PDP-11--'config/pdp11/constraints.md'_ + 'a' + Floating point registers AC0 through AC3. These can be loaded + from/to memory with a single instruction. + + 'd' + Odd numbered general registers (R1, R3, R5). These are used + for 16-bit multiply operations. + + 'f' + Any of the floating point registers (AC0 through AC5). + + 'G' + Floating point constant 0. + + 'I' + An integer constant that fits in 16 bits. + + 'J' + An integer constant whose low order 16 bits are zero. + + 'K' + An integer constant that does not meet the constraints for + codes 'I' or 'J'. + + 'L' + The integer constant 1. + + 'M' + The integer constant -1. + + 'N' + The integer constant 0. + + 'O' + Integer constants -4 through -1 and 1 through 4; shifts by + these amounts are handled as multiple single-bit shifts rather + than a single variable-length shift. + + 'Q' + A memory reference which requires an additional word (address + or offset) after the opcode. + + 'R' + A memory reference that is encoded within the opcode. + +_RL78--'config/rl78/constraints.md'_ + + 'Int3' + An integer constant in the range 1 ... 7. + 'Int8' + An integer constant in the range 0 ... 255. + 'J' + An integer constant in the range -255 ... 0 + 'K' + The integer constant 1. + 'L' + The integer constant -1. + 'M' + The integer constant 0. + 'N' + The integer constant 2. + 'O' + The integer constant -2. + 'P' + An integer constant in the range 1 ... 15. + 'Qbi' + The built-in compare types-eq, ne, gtu, ltu, geu, and leu. + 'Qsc' + The synthetic compare types-gt, lt, ge, and le. + 'Wab' + A memory reference with an absolute address. + 'Wbc' + A memory reference using 'BC' as a base register, with an + optional offset. + 'Wca' + A memory reference using 'AX', 'BC', 'DE', or 'HL' for the + address, for calls. + 'Wcv' + A memory reference using any 16-bit register pair for the + address, for calls. + 'Wd2' + A memory reference using 'DE' as a base register, with an + optional offset. + 'Wde' + A memory reference using 'DE' as a base register, without any + offset. + 'Wfr' + Any memory reference to an address in the far address space. + 'Wh1' + A memory reference using 'HL' as a base register, with an + optional one-byte offset. + 'Whb' + A memory reference using 'HL' as a base register, with 'B' or + 'C' as the index register. + 'Whl' + A memory reference using 'HL' as a base register, without any + offset. + 'Ws1' + A memory reference using 'SP' as a base register, with an + optional one-byte offset. + 'Y' + Any memory reference to an address in the near address space. + 'A' + The 'AX' register. + 'B' + The 'BC' register. + 'D' + The 'DE' register. + 'R' + 'A' through 'L' registers. + 'S' + The 'SP' register. + 'T' + The 'HL' register. + 'Z08W' + The 16-bit 'R8' register. + 'Z10W' + The 16-bit 'R10' register. + 'Zint' + The registers reserved for interrupts ('R24' to 'R31'). + 'a' + The 'A' register. + 'b' + The 'B' register. + 'c' + The 'C' register. + 'd' + The 'D' register. + 'e' + The 'E' register. + 'h' + The 'H' register. + 'l' + The 'L' register. + 'v' + The virtual registers. + 'w' + The 'PSW' register. + 'x' + The 'X' register. + +_RX--'config/rx/constraints.md'_ + 'Q' + An address which does not involve register indirect addressing + or pre/post increment/decrement addressing. + + 'Symbol' + A symbol reference. + + 'Int08' + A constant in the range -256 to 255, inclusive. + + 'Sint08' + A constant in the range -128 to 127, inclusive. + + 'Sint16' + A constant in the range -32768 to 32767, inclusive. + + 'Sint24' + A constant in the range -8388608 to 8388607, inclusive. + + 'Uint04' + A constant in the range 0 to 15, inclusive. + +_SPARC--'config/sparc/sparc.h'_ + 'f' + Floating-point register on the SPARC-V8 architecture and lower + floating-point register on the SPARC-V9 architecture. + + 'e' + Floating-point register. It is equivalent to 'f' on the + SPARC-V8 architecture and contains both lower and upper + floating-point registers on the SPARC-V9 architecture. + + 'c' + Floating-point condition code register. + + 'd' + Lower floating-point register. It is only valid on the + SPARC-V9 architecture when the Visual Instruction Set is + available. + + 'b' + Floating-point register. It is only valid on the SPARC-V9 + architecture when the Visual Instruction Set is available. + + 'h' + 64-bit global or out register for the SPARC-V8+ architecture. + + 'C' + The constant all-ones, for floating-point. + + 'A' + Signed 5-bit constant + + 'D' + A vector constant + + 'I' + Signed 13-bit constant + + 'J' + Zero + + 'K' + 32-bit constant with the low 12 bits clear (a constant that + can be loaded with the 'sethi' instruction) + + 'L' + A constant in the range supported by 'movcc' instructions + (11-bit signed immediate) + + 'M' + A constant in the range supported by 'movrcc' instructions + (10-bit signed immediate) + + 'N' + Same as 'K', except that it verifies that bits that are not in + the lower 32-bit range are all zero. Must be used instead of + 'K' for modes wider than 'SImode' + + 'O' + The constant 4096 + + 'G' + Floating-point zero + + 'H' + Signed 13-bit constant, sign-extended to 32 or 64 bits + + 'P' + The constant -1 + + 'Q' + Floating-point constant whose integral representation can be + moved into an integer register using a single sethi + instruction + + 'R' + Floating-point constant whose integral representation can be + moved into an integer register using a single mov instruction + + 'S' + Floating-point constant whose integral representation can be + moved into an integer register using a high/lo_sum instruction + sequence + + 'T' + Memory address aligned to an 8-byte boundary + + 'U' + Even register + + 'W' + Memory address for 'e' constraint registers + + 'w' + Memory address with only a base register + + 'Y' + Vector zero + +_SPU--'config/spu/spu.h'_ + 'a' + An immediate which can be loaded with the il/ila/ilh/ilhu + instructions. const_int is treated as a 64 bit value. + + 'c' + An immediate for and/xor/or instructions. const_int is + treated as a 64 bit value. + + 'd' + An immediate for the 'iohl' instruction. const_int is treated + as a 64 bit value. + + 'f' + An immediate which can be loaded with 'fsmbi'. + + 'A' + An immediate which can be loaded with the il/ila/ilh/ilhu + instructions. const_int is treated as a 32 bit value. + + 'B' + An immediate for most arithmetic instructions. const_int is + treated as a 32 bit value. + + 'C' + An immediate for and/xor/or instructions. const_int is + treated as a 32 bit value. + + 'D' + An immediate for the 'iohl' instruction. const_int is treated + as a 32 bit value. + + 'I' + A constant in the range [-64, 63] for shift/rotate + instructions. + + 'J' + An unsigned 7-bit constant for conversion/nop/channel + instructions. + + 'K' + A signed 10-bit constant for most arithmetic instructions. + + 'M' + A signed 16 bit immediate for 'stop'. + + 'N' + An unsigned 16-bit constant for 'iohl' and 'fsmbi'. + + 'O' + An unsigned 7-bit constant whose 3 least significant bits are + 0. + + 'P' + An unsigned 3-bit constant for 16-byte rotates and shifts + + 'R' + Call operand, reg, for indirect calls + + 'S' + Call operand, symbol, for relative calls. + + 'T' + Call operand, const_int, for absolute calls. + + 'U' + An immediate which can be loaded with the il/ila/ilh/ilhu + instructions. const_int is sign extended to 128 bit. + + 'W' + An immediate for shift and rotate instructions. const_int is + treated as a 32 bit value. + + 'Y' + An immediate for and/xor/or instructions. const_int is sign + extended as a 128 bit. + + 'Z' + An immediate for the 'iohl' instruction. const_int is sign + extended to 128 bit. + +_S/390 and zSeries--'config/s390/s390.h'_ + 'a' + Address register (general purpose register except r0) + + 'c' + Condition code register + + 'd' + Data register (arbitrary general purpose register) + + 'f' + Floating-point register + + 'I' + Unsigned 8-bit constant (0-255) + + 'J' + Unsigned 12-bit constant (0-4095) + + 'K' + Signed 16-bit constant (-32768-32767) + + 'L' + Value appropriate as displacement. + '(0..4095)' + for short displacement + '(-524288..524287)' + for long displacement + + 'M' + Constant integer with a value of 0x7fffffff. + + 'N' + Multiple letter constraint followed by 4 parameter letters. + '0..9:' + number of the part counting from most to least + significant + 'H,Q:' + mode of the part + 'D,S,H:' + mode of the containing operand + '0,F:' + value of the other parts (F--all bits set) + The constraint matches if the specified part of a constant has + a value different from its other parts. + + 'Q' + Memory reference without index register and with short + displacement. + + 'R' + Memory reference with index register and short displacement. + + 'S' + Memory reference without index register but with long + displacement. + + 'T' + Memory reference with index register and long displacement. + + 'U' + Pointer with short displacement. + + 'W' + Pointer with long displacement. + + 'Y' + Shift count operand. + +_Score family--'config/score/score.h'_ + 'd' + Registers from r0 to r32. + + 'e' + Registers from r0 to r16. + + 't' + r8--r11 or r22--r27 registers. + + 'h' + hi register. + + 'l' + lo register. + + 'x' + hi + lo register. + + 'q' + cnt register. + + 'y' + lcb register. + + 'z' + scb register. + + 'a' + cnt + lcb + scb register. + + 'c' + cr0--cr15 register. + + 'b' + cp1 registers. + + 'f' + cp2 registers. + + 'i' + cp3 registers. + + 'j' + cp1 + cp2 + cp3 registers. + + 'I' + High 16-bit constant (32-bit constant with 16 LSBs zero). + + 'J' + Unsigned 5 bit integer (in the range 0 to 31). + + 'K' + Unsigned 16 bit integer (in the range 0 to 65535). + + 'L' + Signed 16 bit integer (in the range -32768 to 32767). + + 'M' + Unsigned 14 bit integer (in the range 0 to 16383). + + 'N' + Signed 14 bit integer (in the range -8192 to 8191). + + 'Z' + Any SYMBOL_REF. + +_Xstormy16--'config/stormy16/stormy16.h'_ + 'a' + Register r0. + + 'b' + Register r1. + + 'c' + Register r2. + + 'd' + Register r8. + + 'e' + Registers r0 through r7. + + 't' + Registers r0 and r1. + + 'y' + The carry register. + + 'z' + Registers r8 and r9. + + 'I' + A constant between 0 and 3 inclusive. + + 'J' + A constant that has exactly one bit set. + + 'K' + A constant that has exactly one bit clear. + + 'L' + A constant between 0 and 255 inclusive. + + 'M' + A constant between -255 and 0 inclusive. + + 'N' + A constant between -3 and 0 inclusive. + + 'O' + A constant between 1 and 4 inclusive. + + 'P' + A constant between -4 and -1 inclusive. + + 'Q' + A memory reference that is a stack push. + + 'R' + A memory reference that is a stack pop. + + 'S' + A memory reference that refers to a constant address of known + value. + + 'T' + The register indicated by Rx (not implemented yet). + + 'U' + A constant that is not between 2 and 15 inclusive. + + 'Z' + The constant 0. + +_TI C6X family--'config/c6x/constraints.md'_ + 'a' + Register file A (A0-A31). + + 'b' + Register file B (B0-B31). + + 'A' + Predicate registers in register file A (A0-A2 on C64X and + higher, A1 and A2 otherwise). + + 'B' + Predicate registers in register file B (B0-B2). + + 'C' + A call-used register in register file B (B0-B9, B16-B31). + + 'Da' + Register file A, excluding predicate registers (A3-A31, plus + A0 if not C64X or higher). + + 'Db' + Register file B, excluding predicate registers (B3-B31). + + 'Iu4' + Integer constant in the range 0 ... 15. + + 'Iu5' + Integer constant in the range 0 ... 31. + + 'In5' + Integer constant in the range -31 ... 0. + + 'Is5' + Integer constant in the range -16 ... 15. + + 'I5x' + Integer constant that can be the operand of an ADDA or a SUBA + insn. + + 'IuB' + Integer constant in the range 0 ... 65535. + + 'IsB' + Integer constant in the range -32768 ... 32767. + + 'IsC' + Integer constant in the range -2^{20} ... 2^{20} - 1. + + 'Jc' + Integer constant that is a valid mask for the clr instruction. + + 'Js' + Integer constant that is a valid mask for the set instruction. + + 'Q' + Memory location with A base register. + + 'R' + Memory location with B base register. + + 'Z' + Register B14 (aka DP). + +_TILE-Gx--'config/tilegx/constraints.md'_ + 'R00' + 'R01' + 'R02' + 'R03' + 'R04' + 'R05' + 'R06' + 'R07' + 'R08' + 'R09' + 'R10' + Each of these represents a register constraint for an + individual register, from r0 to r10. + + 'I' + Signed 8-bit integer constant. + + 'J' + Signed 16-bit integer constant. + + 'K' + Unsigned 16-bit integer constant. + + 'L' + Integer constant that fits in one signed byte when incremented + by one (-129 ... 126). + + 'm' + Memory operand. If used together with '<' or '>', the operand + can have postincrement which requires printing with '%In' and + '%in' on TILE-Gx. For example: + + asm ("st_add %I0,%1,%i0" : "=m<>" (*mem) : "r" (val)); + + 'M' + A bit mask suitable for the BFINS instruction. + + 'N' + Integer constant that is a byte tiled out eight times. + + 'O' + The integer zero constant. + + 'P' + Integer constant that is a sign-extended byte tiled out as + four shorts. + + 'Q' + Integer constant that fits in one signed byte when incremented + (-129 ... 126), but excluding -1. + + 'S' + Integer constant that has all 1 bits consecutive and starting + at bit 0. + + 'T' + A 16-bit fragment of a got, tls, or pc-relative reference. + + 'U' + Memory operand except postincrement. This is roughly the same + as 'm' when not used together with '<' or '>'. + + 'W' + An 8-element vector constant with identical elements. + + 'Y' + A 4-element vector constant with identical elements. + + 'Z0' + The integer constant 0xffffffff. + + 'Z1' + The integer constant 0xffffffff00000000. + +_TILEPro--'config/tilepro/constraints.md'_ + 'R00' + 'R01' + 'R02' + 'R03' + 'R04' + 'R05' + 'R06' + 'R07' + 'R08' + 'R09' + 'R10' + Each of these represents a register constraint for an + individual register, from r0 to r10. + + 'I' + Signed 8-bit integer constant. + + 'J' + Signed 16-bit integer constant. + + 'K' + Nonzero integer constant with low 16 bits zero. + + 'L' + Integer constant that fits in one signed byte when incremented + by one (-129 ... 126). + + 'm' + Memory operand. If used together with '<' or '>', the operand + can have postincrement which requires printing with '%In' and + '%in' on TILEPro. For example: + + asm ("swadd %I0,%1,%i0" : "=m<>" (mem) : "r" (val)); + + 'M' + A bit mask suitable for the MM instruction. + + 'N' + Integer constant that is a byte tiled out four times. + + 'O' + The integer zero constant. + + 'P' + Integer constant that is a sign-extended byte tiled out as two + shorts. + + 'Q' + Integer constant that fits in one signed byte when incremented + (-129 ... 126), but excluding -1. + + 'T' + A symbolic operand, or a 16-bit fragment of a got, tls, or + pc-relative reference. + + 'U' + Memory operand except postincrement. This is roughly the same + as 'm' when not used together with '<' or '>'. + + 'W' + A 4-element vector constant with identical elements. + + 'Y' + A 2-element vector constant with identical elements. + +_Xtensa--'config/xtensa/constraints.md'_ + 'a' + General-purpose 32-bit register + + 'b' + One-bit boolean register + + 'A' + MAC16 40-bit accumulator register + + 'I' + Signed 12-bit integer constant, for use in MOVI instructions + + 'J' + Signed 8-bit integer constant, for use in ADDI instructions + + 'K' + Integer constant valid for BccI instructions + + 'L' + Unsigned constant valid for BccUI instructions + + +File: gcc.info, Node: Asm Labels, Next: Explicit Reg Vars, Prev: Constraints, Up: C Extensions + +6.43 Controlling Names Used in Assembler Code +============================================= + +You can specify the name to be used in the assembler code for a C +function or variable by writing the 'asm' (or '__asm__') keyword after +the declarator as follows: + + int foo asm ("myfoo") = 2; + +This specifies that the name to be used for the variable 'foo' in the +assembler code should be 'myfoo' rather than the usual '_foo'. + + On systems where an underscore is normally prepended to the name of a C +function or variable, this feature allows you to define names for the +linker that do not start with an underscore. + + It does not make sense to use this feature with a non-static local +variable since such variables do not have assembler names. If you are +trying to put the variable in a particular register, see *note Explicit +Reg Vars::. GCC presently accepts such code with a warning, but will +probably be changed to issue an error, rather than a warning, in the +future. + + You cannot use 'asm' in this way in a function _definition_; but you +can get the same effect by writing a declaration for the function before +its definition and putting 'asm' there, like this: + + extern func () asm ("FUNC"); + + func (x, y) + int x, y; + /* ... */ + + It is up to you to make sure that the assembler names you choose do not +conflict with any other assembler symbols. Also, you must not use a +register name; that would produce completely invalid assembler code. +GCC does not as yet have the ability to store static variables in +registers. Perhaps that will be added. + + +File: gcc.info, Node: Explicit Reg Vars, Next: Alternate Keywords, Prev: Asm Labels, Up: C Extensions + +6.44 Variables in Specified Registers +===================================== + +GNU C allows you to put a few global variables into specified hardware +registers. You can also specify the register in which an ordinary +register variable should be allocated. + + * Global register variables reserve registers throughout the program. + This may be useful in programs such as programming language + interpreters that have a couple of global variables that are + accessed very often. + + * Local register variables in specific registers do not reserve the + registers, except at the point where they are used as input or + output operands in an 'asm' statement and the 'asm' statement + itself is not deleted. The compiler's data flow analysis is + capable of determining where the specified registers contain live + values, and where they are available for other uses. Stores into + local register variables may be deleted when they appear to be dead + according to dataflow analysis. References to local register + variables may be deleted or moved or simplified. + + These local variables are sometimes convenient for use with the + extended 'asm' feature (*note Extended Asm::), if you want to write + one output of the assembler instruction directly into a particular + register. (This works provided the register you specify fits the + constraints specified for that operand in the 'asm'.) + +* Menu: + +* Global Reg Vars:: +* Local Reg Vars:: + + +File: gcc.info, Node: Global Reg Vars, Next: Local Reg Vars, Up: Explicit Reg Vars + +6.44.1 Defining Global Register Variables +----------------------------------------- + +You can define a global register variable in GNU C like this: + + register int *foo asm ("a5"); + +Here 'a5' is the name of the register that should be used. Choose a +register that is normally saved and restored by function calls on your +machine, so that library routines will not clobber it. + + Naturally the register name is cpu-dependent, so you need to +conditionalize your program according to cpu type. The register 'a5' is +a good choice on a 68000 for a variable of pointer type. On machines +with register windows, be sure to choose a "global" register that is not +affected magically by the function call mechanism. + + In addition, different operating systems on the same CPU may differ in +how they name the registers; then you need additional conditionals. For +example, some 68000 operating systems call this register '%a5'. + + Eventually there may be a way of asking the compiler to choose a +register automatically, but first we need to figure out how it should +choose and how to enable you to guide the choice. No solution is +evident. + + Defining a global register variable in a certain register reserves that +register entirely for this use, at least within the current compilation. +The register is not allocated for any other purpose in the functions in +the current compilation, and is not saved and restored by these +functions. Stores into this register are never deleted even if they +appear to be dead, but references may be deleted or moved or simplified. + + It is not safe to access the global register variables from signal +handlers, or from more than one thread of control, because the system +library routines may temporarily use the register for other things +(unless you recompile them specially for the task at hand). + + It is not safe for one function that uses a global register variable to +call another such function 'foo' by way of a third function 'lose' that +is compiled without knowledge of this variable (i.e. in a different +source file in which the variable isn't declared). This is because +'lose' might save the register and put some other value there. For +example, you can't expect a global register variable to be available in +the comparison-function that you pass to 'qsort', since 'qsort' might +have put something else in that register. (If you are prepared to +recompile 'qsort' with the same global register variable, you can solve +this problem.) + + If you want to recompile 'qsort' or other source files that do not +actually use your global register variable, so that they do not use that +register for any other purpose, then it suffices to specify the compiler +option '-ffixed-REG'. You need not actually add a global register +declaration to their source code. + + A function that can alter the value of a global register variable +cannot safely be called from a function compiled without this variable, +because it could clobber the value the caller expects to find there on +return. Therefore, the function that is the entry point into the part +of the program that uses the global register variable must explicitly +save and restore the value that belongs to its caller. + + On most machines, 'longjmp' restores to each global register variable +the value it had at the time of the 'setjmp'. On some machines, +however, 'longjmp' does not change the value of global register +variables. To be portable, the function that called 'setjmp' should +make other arrangements to save the values of the global register +variables, and to restore them in a 'longjmp'. This way, the same thing +happens regardless of what 'longjmp' does. + + All global register variable declarations must precede all function +definitions. If such a declaration could appear after function +definitions, the declaration would be too late to prevent the register +from being used for other purposes in the preceding functions. + + Global register variables may not have initial values, because an +executable file has no means to supply initial contents for a register. + + On the SPARC, there are reports that g3 ... g7 are suitable registers, +but certain library functions, such as 'getwd', as well as the +subroutines for division and remainder, modify g3 and g4. g1 and g2 are +local temporaries. + + On the 68000, a2 ... a5 should be suitable, as should d2 ... d7. Of +course, it does not do to use more than a few of those. + + +File: gcc.info, Node: Local Reg Vars, Prev: Global Reg Vars, Up: Explicit Reg Vars + +6.44.2 Specifying Registers for Local Variables +----------------------------------------------- + +You can define a local register variable with a specified register like +this: + + register int *foo asm ("a5"); + +Here 'a5' is the name of the register that should be used. Note that +this is the same syntax used for defining global register variables, but +for a local variable it appears within a function. + + Naturally the register name is cpu-dependent, but this is not a +problem, since specific registers are most often useful with explicit +assembler instructions (*note Extended Asm::). Both of these things +generally require that you conditionalize your program according to cpu +type. + + In addition, operating systems on one type of cpu may differ in how +they name the registers; then you need additional conditionals. For +example, some 68000 operating systems call this register '%a5'. + + Defining such a register variable does not reserve the register; it +remains available for other uses in places where flow control determines +the variable's value is not live. + + This option does not guarantee that GCC generates code that has this +variable in the register you specify at all times. You may not code an +explicit reference to this register in the _assembler instruction +template_ part of an 'asm' statement and assume it always refers to this +variable. However, using the variable as an 'asm' _operand_ guarantees +that the specified register is used for the operand. + + Stores into local register variables may be deleted when they appear to +be dead according to dataflow analysis. References to local register +variables may be deleted or moved or simplified. + + As for global register variables, it's recommended that you choose a +register that is normally saved and restored by function calls on your +machine, so that library routines will not clobber it. A common pitfall +is to initialize multiple call-clobbered registers with arbitrary +expressions, where a function call or library call for an arithmetic +operator overwrites a register value from a previous assignment, for +example 'r0' below: + register int *p1 asm ("r0") = ...; + register int *p2 asm ("r1") = ...; + +In those cases, a solution is to use a temporary variable for each +arbitrary expression. *Note Example of asm with clobbered asm reg::. + + +File: gcc.info, Node: Alternate Keywords, Next: Incomplete Enums, Prev: Explicit Reg Vars, Up: C Extensions + +6.45 Alternate Keywords +======================= + +'-ansi' and the various '-std' options disable certain keywords. This +causes trouble when you want to use GNU C extensions, or a +general-purpose header file that should be usable by all programs, +including ISO C programs. The keywords 'asm', 'typeof' and 'inline' are +not available in programs compiled with '-ansi' or '-std' (although +'inline' can be used in a program compiled with '-std=c99' or +'-std=c11'). The ISO C99 keyword 'restrict' is only available when +'-std=gnu99' (which will eventually be the default) or '-std=c99' (or +the equivalent '-std=iso9899:1999'), or an option for a later standard +version, is used. + + The way to solve these problems is to put '__' at the beginning and end +of each problematical keyword. For example, use '__asm__' instead of +'asm', and '__inline__' instead of 'inline'. + + Other C compilers won't accept these alternative keywords; if you want +to compile with another compiler, you can define the alternate keywords +as macros to replace them with the customary keywords. It looks like +this: + + #ifndef __GNUC__ + #define __asm__ asm + #endif + + '-pedantic' and other options cause warnings for many GNU C extensions. +You can prevent such warnings within one expression by writing +'__extension__' before the expression. '__extension__' has no effect +aside from this. + + +File: gcc.info, Node: Incomplete Enums, Next: Function Names, Prev: Alternate Keywords, Up: C Extensions + +6.46 Incomplete 'enum' Types +============================ + +You can define an 'enum' tag without specifying its possible values. +This results in an incomplete type, much like what you get if you write +'struct foo' without describing the elements. A later declaration that +does specify the possible values completes the type. + + You can't allocate variables or storage using the type while it is +incomplete. However, you can work with pointers to that type. + + This extension may not be very useful, but it makes the handling of +'enum' more consistent with the way 'struct' and 'union' are handled. + + This extension is not supported by GNU C++. + + +File: gcc.info, Node: Function Names, Next: Return Address, Prev: Incomplete Enums, Up: C Extensions + +6.47 Function Names as Strings +============================== + +GCC provides three magic variables that hold the name of the current +function, as a string. The first of these is '__func__', which is part +of the C99 standard: + + The identifier '__func__' is implicitly declared by the translator as +if, immediately following the opening brace of each function definition, +the declaration + + static const char __func__[] = "function-name"; + +appeared, where function-name is the name of the lexically-enclosing +function. This name is the unadorned name of the function. + + '__FUNCTION__' is another name for '__func__'. Older versions of GCC +recognize only this name. However, it is not standardized. For maximum +portability, we recommend you use '__func__', but provide a fallback +definition with the preprocessor: + + #if __STDC_VERSION__ < 199901L + # if __GNUC__ >= 2 + # define __func__ __FUNCTION__ + # else + # define __func__ "<unknown>" + # endif + #endif + + In C, '__PRETTY_FUNCTION__' is yet another name for '__func__'. +However, in C++, '__PRETTY_FUNCTION__' contains the type signature of +the function as well as its bare name. For example, this program: + + extern "C" { + extern int printf (char *, ...); + } + + class a { + public: + void sub (int i) + { + printf ("__FUNCTION__ = %s\n", __FUNCTION__); + printf ("__PRETTY_FUNCTION__ = %s\n", __PRETTY_FUNCTION__); + } + }; + + int + main (void) + { + a ax; + ax.sub (0); + return 0; + } + +gives this output: + + __FUNCTION__ = sub + __PRETTY_FUNCTION__ = void a::sub(int) + + These identifiers are not preprocessor macros. In GCC 3.3 and earlier, +in C only, '__FUNCTION__' and '__PRETTY_FUNCTION__' were treated as +string literals; they could be used to initialize 'char' arrays, and +they could be concatenated with other string literals. GCC 3.4 and +later treat them as variables, like '__func__'. In C++, '__FUNCTION__' +and '__PRETTY_FUNCTION__' have always been variables. + + +File: gcc.info, Node: Return Address, Next: Vector Extensions, Prev: Function Names, Up: C Extensions + +6.48 Getting the Return or Frame Address of a Function +====================================================== + +These functions may be used to get information about the callers of a +function. + + -- Built-in Function: void * __builtin_return_address (unsigned int + LEVEL) + This function returns the return address of the current function, + or of one of its callers. The LEVEL argument is number of frames + to scan up the call stack. A value of '0' yields the return + address of the current function, a value of '1' yields the return + address of the caller of the current function, and so forth. When + inlining the expected behavior is that the function returns the + address of the function that is returned to. To work around this + behavior use the 'noinline' function attribute. + + The LEVEL argument must be a constant integer. + + On some machines it may be impossible to determine the return + address of any function other than the current one; in such cases, + or when the top of the stack has been reached, this function + returns '0' or a random value. In addition, + '__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 + '__builtin_extract_return_addr'. + + This function should only be used with a nonzero argument for + debugging purposes. + + -- Built-in Function: void * __builtin_extract_return_addr (void *ADDR) + The address as returned by '__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 ADDR. + + -- Built-in Function: void * __builtin_frob_return_address (void *ADDR) + This function does the reverse of '__builtin_extract_return_addr'. + + -- Built-in Function: void * __builtin_frame_address (unsigned int + LEVEL) + This function is similar to '__builtin_return_address', but it + returns the address of the function frame rather than the return + address of the function. Calling '__builtin_frame_address' with a + value of '0' yields the frame address of the current function, a + value of '1' yields the frame address of the caller of the current + function, and so forth. + + The frame is the area on the stack that holds local variables and + saved registers. The frame address is normally the address of the + first word pushed on to the stack by the function. However, the + exact definition depends upon the processor and the calling + convention. If the processor has a dedicated frame pointer + register, and the function has a frame, then + '__builtin_frame_address' returns the value of the frame pointer + register. + + On some machines it may be impossible to determine the frame + address of any function other than the current one; in such cases, + or when the top of the stack has been reached, this function + returns '0' if the first frame pointer is properly initialized by + the startup code. + + This function should only be used with a nonzero argument for + debugging purposes. + + +File: gcc.info, Node: Vector Extensions, Next: Offsetof, Prev: Return Address, Up: C Extensions + +6.49 Using Vector Instructions through Built-in Functions +========================================================= + +On some targets, the instruction set contains SIMD vector instructions +which 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 this way. + + The first step in using these extensions is to provide the necessary +data types. This should be done using an appropriate 'typedef': + + typedef int v4si __attribute__ ((vector_size (16))); + +The 'int' type specifies the base type, while the attribute specifies +the vector size for the variable, measured in bytes. For example, the +declaration above causes the compiler to set the mode for the 'v4si' +type to be 16 bytes wide and divided into 'int' sized units. For a +32-bit 'int' this means a vector of 4 units of 4 bytes, and the +corresponding mode of 'foo' is V4SI. + + The 'vector_size' attribute is only applicable to integral and float +scalars, although arrays, pointers, and function return values are +allowed in conjunction with this construct. Only sizes that are a power +of two are currently allowed. + + All the basic integer types can be used as base types, both as signed +and as unsigned: 'char', 'short', 'int', 'long', 'long long'. In +addition, 'float' and 'double' can be used to build floating-point +vector types. + + Specifying a combination that is not valid for the current architecture +causes GCC to synthesize the instructions using a narrower mode. For +example, if you specify a variable of type 'V4SI' and your architecture +does not allow for this specific SIMD type, GCC produces code that uses +4 'SIs'. + + The types defined in this manner can be used with a subset of normal C +operations. Currently, GCC allows using the following operators on +these types: '+, -, *, /, unary minus, ^, |, &, ~, %'. + + The operations behave like C++ 'valarrays'. Addition is defined as the +addition of the corresponding elements of the operands. For example, in +the code below, each of the 4 elements in A is added to the +corresponding 4 elements in B and the resulting vector is stored in C. + + typedef int v4si __attribute__ ((vector_size (16))); + + v4si a, b, c; + + c = a + b; + + Subtraction, multiplication, division, and the logical operations +operate in a similar manner. Likewise, the result of using the unary +minus or complement operators on a vector type is a vector whose +elements are the negative or complemented values of the corresponding +elements in the operand. + + It is possible to use shifting operators '<<', '>>' on integer-type +vectors. The operation is defined as following: '{a0, a1, ..., an} >> +{b0, b1, ..., bn} == {a0 >> b0, a1 >> b1, ..., an >> bn}'. Vector +operands must have the same number of elements. + + For convenience, it is allowed to use a binary vector operation where +one operand is a scalar. In that case the compiler transforms the +scalar operand into a vector where each element is the scalar from the +operation. The transformation happens only if the scalar could be +safely converted to the vector-element type. Consider the following +code. + + typedef int v4si __attribute__ ((vector_size (16))); + + v4si a, b, c; + long l; + + a = b + 1; /* a = b + {1,1,1,1}; */ + a = 2 * b; /* a = {2,2,2,2} * b; */ + + a = l + a; /* Error, cannot convert long to int. */ + + Vectors can be subscripted as if the vector were an array with the same +number of elements and base type. Out of bound accesses invoke +undefined behavior at run time. Warnings for out of bound accesses for +vector subscription can be enabled with '-Warray-bounds'. + + Vector comparison is supported with standard comparison operators: '==, +!=, <, <=, >, >='. Comparison operands can be vector expressions of +integer-type or real-type. Comparison between integer-type vectors and +real-type vectors are not supported. The result of the comparison is a +vector of the same width and number of elements as the comparison +operands with a signed integral element type. + + Vectors are compared element-wise producing 0 when comparison is false +and -1 (constant of the appropriate type where all bits are set) +otherwise. Consider the following example. + + typedef int v4si __attribute__ ((vector_size (16))); + + v4si a = {1,2,3,4}; + v4si b = {3,2,1,4}; + v4si c; + + c = a > b; /* The result would be {0, 0,-1, 0} */ + c = a == b; /* The result would be {0,-1, 0,-1} */ + + In C++, the ternary operator '?:' is available. 'a?b:c', where 'b' and +'c' are vectors of the same type and 'a' is an integer vector with the +same number of elements of the same size as 'b' and 'c', computes all +three arguments and creates a vector '{a[0]?b[0]:c[0], a[1]?b[1]:c[1], +...}'. Note that unlike in OpenCL, 'a' is thus interpreted as 'a != 0' +and not 'a < 0'. As in the case of binary operations, this syntax is +also accepted when one of 'b' or 'c' is a scalar that is then +transformed into a vector. If both 'b' and 'c' are scalars and the type +of 'true?b:c' has the same size as the element type of 'a', then 'b' and +'c' are converted to a vector type whose elements have this type and +with the same number of elements as 'a'. + + Vector shuffling is available using functions '__builtin_shuffle (vec, +mask)' and '__builtin_shuffle (vec0, vec1, mask)'. Both functions +construct a permutation of elements from one or two vectors and return a +vector of the same type as the input vector(s). The MASK is an integral +vector with the same width (W) and element count (N) as the output +vector. + + The elements of the input vectors are numbered in memory ordering of +VEC0 beginning at 0 and VEC1 beginning at N. The elements of MASK are +considered modulo N in the single-operand case and modulo 2*N in the +two-operand case. + + Consider the following example, + + typedef int v4si __attribute__ ((vector_size (16))); + + v4si a = {1,2,3,4}; + v4si b = {5,6,7,8}; + v4si mask1 = {0,1,1,3}; + v4si mask2 = {0,4,2,5}; + v4si res; + + res = __builtin_shuffle (a, mask1); /* res is {1,2,2,4} */ + res = __builtin_shuffle (a, b, mask2); /* res is {1,5,3,6} */ + + Note that '__builtin_shuffle' is intentionally semantically compatible +with the OpenCL 'shuffle' and 'shuffle2' functions. + + You can declare variables and use them in function calls and returns, +as well as in assignments and some casts. You can specify a vector type +as a return type for a function. Vector types can also be used as +function arguments. It is possible to cast from one vector type to +another, provided they are of the same size (in fact, you can also cast +vectors to and from other datatypes of the same size). + + You cannot operate between vectors of different lengths or different +signedness without a cast. + + +File: gcc.info, Node: Offsetof, Next: __sync Builtins, Prev: Vector Extensions, Up: C Extensions + +6.50 Offsetof +============= + +GCC implements for both C and C++ a syntactic extension to implement the +'offsetof' macro. + + primary: + "__builtin_offsetof" "(" typename "," offsetof_member_designator ")" + + offsetof_member_designator: + identifier + | offsetof_member_designator "." identifier + | offsetof_member_designator "[" expr "]" + + This extension is sufficient such that + + #define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER) + +is a suitable definition of the 'offsetof' macro. In C++, TYPE may be +dependent. In either case, MEMBER may consist of a single identifier, +or a sequence of member accesses and array references. + + +File: gcc.info, Node: __sync Builtins, Next: __atomic Builtins, Prev: Offsetof, Up: C Extensions + +6.51 Legacy __sync Built-in Functions for Atomic Memory Access +============================================================== + +The following built-in functions are intended to be compatible with +those described in the 'Intel Itanium Processor-specific Application +Binary Interface', section 7.4. As such, they depart from the normal +GCC practice of using the '__builtin_' prefix, and further that they are +overloaded such that they work on multiple types. + + The definition given in the Intel documentation allows only for the use +of the types 'int', 'long', 'long long' as well as their unsigned +counterparts. GCC allows any integral scalar or pointer type that is 1, +2, 4 or 8 bytes in length. + + Not all operations are supported by all target processors. If a +particular operation cannot be implemented on the target processor, a +warning is generated and a call an external function is generated. The +external function carries the same name as the built-in version, with an +additional suffix '_N' where N is the size of the data type. + + In most cases, these built-in functions are considered a "full +barrier". That is, no memory operand is moved across the operation, +either forward or backward. Further, instructions are issued as +necessary to prevent the processor from speculating loads across the +operation and from queuing stores after the operation. + + All of the routines are described in the Intel documentation to take +"an optional list of variables protected by the memory barrier". It's +not clear what is meant by that; it could mean that _only_ the following +variables are protected, or it could mean that these variables should in +addition be protected. At present GCC ignores this list and protects +all variables that are globally accessible. If in the future we make +some use of this list, an empty list will continue to mean all globally +accessible variables. + +'TYPE __sync_fetch_and_add (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_fetch_and_sub (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_fetch_and_or (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_fetch_and_and (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_fetch_and_xor (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_fetch_and_nand (TYPE *ptr, TYPE value, ...)' + These built-in functions perform the operation suggested by the + name, and returns the value that had previously been in memory. + That is, + + { tmp = *ptr; *ptr OP= value; return tmp; } + { tmp = *ptr; *ptr = ~(tmp & value); return tmp; } // nand + + _Note:_ GCC 4.4 and later implement '__sync_fetch_and_nand' as + '*ptr = ~(tmp & value)' instead of '*ptr = ~tmp & value'. + +'TYPE __sync_add_and_fetch (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_sub_and_fetch (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_or_and_fetch (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_and_and_fetch (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_xor_and_fetch (TYPE *ptr, TYPE value, ...)' +'TYPE __sync_nand_and_fetch (TYPE *ptr, TYPE value, ...)' + These built-in functions perform the operation suggested by the + name, and return the new value. That is, + + { *ptr OP= value; return *ptr; } + { *ptr = ~(*ptr & value); return *ptr; } // nand + + _Note:_ GCC 4.4 and later implement '__sync_nand_and_fetch' as + '*ptr = ~(*ptr & value)' instead of '*ptr = ~*ptr & value'. + +'bool __sync_bool_compare_and_swap (TYPE *ptr, TYPE oldval, TYPE newval, ...)' +'TYPE __sync_val_compare_and_swap (TYPE *ptr, TYPE oldval, TYPE newval, ...)' + These built-in functions perform an atomic compare and swap. That + is, if the current value of '*PTR' is OLDVAL, then write NEWVAL + into '*PTR'. + + The "bool" version returns true if the comparison is successful and + NEWVAL is written. The "val" version returns the contents of + '*PTR' before the operation. + +'__sync_synchronize (...)' + This built-in function issues a full memory barrier. + +'TYPE __sync_lock_test_and_set (TYPE *ptr, TYPE value, ...)' + This built-in function, as described by Intel, is not a traditional + test-and-set operation, but rather an atomic exchange operation. + It writes VALUE into '*PTR', and returns the previous contents of + '*PTR'. + + Many targets have only minimal support for such locks, and do not + support a full exchange operation. In this case, a target may + support reduced functionality here by which the _only_ valid value + to store is the immediate constant 1. The exact value actually + stored in '*PTR' is implementation defined. + + This built-in function is not a full barrier, but rather an + "acquire barrier". This means that references after the operation + cannot move to (or be speculated to) before the operation, but + previous memory stores may not be globally visible yet, and + previous memory loads may not yet be satisfied. + +'void __sync_lock_release (TYPE *ptr, ...)' + This built-in function releases the lock acquired by + '__sync_lock_test_and_set'. Normally this means writing the + constant 0 to '*PTR'. + + This built-in function is not a full barrier, but rather a "release + barrier". This means that all previous memory stores are globally + visible, and all previous memory loads have been satisfied, but + following memory reads are not prevented from being speculated to + before the barrier. + + +File: gcc.info, Node: __atomic Builtins, Next: x86 specific memory model extensions for transactional memory, Prev: __sync Builtins, Up: C Extensions + +6.52 Built-in functions for memory model aware atomic operations +================================================================ + +The following built-in functions approximately match the requirements +for C++11 memory model. Many are similar to the '__sync' prefixed +built-in functions, but all also have a memory model parameter. These +are all identified by being prefixed with '__atomic', and most are +overloaded such that they work with multiple types. + + GCC allows any integral scalar or pointer type that is 1, 2, 4, or 8 +bytes in length. 16-byte integral types are also allowed if '__int128' +(*note __int128::) is supported by the architecture. + + Target architectures are encouraged to provide their own patterns for +each of these built-in functions. If no target is provided, the +original non-memory model set of '__sync' atomic built-in functions are +utilized, along with any required synchronization fences surrounding it +in order to achieve the proper behavior. Execution in this case is +subject to the same restrictions as those built-in functions. + + If there is no pattern or mechanism to provide a lock free instruction +sequence, a call is made to an external routine with the same parameters +to be resolved at run time. + + The four non-arithmetic functions (load, store, exchange, and +compare_exchange) all have a generic version as well. This generic +version works on any data type. If the data type size maps to one of +the integral sizes that may have lock free support, the generic version +utilizes the lock free built-in function. Otherwise an external call is +left to be resolved at run time. This external call is the same format +with the addition of a 'size_t' parameter inserted as the first +parameter indicating the size of the object being pointed to. All +objects must be the same size. + + There are 6 different memory models that can be specified. These map +to the same names in the C++11 standard. Refer there or to the GCC wiki +on atomic synchronization +(http://gcc.gnu.org/wiki/Atomic/GCCMM/AtomicSync) for more detailed +definitions. These memory models integrate both barriers to code motion +as well as synchronization requirements with other threads. These are +listed in approximately ascending order of strength. It is also +possible to use target specific flags for memory model flags, like +Hardware Lock Elision. + +'__ATOMIC_RELAXED' + No barriers or synchronization. +'__ATOMIC_CONSUME' + Data dependency only for both barrier and synchronization with + another thread. +'__ATOMIC_ACQUIRE' + Barrier to hoisting of code and synchronizes with release (or + stronger) semantic stores from another thread. +'__ATOMIC_RELEASE' + Barrier to sinking of code and synchronizes with acquire (or + stronger) semantic loads from another thread. +'__ATOMIC_ACQ_REL' + Full barrier in both directions and synchronizes with acquire loads + and release stores in another thread. +'__ATOMIC_SEQ_CST' + Full barrier in both directions and synchronizes with acquire loads + and release stores in all threads. + + When implementing patterns for these built-in functions, the memory +model parameter can be ignored as long as the pattern implements the +most restrictive '__ATOMIC_SEQ_CST' model. Any of the other memory +models execute correctly with this memory model but they may not execute +as efficiently as they could with a more appropriate implementation of +the relaxed requirements. + + Note that the C++11 standard allows for the memory model parameter to +be determined at run time rather than at compile time. These built-in +functions map any run-time value to '__ATOMIC_SEQ_CST' rather than +invoke a runtime library call or inline a switch statement. This is +standard compliant, safe, and the simplest approach for now. + + The memory model parameter is a signed int, but only the lower 8 bits +are reserved for the memory model. The remainder of the signed int is +reserved for future use and should be 0. Use of the predefined atomic +values ensures proper usage. + + -- Built-in Function: TYPE __atomic_load_n (TYPE *ptr, int memmodel) + This built-in function implements an atomic load operation. It + returns the contents of '*PTR'. + + The valid memory model variants are '__ATOMIC_RELAXED', + '__ATOMIC_SEQ_CST', '__ATOMIC_ACQUIRE', and '__ATOMIC_CONSUME'. + + -- Built-in Function: void __atomic_load (TYPE *ptr, TYPE *ret, int + memmodel) + This is the generic version of an atomic load. It returns the + contents of '*PTR' in '*RET'. + + -- Built-in Function: void __atomic_store_n (TYPE *ptr, TYPE val, int + memmodel) + This built-in function implements an atomic store operation. It + writes 'VAL' into '*PTR'. + + The valid memory model variants are '__ATOMIC_RELAXED', + '__ATOMIC_SEQ_CST', and '__ATOMIC_RELEASE'. + + -- Built-in Function: void __atomic_store (TYPE *ptr, TYPE *val, int + memmodel) + This is the generic version of an atomic store. It stores the + value of '*VAL' into '*PTR'. + + -- Built-in Function: TYPE __atomic_exchange_n (TYPE *ptr, TYPE val, + int memmodel) + This built-in function implements an atomic exchange operation. It + writes VAL into '*PTR', and returns the previous contents of + '*PTR'. + + The valid memory model variants are '__ATOMIC_RELAXED', + '__ATOMIC_SEQ_CST', '__ATOMIC_ACQUIRE', '__ATOMIC_RELEASE', and + '__ATOMIC_ACQ_REL'. + + -- Built-in Function: void __atomic_exchange (TYPE *ptr, TYPE *val, + TYPE *ret, int memmodel) + This is the generic version of an atomic exchange. It stores the + contents of '*VAL' into '*PTR'. The original value of '*PTR' is + copied into '*RET'. + + -- Built-in Function: bool __atomic_compare_exchange_n (TYPE *ptr, TYPE + *expected, TYPE desired, bool weak, int success_memmodel, int + failure_memmodel) + This built-in function implements an atomic compare and exchange + operation. This compares the contents of '*PTR' with the contents + of '*EXPECTED' and if equal, writes DESIRED into '*PTR'. If they + are not equal, the current contents of '*PTR' is written into + '*EXPECTED'. WEAK is true for weak compare_exchange, and false for + the strong variation. Many targets only offer the strong variation + and ignore the parameter. When in doubt, use the strong variation. + + True is returned if DESIRED is written into '*PTR' and the + execution is considered to conform to the memory model specified by + SUCCESS_MEMMODEL. There are no restrictions on what memory model + can be used here. + + False is returned otherwise, and the execution is considered to + conform to FAILURE_MEMMODEL. This memory model cannot be + '__ATOMIC_RELEASE' nor '__ATOMIC_ACQ_REL'. It also cannot be a + stronger model than that specified by SUCCESS_MEMMODEL. + + -- Built-in Function: bool __atomic_compare_exchange (TYPE *ptr, TYPE + *expected, TYPE *desired, bool weak, int success_memmodel, int + failure_memmodel) + This built-in function implements the generic version of + '__atomic_compare_exchange'. The function is virtually identical + to '__atomic_compare_exchange_n', except the desired value is also + a pointer. + + -- Built-in Function: TYPE __atomic_add_fetch (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_sub_fetch (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_and_fetch (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_xor_fetch (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_or_fetch (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_nand_fetch (TYPE *ptr, TYPE val, + int memmodel) + These built-in functions perform the operation suggested by the + name, and return the result of the operation. That is, + + { *ptr OP= val; return *ptr; } + + All memory models are valid. + + -- Built-in Function: TYPE __atomic_fetch_add (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_fetch_sub (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_fetch_and (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_fetch_xor (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_fetch_or (TYPE *ptr, TYPE val, int + memmodel) + -- Built-in Function: TYPE __atomic_fetch_nand (TYPE *ptr, TYPE val, + int memmodel) + These built-in functions perform the operation suggested by the + name, and return the value that had previously been in '*PTR'. + That is, + + { tmp = *ptr; *ptr OP= val; return tmp; } + + All memory models are valid. + + -- Built-in Function: bool __atomic_test_and_set (void *ptr, int + memmodel) + + This built-in function performs an atomic test-and-set operation on + the byte at '*PTR'. The byte is set to some implementation defined + nonzero "set" value and the return value is 'true' if and only if + the previous contents were "set". It should be only used for + operands of type 'bool' or 'char'. For other types only part of + the value may be set. + + All memory models are valid. + + -- Built-in Function: void __atomic_clear (bool *ptr, int memmodel) + + This built-in function performs an atomic clear operation on + '*PTR'. After the operation, '*PTR' contains 0. It should be only + used for operands of type 'bool' or 'char' and in conjunction with + '__atomic_test_and_set'. For other types it may only clear + partially. If the type is not 'bool' prefer using + '__atomic_store'. + + The valid memory model variants are '__ATOMIC_RELAXED', + '__ATOMIC_SEQ_CST', and '__ATOMIC_RELEASE'. + + -- Built-in Function: void __atomic_thread_fence (int memmodel) + + This built-in function acts as a synchronization fence between + threads based on the specified memory model. + + All memory orders are valid. + + -- Built-in Function: void __atomic_signal_fence (int memmodel) + + This built-in function acts as a synchronization fence between a + thread and signal handlers based in the same thread. + + All memory orders are valid. + + -- Built-in Function: bool __atomic_always_lock_free (size_t size, void + *ptr) + + This built-in function returns true if objects of SIZE bytes always + generate lock free atomic instructions for the target architecture. + SIZE must resolve to a compile-time constant and the result also + resolves to a compile-time constant. + + PTR is an optional pointer to the object that may be used to + determine alignment. A value of 0 indicates typical alignment + should be used. The compiler may also ignore this parameter. + + if (_atomic_always_lock_free (sizeof (long long), 0)) + + -- Built-in Function: bool __atomic_is_lock_free (size_t size, void + *ptr) + + This built-in function returns true if objects of SIZE bytes always + generate lock free atomic instructions for the target architecture. + If it is not known to be lock free a call is made to a runtime + routine named '__atomic_is_lock_free'. + + PTR is an optional pointer to the object that may be used to + determine alignment. A value of 0 indicates typical alignment + should be used. The compiler may also ignore this parameter. + + +File: gcc.info, Node: x86 specific memory model extensions for transactional memory, Next: Object Size Checking, Prev: __atomic Builtins, Up: C Extensions + +6.53 x86 specific memory model extensions for transactional memory +================================================================== + +The i386 architecture supports additional memory ordering flags to mark +lock critical sections for hardware lock elision. These must be +specified in addition to an existing memory model to atomic intrinsics. + +'__ATOMIC_HLE_ACQUIRE' + Start lock elision on a lock variable. Memory model must be + '__ATOMIC_ACQUIRE' or stronger. +'__ATOMIC_HLE_RELEASE' + End lock elision on a lock variable. Memory model must be + '__ATOMIC_RELEASE' or stronger. + + When a lock acquire fails it is required for good performance to abort +the transaction quickly. This can be done with a '_mm_pause' + + #include <immintrin.h> // For _mm_pause + + int lockvar; + + /* Acquire lock with lock elision */ + while (__atomic_exchange_n(&lockvar, 1, __ATOMIC_ACQUIRE|__ATOMIC_HLE_ACQUIRE)) + _mm_pause(); /* Abort failed transaction */ + ... + /* Free lock with lock elision */ + __atomic_store_n(&lockvar, 0, __ATOMIC_RELEASE|__ATOMIC_HLE_RELEASE); + + +File: gcc.info, Node: Object Size Checking, Next: Cilk Plus Builtins, Prev: x86 specific memory model extensions for transactional memory, Up: C Extensions + +6.54 Object Size Checking Built-in Functions +============================================ + +GCC implements a limited buffer overflow protection mechanism that can +prevent some buffer overflow attacks. + + -- Built-in Function: size_t __builtin_object_size (void * PTR, int + TYPE) + is a built-in construct that returns a constant number of bytes + from PTR to the end of the object PTR pointer points to (if known + at compile time). '__builtin_object_size' never evaluates its + arguments for side-effects. If there are any side-effects in them, + it returns '(size_t) -1' for TYPE 0 or 1 and '(size_t) 0' for TYPE + 2 or 3. If there are multiple objects PTR can point to and all of + them are known at compile time, the returned number is the maximum + of remaining byte counts in those objects if TYPE & 2 is 0 and + minimum if nonzero. If it is not possible to determine which + objects PTR points to at compile time, '__builtin_object_size' + should return '(size_t) -1' for TYPE 0 or 1 and '(size_t) 0' for + TYPE 2 or 3. + + TYPE is an integer constant from 0 to 3. If the least significant + bit is clear, objects are whole variables, if it is set, a closest + surrounding subobject is considered the object a pointer points to. + The second bit determines if maximum or minimum of remaining bytes + is computed. + + struct V { char buf1[10]; int b; char buf2[10]; } var; + char *p = &var.buf1[1], *q = &var.b; + + /* Here the object p points to is var. */ + assert (__builtin_object_size (p, 0) == sizeof (var) - 1); + /* The subobject p points to is var.buf1. */ + assert (__builtin_object_size (p, 1) == sizeof (var.buf1) - 1); + /* The object q points to is var. */ + assert (__builtin_object_size (q, 0) + == (char *) (&var + 1) - (char *) &var.b); + /* The subobject q points to is var.b. */ + assert (__builtin_object_size (q, 1) == sizeof (var.b)); + + There are built-in functions added for many common string operation +functions, e.g., for 'memcpy' '__builtin___memcpy_chk' built-in is +provided. This built-in has an additional last argument, which is the +number of bytes remaining in object the DEST argument points to or +'(size_t) -1' if the size is not known. + + The built-in functions are optimized into the normal string functions +like 'memcpy' if the last argument is '(size_t) -1' or if it is known at +compile time that the destination object will not be overflown. If the +compiler can determine at compile time the object will be always +overflown, it issues a warning. + + The intended use can be e.g. + + #undef memcpy + #define bos0(dest) __builtin_object_size (dest, 0) + #define memcpy(dest, src, n) \ + __builtin___memcpy_chk (dest, src, n, bos0 (dest)) + + char *volatile p; + char buf[10]; + /* It is unknown what object p points to, so this is optimized + into plain memcpy - no checking is possible. */ + memcpy (p, "abcde", n); + /* Destination is known and length too. It is known at compile + time there will be no overflow. */ + memcpy (&buf[5], "abcde", 5); + /* Destination is known, but the length is not known at compile time. + This will result in __memcpy_chk call that can check for overflow + at run time. */ + memcpy (&buf[5], "abcde", n); + /* Destination is known and it is known at compile time there will + be overflow. There will be a warning and __memcpy_chk call that + will abort the program at run time. */ + memcpy (&buf[6], "abcde", 5); + + Such built-in functions are provided for 'memcpy', 'mempcpy', +'memmove', 'memset', 'strcpy', 'stpcpy', 'strncpy', 'strcat' and +'strncat'. + + There are also checking built-in functions for formatted output +functions. + int __builtin___sprintf_chk (char *s, int flag, size_t os, const char *fmt, ...); + int __builtin___snprintf_chk (char *s, size_t maxlen, int flag, size_t os, + const char *fmt, ...); + int __builtin___vsprintf_chk (char *s, int flag, size_t os, const char *fmt, + va_list ap); + int __builtin___vsnprintf_chk (char *s, size_t maxlen, int flag, size_t os, + const char *fmt, va_list ap); + + The added FLAG argument is passed unchanged to '__sprintf_chk' etc. +functions and can contain implementation specific flags on what +additional security measures the checking function might take, such as +handling '%n' differently. + + The OS argument is the object size S points to, like in the other +built-in functions. There is a small difference in the behavior though, +if OS is '(size_t) -1', the built-in functions are optimized into the +non-checking functions only if FLAG is 0, otherwise the checking +function is called with OS argument set to '(size_t) -1'. + + In addition to this, there are checking built-in functions +'__builtin___printf_chk', '__builtin___vprintf_chk', +'__builtin___fprintf_chk' and '__builtin___vfprintf_chk'. These have +just one additional argument, FLAG, right before format string FMT. If +the compiler is able to optimize them to 'fputc' etc. functions, it +does, otherwise the checking function is called and the FLAG argument +passed to it. + + +File: gcc.info, Node: Cilk Plus Builtins, Next: Other Builtins, Prev: Object Size Checking, Up: C Extensions + +6.55 Cilk Plus C/C++ language extension Built-in Functions. +=========================================================== + +GCC provides support for the following built-in reduction funtions if +Cilk Plus is enabled. Cilk Plus can be enabled using the '-fcilkplus' +flag. + + * __sec_implicit_index + * __sec_reduce + * __sec_reduce_add + * __sec_reduce_all_nonzero + * __sec_reduce_all_zero + * __sec_reduce_any_nonzero + * __sec_reduce_any_zero + * __sec_reduce_max + * __sec_reduce_min + * __sec_reduce_max_ind + * __sec_reduce_min_ind + * __sec_reduce_mul + * __sec_reduce_mutating + + Further details and examples about these built-in functions are +described in the Cilk Plus language manual which can be found at +<http://www.cilkplus.org>. + + +File: gcc.info, Node: Other Builtins, Next: Target Builtins, Prev: Cilk Plus Builtins, Up: C Extensions + +6.56 Other Built-in Functions Provided by GCC +============================================= + +GCC provides a large number of built-in functions other than the ones +mentioned above. Some of these are for internal use in the processing +of exceptions or variable-length argument lists and are not documented +here because they may change from time to time; we do not recommend +general use of these functions. + + The remaining functions are provided for optimization purposes. + + GCC includes built-in versions of many of the functions in the standard +C library. The versions prefixed with '__builtin_' are always treated +as having the same meaning as the C library function even if you specify +the '-fno-builtin' option. (*note C Dialect Options::) Many of these +functions are only optimized in certain cases; if they are not optimized +in a particular case, a call to the library function is emitted. + + Outside strict ISO C mode ('-ansi', '-std=c90', '-std=c99' or +'-std=c11'), the functions '_exit', 'alloca', 'bcmp', 'bzero', +'dcgettext', 'dgettext', 'dremf', 'dreml', 'drem', 'exp10f', 'exp10l', +'exp10', 'ffsll', 'ffsl', 'ffs', 'fprintf_unlocked', 'fputs_unlocked', +'gammaf', 'gammal', 'gamma', 'gammaf_r', 'gammal_r', 'gamma_r', +'gettext', 'index', 'isascii', 'j0f', 'j0l', 'j0', 'j1f', 'j1l', 'j1', +'jnf', 'jnl', 'jn', 'lgammaf_r', 'lgammal_r', 'lgamma_r', 'mempcpy', +'pow10f', 'pow10l', 'pow10', 'printf_unlocked', 'rindex', 'scalbf', +'scalbl', 'scalb', 'signbit', 'signbitf', 'signbitl', 'signbitd32', +'signbitd64', 'signbitd128', 'significandf', 'significandl', +'significand', 'sincosf', 'sincosl', 'sincos', 'stpcpy', 'stpncpy', +'strcasecmp', 'strdup', 'strfmon', 'strncasecmp', 'strndup', 'toascii', +'y0f', 'y0l', 'y0', 'y1f', 'y1l', 'y1', 'ynf', 'ynl' and 'yn' may be +handled as built-in functions. All these functions have corresponding +versions prefixed with '__builtin_', which may be used even in strict +C90 mode. + + The ISO C99 functions '_Exit', 'acoshf', 'acoshl', 'acosh', 'asinhf', +'asinhl', 'asinh', 'atanhf', 'atanhl', 'atanh', 'cabsf', 'cabsl', +'cabs', 'cacosf', 'cacoshf', 'cacoshl', 'cacosh', 'cacosl', 'cacos', +'cargf', 'cargl', 'carg', 'casinf', 'casinhf', 'casinhl', 'casinh', +'casinl', 'casin', 'catanf', 'catanhf', 'catanhl', 'catanh', 'catanl', +'catan', 'cbrtf', 'cbrtl', 'cbrt', 'ccosf', 'ccoshf', 'ccoshl', 'ccosh', +'ccosl', 'ccos', 'cexpf', 'cexpl', 'cexp', 'cimagf', 'cimagl', 'cimag', +'clogf', 'clogl', 'clog', 'conjf', 'conjl', 'conj', 'copysignf', +'copysignl', 'copysign', 'cpowf', 'cpowl', 'cpow', 'cprojf', 'cprojl', +'cproj', 'crealf', 'creall', 'creal', 'csinf', 'csinhf', 'csinhl', +'csinh', 'csinl', 'csin', 'csqrtf', 'csqrtl', 'csqrt', 'ctanf', +'ctanhf', 'ctanhl', 'ctanh', 'ctanl', 'ctan', 'erfcf', 'erfcl', 'erfc', +'erff', 'erfl', 'erf', 'exp2f', 'exp2l', 'exp2', 'expm1f', 'expm1l', +'expm1', 'fdimf', 'fdiml', 'fdim', 'fmaf', 'fmal', 'fmaxf', 'fmaxl', +'fmax', 'fma', 'fminf', 'fminl', 'fmin', 'hypotf', 'hypotl', 'hypot', +'ilogbf', 'ilogbl', 'ilogb', 'imaxabs', 'isblank', 'iswblank', +'lgammaf', 'lgammal', 'lgamma', 'llabs', 'llrintf', 'llrintl', 'llrint', +'llroundf', 'llroundl', 'llround', 'log1pf', 'log1pl', 'log1p', 'log2f', +'log2l', 'log2', 'logbf', 'logbl', 'logb', 'lrintf', 'lrintl', 'lrint', +'lroundf', 'lroundl', 'lround', 'nearbyintf', 'nearbyintl', 'nearbyint', +'nextafterf', 'nextafterl', 'nextafter', 'nexttowardf', 'nexttowardl', +'nexttoward', 'remainderf', 'remainderl', 'remainder', 'remquof', +'remquol', 'remquo', 'rintf', 'rintl', 'rint', 'roundf', 'roundl', +'round', 'scalblnf', 'scalblnl', 'scalbln', 'scalbnf', 'scalbnl', +'scalbn', 'snprintf', 'tgammaf', 'tgammal', 'tgamma', 'truncf', +'truncl', 'trunc', 'vfscanf', 'vscanf', 'vsnprintf' and 'vsscanf' are +handled as built-in functions except in strict ISO C90 mode ('-ansi' or +'-std=c90'). + + There are also built-in versions of the ISO C99 functions 'acosf', +'acosl', 'asinf', 'asinl', 'atan2f', 'atan2l', 'atanf', 'atanl', +'ceilf', 'ceill', 'cosf', 'coshf', 'coshl', 'cosl', 'expf', 'expl', +'fabsf', 'fabsl', 'floorf', 'floorl', 'fmodf', 'fmodl', 'frexpf', +'frexpl', 'ldexpf', 'ldexpl', 'log10f', 'log10l', 'logf', 'logl', +'modfl', 'modf', 'powf', 'powl', 'sinf', 'sinhf', 'sinhl', 'sinl', +'sqrtf', 'sqrtl', 'tanf', 'tanhf', 'tanhl' and 'tanl' that are +recognized in any mode since ISO C90 reserves these names for the +purpose to which ISO C99 puts them. All these functions have +corresponding versions prefixed with '__builtin_'. + + The ISO C94 functions 'iswalnum', 'iswalpha', 'iswcntrl', 'iswdigit', +'iswgraph', 'iswlower', 'iswprint', 'iswpunct', 'iswspace', 'iswupper', +'iswxdigit', 'towlower' and 'towupper' are handled as built-in functions +except in strict ISO C90 mode ('-ansi' or '-std=c90'). + + The ISO C90 functions 'abort', 'abs', 'acos', 'asin', 'atan2', 'atan', +'calloc', 'ceil', 'cosh', 'cos', 'exit', 'exp', 'fabs', 'floor', 'fmod', +'fprintf', 'fputs', 'frexp', 'fscanf', 'isalnum', 'isalpha', 'iscntrl', +'isdigit', 'isgraph', 'islower', 'isprint', 'ispunct', 'isspace', +'isupper', 'isxdigit', 'tolower', 'toupper', 'labs', 'ldexp', 'log10', +'log', 'malloc', 'memchr', 'memcmp', 'memcpy', 'memset', 'modf', 'pow', +'printf', 'putchar', 'puts', 'scanf', 'sinh', 'sin', 'snprintf', +'sprintf', 'sqrt', 'sscanf', 'strcat', 'strchr', 'strcmp', 'strcpy', +'strcspn', 'strlen', 'strncat', 'strncmp', 'strncpy', 'strpbrk', +'strrchr', 'strspn', 'strstr', 'tanh', 'tan', 'vfprintf', 'vprintf' and +'vsprintf' are all recognized as built-in functions unless +'-fno-builtin' is specified (or '-fno-builtin-FUNCTION' is specified for +an individual function). All of these functions have corresponding +versions prefixed with '__builtin_'. + + GCC provides built-in versions of the ISO C99 floating-point comparison +macros that avoid raising exceptions for unordered operands. They have +the same names as the standard macros ( 'isgreater', 'isgreaterequal', +'isless', 'islessequal', 'islessgreater', and 'isunordered') , with +'__builtin_' prefixed. We intend for a library implementor to be able +to simply '#define' each standard macro to its built-in equivalent. In +the same fashion, GCC provides 'fpclassify', 'isfinite', 'isinf_sign' +and 'isnormal' built-ins used with '__builtin_' prefixed. The 'isinf' +and 'isnan' built-in functions appear both with and without the +'__builtin_' prefix. + + -- Built-in Function: int __builtin_types_compatible_p (TYPE1, TYPE2) + + You can use the built-in function '__builtin_types_compatible_p' to + determine whether two types are the same. + + This built-in function returns 1 if the unqualified versions of the + types TYPE1 and TYPE2 (which are types, not expressions) are + compatible, 0 otherwise. The result of this built-in function can + be used in integer constant expressions. + + This built-in function ignores top level qualifiers (e.g., 'const', + 'volatile'). For example, 'int' is equivalent to 'const int'. + + The type 'int[]' and 'int[5]' are compatible. On the other hand, + 'int' and 'char *' are not compatible, even if the size of their + types, on the particular architecture are the same. Also, the + amount of pointer indirection is taken into account when + determining similarity. Consequently, 'short *' is not similar to + 'short **'. Furthermore, two types that are typedefed are + considered compatible if their underlying types are compatible. + + An 'enum' type is not considered to be compatible with another + 'enum' type even if both are compatible with the same integer type; + this is what the C standard specifies. For example, 'enum {foo, + bar}' is not similar to 'enum {hot, dog}'. + + You typically use this function in code whose execution varies + depending on the arguments' types. For example: + + #define foo(x) \ + ({ \ + typeof (x) tmp = (x); \ + if (__builtin_types_compatible_p (typeof (x), long double)) \ + tmp = foo_long_double (tmp); \ + else if (__builtin_types_compatible_p (typeof (x), double)) \ + tmp = foo_double (tmp); \ + else if (__builtin_types_compatible_p (typeof (x), float)) \ + tmp = foo_float (tmp); \ + else \ + abort (); \ + tmp; \ + }) + + _Note:_ This construct is only available for C. + + -- Built-in Function: TYPE __builtin_choose_expr (CONST_EXP, EXP1, + EXP2) + + You can use the built-in function '__builtin_choose_expr' to + evaluate code depending on the value of a constant expression. + This built-in function returns EXP1 if CONST_EXP, which is an + integer constant expression, is nonzero. Otherwise it returns + EXP2. + + This built-in function is analogous to the '? :' operator in C, + except that the expression returned has its type unaltered by + promotion rules. Also, the built-in function does not evaluate the + expression that is not chosen. For example, if CONST_EXP evaluates + to true, EXP2 is not evaluated even if it has side-effects. + + This built-in function can return an lvalue if the chosen argument + is an lvalue. + + If EXP1 is returned, the return type is the same as EXP1's type. + Similarly, if EXP2 is returned, its return type is the same as + EXP2. + + Example: + + #define foo(x) \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (typeof (x), double), \ + foo_double (x), \ + __builtin_choose_expr ( \ + __builtin_types_compatible_p (typeof (x), float), \ + foo_float (x), \ + /* The void expression results in a compile-time error \ + when assigning the result to something. */ \ + (void)0)) + + _Note:_ This construct is only available for C. Furthermore, the + unused expression (EXP1 or EXP2 depending on the value of + CONST_EXP) may still generate syntax errors. This may change in + future revisions. + + -- Built-in Function: TYPE __builtin_complex (REAL, IMAG) + + The built-in function '__builtin_complex' is provided for use in + implementing the ISO C11 macros 'CMPLXF', 'CMPLX' and 'CMPLXL'. + REAL and IMAG must have the same type, a real binary floating-point + type, and the result has the corresponding complex type with real + and imaginary parts REAL and IMAG. Unlike 'REAL + I * IMAG', this + works even when infinities, NaNs and negative zeros are involved. + + -- Built-in Function: int __builtin_constant_p (EXP) + You can use the built-in function '__builtin_constant_p' to + determine if a value is known to be constant at compile time and + hence that GCC can perform constant-folding on expressions + involving that value. The argument of the function is the value to + test. The function returns the integer 1 if the argument is known + to be a compile-time constant and 0 if it is not known to be a + compile-time constant. A return of 0 does not indicate that the + value is _not_ a constant, but merely that GCC cannot prove it is a + constant with the specified value of the '-O' option. + + You typically use this function in an embedded application where + memory is a critical resource. If you have some complex + calculation, you may want it to be folded if it involves constants, + but need to call a function if it does not. For example: + + #define Scale_Value(X) \ + (__builtin_constant_p (X) \ + ? ((X) * SCALE + OFFSET) : Scale (X)) + + You may use this built-in function in either a macro or an inline + function. However, if you use it in an inlined function and pass + an argument of the function as the argument to the built-in, GCC + never returns 1 when you call the inline function with a string + constant or compound literal (*note Compound Literals::) and does + not return 1 when you pass a constant numeric value to the inline + function unless you specify the '-O' option. + + You may also use '__builtin_constant_p' in initializers for static + data. For instance, you can write + + static const int table[] = { + __builtin_constant_p (EXPRESSION) ? (EXPRESSION) : -1, + /* ... */ + }; + + This is an acceptable initializer even if EXPRESSION is not a + constant expression, including the case where + '__builtin_constant_p' returns 1 because EXPRESSION can be folded + to a constant but EXPRESSION contains operands that are not + otherwise permitted in a static initializer (for example, '0 && foo + ()'). GCC must be more conservative about evaluating the built-in + in this case, because it has no opportunity to perform + optimization. + + Previous versions of GCC did not accept this built-in in data + initializers. The earliest version where it is completely safe is + 3.0.1. + + -- Built-in Function: long __builtin_expect (long EXP, long C) + You may use '__builtin_expect' to provide the compiler with branch + prediction information. In general, you should prefer to use + actual profile feedback for this ('-fprofile-arcs'), as programmers + are notoriously bad at predicting how their programs actually + perform. However, there are applications in which this data is + hard to collect. + + The return value is the value of EXP, which should be an integral + expression. The semantics of the built-in are that it is expected + that EXP == C. For example: + + if (__builtin_expect (x, 0)) + foo (); + + indicates that we do not expect to call 'foo', since we expect 'x' + to be zero. Since you are limited to integral expressions for EXP, + you should use constructions such as + + if (__builtin_expect (ptr != NULL, 1)) + foo (*ptr); + + when testing pointer or floating-point values. + + -- Built-in Function: void __builtin_trap (void) + This function causes the program to exit abnormally. GCC + implements this function by using a target-dependent mechanism + (such as intentionally executing an illegal instruction) or by + calling 'abort'. The mechanism used may vary from release to + release so you should not rely on any particular implementation. + + -- Built-in Function: void __builtin_unreachable (void) + If control flow reaches the point of the '__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 'asm' statement that + either never terminates, or one that transfers control elsewhere + and never returns. In this example, without the + '__builtin_unreachable', GCC issues a warning that control reaches + the end of a non-void function. It also generates code to return + after the 'asm'. + + int f (int c, int v) + { + if (c) + { + return v; + } + else + { + asm("jmp error_handler"); + __builtin_unreachable (); + } + } + + Because the 'asm' statement unconditionally transfers control out + of the function, control never reaches the end of the function + body. The '__builtin_unreachable' is in fact unreachable and + communicates this fact to the compiler. + + Another use for '__builtin_unreachable' is following a call a + function that never returns but that is not declared + '__attribute__((noreturn))', as in this example: + + void function_that_never_returns (void); + + int g (int c) + { + if (c) + { + return 1; + } + else + { + function_that_never_returns (); + __builtin_unreachable (); + } + } + + -- Built-in Function: void *__builtin_assume_aligned (const void *EXP, + size_t ALIGN, ...) + This function returns its first argument, and allows the compiler + to assume that the returned pointer is at least ALIGN bytes + aligned. This built-in can have either two or three arguments, if + it has three, the third argument should have integer type, and if + it is nonzero means misalignment offset. For example: + + void *x = __builtin_assume_aligned (arg, 16); + + means that the compiler can assume 'x', set to 'arg', is at least + 16-byte aligned, while: + + void *x = __builtin_assume_aligned (arg, 32, 8); + + means that the compiler can assume for 'x', set to 'arg', that + '(char *) x - 8' is 32-byte aligned. + + -- Built-in Function: int __builtin_LINE () + This function is the equivalent to the preprocessor '__LINE__' + macro and returns the line number of the invocation of the + built-in. In a C++ default argument for a function F, it gets the + line number of the call to F. + + -- Built-in Function: const char * __builtin_FUNCTION () + This function is the equivalent to the preprocessor '__FUNCTION__' + macro and returns the function name the invocation of the built-in + is in. + + -- Built-in Function: const char * __builtin_FILE () + This function is the equivalent to the preprocessor '__FILE__' + macro and returns the file name the invocation of the built-in is + in. In a C++ default argument for a function F, it gets the file + name of the call to F. + + -- Built-in Function: void __builtin___clear_cache (char *BEGIN, char + *END) + This function is used to flush the processor's instruction cache + for the region of memory between BEGIN inclusive and END exclusive. + Some targets require that the instruction cache be flushed, after + modifying memory containing code, in order to obtain deterministic + behavior. + + If the target does not require instruction cache flushes, + '__builtin___clear_cache' has no effect. Otherwise either + instructions are emitted in-line to clear the instruction cache or + a call to the '__clear_cache' function in libgcc is made. + + -- Built-in Function: void __builtin_prefetch (const void *ADDR, ...) + This function is used to minimize cache-miss latency by moving data + into a cache before it is accessed. You can insert calls to + '__builtin_prefetch' into code for which you know addresses of data + in memory that is likely to be accessed soon. If the target + supports them, data prefetch instructions are generated. If the + prefetch is done early enough before the access then the data will + be in the cache by the time it is accessed. + + The value of ADDR is the address of the memory to prefetch. There + are two optional arguments, RW and LOCALITY. The value of RW is a + compile-time constant one or zero; one means that the prefetch is + preparing for a write to the memory address and zero, the default, + means that the prefetch is preparing for a read. The value + LOCALITY must be a compile-time constant integer between zero and + three. A value of zero means that the data has no temporal + locality, so it need not be left in the cache after the access. A + value of three means that the data has a high degree of temporal + locality and should be left in all levels of cache possible. + Values of one and two mean, respectively, a low or moderate degree + of temporal locality. The default is three. + + for (i = 0; i < n; i++) + { + a[i] = a[i] + b[i]; + __builtin_prefetch (&a[i+j], 1, 1); + __builtin_prefetch (&b[i+j], 0, 1); + /* ... */ + } + + Data prefetch does not generate faults if ADDR is invalid, but the + address expression itself must be valid. For example, a prefetch + of 'p->next' does not fault if 'p->next' is not a valid address, + but evaluation faults if 'p' is not a valid address. + + If the target does not support data prefetch, the address + expression is evaluated if it includes side effects but no other + code is generated and GCC does not issue a warning. + + -- Built-in Function: double __builtin_huge_val (void) + Returns a positive infinity, if supported by the floating-point + format, else 'DBL_MAX'. This function is suitable for implementing + the ISO C macro 'HUGE_VAL'. + + -- Built-in Function: float __builtin_huge_valf (void) + Similar to '__builtin_huge_val', except the return type is 'float'. + + -- Built-in Function: long double __builtin_huge_vall (void) + Similar to '__builtin_huge_val', except the return type is 'long + double'. + + -- Built-in Function: int __builtin_fpclassify (int, int, int, int, + int, ...) + This built-in implements the C99 fpclassify functionality. The + first five int arguments should be the target library's notion of + the possible FP classes and are used for return values. They must + be constant values and they must appear in this order: 'FP_NAN', + 'FP_INFINITE', 'FP_NORMAL', 'FP_SUBNORMAL' and 'FP_ZERO'. The + ellipsis is for exactly one floating-point value to classify. GCC + treats the last argument as type-generic, which means it does not + do default promotion from float to double. + + -- Built-in Function: double __builtin_inf (void) + Similar to '__builtin_huge_val', except a warning is generated if + the target floating-point format does not support infinities. + + -- Built-in Function: _Decimal32 __builtin_infd32 (void) + Similar to '__builtin_inf', except the return type is '_Decimal32'. + + -- Built-in Function: _Decimal64 __builtin_infd64 (void) + Similar to '__builtin_inf', except the return type is '_Decimal64'. + + -- Built-in Function: _Decimal128 __builtin_infd128 (void) + Similar to '__builtin_inf', except the return type is + '_Decimal128'. + + -- Built-in Function: float __builtin_inff (void) + Similar to '__builtin_inf', except the return type is 'float'. + This function is suitable for implementing the ISO C99 macro + 'INFINITY'. + + -- Built-in Function: long double __builtin_infl (void) + Similar to '__builtin_inf', except the return type is 'long + double'. + + -- Built-in Function: int __builtin_isinf_sign (...) + Similar to 'isinf', except the return value is -1 for an argument + of '-Inf' and 1 for an argument of '+Inf'. Note while the + parameter list is an ellipsis, this function only accepts exactly + one floating-point argument. GCC treats this parameter as + type-generic, which means it does not do default promotion from + float to double. + + -- Built-in Function: double __builtin_nan (const char *str) + This is an implementation of the ISO C99 function 'nan'. + + Since ISO C99 defines this function in terms of 'strtod', which we + do not implement, a description of the parsing is in order. The + string is parsed as by 'strtol'; that is, the base is recognized by + leading '0' or '0x' prefixes. The number parsed is placed in the + significand such that the least significant bit of the number is at + the least significant bit of the significand. The number is + truncated to fit the significand field provided. The significand + is forced to be a quiet NaN. + + This function, if given a string literal all of which would have + been consumed by 'strtol', is evaluated early enough that it is + considered a compile-time constant. + + -- Built-in Function: _Decimal32 __builtin_nand32 (const char *str) + Similar to '__builtin_nan', except the return type is '_Decimal32'. + + -- Built-in Function: _Decimal64 __builtin_nand64 (const char *str) + Similar to '__builtin_nan', except the return type is '_Decimal64'. + + -- Built-in Function: _Decimal128 __builtin_nand128 (const char *str) + Similar to '__builtin_nan', except the return type is + '_Decimal128'. + + -- Built-in Function: float __builtin_nanf (const char *str) + Similar to '__builtin_nan', except the return type is 'float'. + + -- Built-in Function: long double __builtin_nanl (const char *str) + Similar to '__builtin_nan', except the return type is 'long + double'. + + -- Built-in Function: double __builtin_nans (const char *str) + Similar to '__builtin_nan', except the significand is forced to be + a signaling NaN. The 'nans' function is proposed by WG14 N965. + + -- Built-in Function: float __builtin_nansf (const char *str) + Similar to '__builtin_nans', except the return type is 'float'. + + -- Built-in Function: long double __builtin_nansl (const char *str) + Similar to '__builtin_nans', except the return type is 'long + double'. + + -- Built-in Function: int __builtin_ffs (int x) + Returns one plus the index of the least significant 1-bit of X, or + if X is zero, returns zero. + + -- Built-in Function: int __builtin_clz (unsigned int x) + Returns the number of leading 0-bits in X, starting at the most + significant bit position. If X is 0, the result is undefined. + + -- Built-in Function: int __builtin_ctz (unsigned int x) + Returns the number of trailing 0-bits in X, starting at the least + significant bit position. If X is 0, the result is undefined. + + -- Built-in Function: int __builtin_clrsb (int x) + Returns the number of leading redundant sign bits in X, i.e. the + number of bits following the most significant bit that are + identical to it. There are no special cases for 0 or other values. + + -- Built-in Function: int __builtin_popcount (unsigned int x) + Returns the number of 1-bits in X. + + -- Built-in Function: int __builtin_parity (unsigned int x) + Returns the parity of X, i.e. the number of 1-bits in X modulo 2. + + -- Built-in Function: int __builtin_ffsl (long) + Similar to '__builtin_ffs', except the argument type is 'long'. + + -- Built-in Function: int __builtin_clzl (unsigned long) + Similar to '__builtin_clz', except the argument type is 'unsigned + long'. + + -- Built-in Function: int __builtin_ctzl (unsigned long) + Similar to '__builtin_ctz', except the argument type is 'unsigned + long'. + + -- Built-in Function: int __builtin_clrsbl (long) + Similar to '__builtin_clrsb', except the argument type is 'long'. + + -- Built-in Function: int __builtin_popcountl (unsigned long) + Similar to '__builtin_popcount', except the argument type is + 'unsigned long'. + + -- Built-in Function: int __builtin_parityl (unsigned long) + Similar to '__builtin_parity', except the argument type is + 'unsigned long'. + + -- Built-in Function: int __builtin_ffsll (long long) + Similar to '__builtin_ffs', except the argument type is 'long + long'. + + -- Built-in Function: int __builtin_clzll (unsigned long long) + Similar to '__builtin_clz', except the argument type is 'unsigned + long long'. + + -- Built-in Function: int __builtin_ctzll (unsigned long long) + Similar to '__builtin_ctz', except the argument type is 'unsigned + long long'. + + -- Built-in Function: int __builtin_clrsbll (long long) + Similar to '__builtin_clrsb', except the argument type is 'long + long'. + + -- Built-in Function: int __builtin_popcountll (unsigned long long) + Similar to '__builtin_popcount', except the argument type is + 'unsigned long long'. + + -- Built-in Function: int __builtin_parityll (unsigned long long) + Similar to '__builtin_parity', except the argument type is + 'unsigned long long'. + + -- Built-in Function: double __builtin_powi (double, int) + Returns the first argument raised to the power of the second. + Unlike the 'pow' function no guarantees about precision and + rounding are made. + + -- Built-in Function: float __builtin_powif (float, int) + Similar to '__builtin_powi', except the argument and return types + are 'float'. + + -- Built-in Function: long double __builtin_powil (long double, int) + Similar to '__builtin_powi', except the argument and return types + are 'long double'. + + -- Built-in Function: uint16_t __builtin_bswap16 (uint16_t x) + Returns X with the order of the bytes reversed; for example, + '0xaabb' becomes '0xbbaa'. Byte here always means exactly 8 bits. + + -- Built-in Function: uint32_t __builtin_bswap32 (uint32_t x) + Similar to '__builtin_bswap16', except the argument and return + types are 32 bit. + + -- Built-in Function: uint64_t __builtin_bswap64 (uint64_t x) + Similar to '__builtin_bswap32', except the argument and return + types are 64 bit. + + +File: gcc.info, Node: Target Builtins, Next: Target Format Checks, Prev: Other Builtins, Up: C Extensions + +6.57 Built-in Functions Specific to Particular Target Machines +============================================================== + +On some target machines, GCC supports many built-in functions specific +to those machines. Generally these generate calls to specific machine +instructions, but allow the compiler to schedule those calls. + +* Menu: + +* Alpha Built-in Functions:: +* Altera Nios II Built-in Functions:: +* ARC Built-in Functions:: +* ARC SIMD Built-in Functions:: +* ARM iWMMXt Built-in Functions:: +* ARM NEON Intrinsics:: +* ARM ACLE Intrinsics:: +* AVR Built-in Functions:: +* Blackfin Built-in Functions:: +* FR-V Built-in Functions:: +* X86 Built-in Functions:: +* X86 transactional memory intrinsics:: +* MIPS DSP Built-in Functions:: +* MIPS Paired-Single Support:: +* MIPS Loongson Built-in Functions:: +* Other MIPS Built-in Functions:: +* MSP430 Built-in Functions:: +* NDS32 Built-in Functions:: +* picoChip Built-in Functions:: +* PowerPC Built-in Functions:: +* PowerPC AltiVec/VSX Built-in Functions:: +* PowerPC Hardware Transactional Memory Built-in Functions:: +* RX Built-in Functions:: +* S/390 System z Built-in Functions:: +* SH Built-in Functions:: +* SPARC VIS Built-in Functions:: +* SPU Built-in Functions:: +* TI C6X Built-in Functions:: +* TILE-Gx Built-in Functions:: +* TILEPro Built-in Functions:: + + +File: gcc.info, Node: Alpha Built-in Functions, Next: Altera Nios II Built-in Functions, Up: Target Builtins + +6.57.1 Alpha Built-in Functions +------------------------------- + +These built-in functions are available for the Alpha family of +processors, depending on the command-line switches used. + + The following built-in functions are always available. They all +generate the machine instruction that is part of the name. + + long __builtin_alpha_implver (void) + long __builtin_alpha_rpcc (void) + long __builtin_alpha_amask (long) + long __builtin_alpha_cmpbge (long, long) + long __builtin_alpha_extbl (long, long) + long __builtin_alpha_extwl (long, long) + long __builtin_alpha_extll (long, long) + long __builtin_alpha_extql (long, long) + long __builtin_alpha_extwh (long, long) + long __builtin_alpha_extlh (long, long) + long __builtin_alpha_extqh (long, long) + long __builtin_alpha_insbl (long, long) + long __builtin_alpha_inswl (long, long) + long __builtin_alpha_insll (long, long) + long __builtin_alpha_insql (long, long) + long __builtin_alpha_inswh (long, long) + long __builtin_alpha_inslh (long, long) + long __builtin_alpha_insqh (long, long) + long __builtin_alpha_mskbl (long, long) + long __builtin_alpha_mskwl (long, long) + long __builtin_alpha_mskll (long, long) + long __builtin_alpha_mskql (long, long) + long __builtin_alpha_mskwh (long, long) + long __builtin_alpha_msklh (long, long) + long __builtin_alpha_mskqh (long, long) + long __builtin_alpha_umulh (long, long) + long __builtin_alpha_zap (long, long) + long __builtin_alpha_zapnot (long, long) + + The following built-in functions are always with '-mmax' or '-mcpu=CPU' +where CPU is 'pca56' or later. They all generate the machine +instruction that is part of the name. + + long __builtin_alpha_pklb (long) + long __builtin_alpha_pkwb (long) + long __builtin_alpha_unpkbl (long) + long __builtin_alpha_unpkbw (long) + long __builtin_alpha_minub8 (long, long) + long __builtin_alpha_minsb8 (long, long) + long __builtin_alpha_minuw4 (long, long) + long __builtin_alpha_minsw4 (long, long) + long __builtin_alpha_maxub8 (long, long) + long __builtin_alpha_maxsb8 (long, long) + long __builtin_alpha_maxuw4 (long, long) + long __builtin_alpha_maxsw4 (long, long) + long __builtin_alpha_perr (long, long) + + The following built-in functions are always with '-mcix' or '-mcpu=CPU' +where CPU is 'ev67' or later. They all generate the machine instruction +that is part of the name. + + long __builtin_alpha_cttz (long) + long __builtin_alpha_ctlz (long) + long __builtin_alpha_ctpop (long) + + The following built-in functions are available on systems that use the +OSF/1 PALcode. Normally they invoke the 'rduniq' and 'wruniq' PAL +calls, but when invoked with '-mtls-kernel', they invoke 'rdval' and +'wrval'. + + void *__builtin_thread_pointer (void) + void __builtin_set_thread_pointer (void *) + + +File: gcc.info, Node: Altera Nios II Built-in Functions, Next: ARC Built-in Functions, Prev: Alpha Built-in Functions, Up: Target Builtins + +6.57.2 Altera Nios II Built-in Functions +---------------------------------------- + +These built-in functions are available for the Altera Nios II family of +processors. + + The following built-in functions are always available. They all +generate the machine instruction that is part of the name. + + int __builtin_ldbio (volatile const void *) + int __builtin_ldbuio (volatile const void *) + int __builtin_ldhio (volatile const void *) + int __builtin_ldhuio (volatile const void *) + int __builtin_ldwio (volatile const void *) + void __builtin_stbio (volatile void *, int) + void __builtin_sthio (volatile void *, int) + void __builtin_stwio (volatile void *, int) + void __builtin_sync (void) + int __builtin_rdctl (int) + void __builtin_wrctl (int, int) + + The following built-in functions are always available. They all +generate a Nios II Custom Instruction. The name of the function +represents the types that the function takes and returns. The letter +before the 'n' is the return type or void if absent. The 'n' represents +the first parameter to all the custom instructions, the custom +instruction number. The two letters after the 'n' represent the up to +two parameters to the function. + + The letters represent the following data types: +'<no letter>' + 'void' for return type and no parameter for parameter types. + +'i' + 'int' for return type and parameter type + +'f' + 'float' for return type and parameter type + +'p' + 'void *' for return type and parameter type + + And the function names are: + void __builtin_custom_n (void) + void __builtin_custom_ni (int) + void __builtin_custom_nf (float) + void __builtin_custom_np (void *) + void __builtin_custom_nii (int, int) + void __builtin_custom_nif (int, float) + void __builtin_custom_nip (int, void *) + void __builtin_custom_nfi (float, int) + void __builtin_custom_nff (float, float) + void __builtin_custom_nfp (float, void *) + void __builtin_custom_npi (void *, int) + void __builtin_custom_npf (void *, float) + void __builtin_custom_npp (void *, void *) + int __builtin_custom_in (void) + int __builtin_custom_ini (int) + int __builtin_custom_inf (float) + int __builtin_custom_inp (void *) + int __builtin_custom_inii (int, int) + int __builtin_custom_inif (int, float) + int __builtin_custom_inip (int, void *) + int __builtin_custom_infi (float, int) + int __builtin_custom_inff (float, float) + int __builtin_custom_infp (float, void *) + int __builtin_custom_inpi (void *, int) + int __builtin_custom_inpf (void *, float) + int __builtin_custom_inpp (void *, void *) + float __builtin_custom_fn (void) + float __builtin_custom_fni (int) + float __builtin_custom_fnf (float) + float __builtin_custom_fnp (void *) + float __builtin_custom_fnii (int, int) + float __builtin_custom_fnif (int, float) + float __builtin_custom_fnip (int, void *) + float __builtin_custom_fnfi (float, int) + float __builtin_custom_fnff (float, float) + float __builtin_custom_fnfp (float, void *) + float __builtin_custom_fnpi (void *, int) + float __builtin_custom_fnpf (void *, float) + float __builtin_custom_fnpp (void *, void *) + void * __builtin_custom_pn (void) + void * __builtin_custom_pni (int) + void * __builtin_custom_pnf (float) + void * __builtin_custom_pnp (void *) + void * __builtin_custom_pnii (int, int) + void * __builtin_custom_pnif (int, float) + void * __builtin_custom_pnip (int, void *) + void * __builtin_custom_pnfi (float, int) + void * __builtin_custom_pnff (float, float) + void * __builtin_custom_pnfp (float, void *) + void * __builtin_custom_pnpi (void *, int) + void * __builtin_custom_pnpf (void *, float) + void * __builtin_custom_pnpp (void *, void *) + + +File: gcc.info, Node: ARC Built-in Functions, Next: ARC SIMD Built-in Functions, Prev: Altera Nios II Built-in Functions, Up: Target Builtins + +6.57.3 ARC Built-in Functions +----------------------------- + +The following built-in functions are provided for ARC targets. The +built-ins generate the corresponding assembly instructions. In the +examples given below, the generated code often requires an operand or +result to be in a register. Where necessary further code will be +generated to ensure this is true, but for brevity this is not described +in each case. + + _Note:_ Using a built-in to generate an instruction not supported by a +target may cause problems. At present the compiler is not guaranteed to +detect such misuse, and as a result an internal compiler error may be +generated. + + -- Built-in Function: int __builtin_arc_aligned (void *VAL, int + ALIGNVAL) + Return 1 if VAL is known to have the byte alignment given by + ALIGNVAL, otherwise return 0. Note that this is different from + __alignof__(*(char *)VAL) >= alignval + because __alignof__ sees only the type of the dereference, whereas + __builtin_arc_align uses alignment information from the pointer as + well as from the pointed-to type. The information available will + depend on optimization level. + + -- Built-in Function: void __builtin_arc_brk (void) + Generates + brk + + -- Built-in Function: unsigned int __builtin_arc_core_read (unsigned + int REGNO) + The operand is the number of a register to be read. Generates: + mov DEST, rREGNO + where the value in DEST will be the result returned from the + built-in. + + -- Built-in Function: void __builtin_arc_core_write (unsigned int + REGNO, unsigned int VAL) + The first operand is the number of a register to be written, the + second operand is a compile time constant to write into that + register. Generates: + mov rREGNO, VAL + + -- Built-in Function: int __builtin_arc_divaw (int A, int B) + Only available if either '-mcpu=ARC700' or '-meA' is set. + Generates: + divaw DEST, A, B + where the value in DEST will be the result returned from the + built-in. + + -- Built-in Function: void __builtin_arc_flag (unsigned int A) + Generates + flag A + + -- Built-in Function: unsigned int __builtin_arc_lr (unsigned int AUXR) + The operand, AUXV, is the address of an auxiliary register and must + be a compile time constant. Generates: + lr DEST, [AUXR] + Where the value in DEST will be the result returned from the + built-in. + + -- Built-in Function: void __builtin_arc_mul64 (int A, int B) + Only available with '-mmul64'. Generates: + mul64 A, B + + -- Built-in Function: void __builtin_arc_mulu64 (unsigned int A, + unsigned int B) + Only available with '-mmul64'. Generates: + mulu64 A, B + + -- Built-in Function: void __builtin_arc_nop (void) + Generates: + nop + + -- Built-in Function: int __builtin_arc_norm (int SRC) + Only valid if the 'norm' instruction is available through the + '-mnorm' option or by default with '-mcpu=ARC700'. Generates: + norm DEST, SRC + Where the value in DEST will be the result returned from the + built-in. + + -- Built-in Function: short int __builtin_arc_normw (short int SRC) + Only valid if the 'normw' instruction is available through the + '-mnorm' option or by default with '-mcpu=ARC700'. Generates: + normw DEST, SRC + Where the value in DEST will be the result returned from the + built-in. + + -- Built-in Function: void __builtin_arc_rtie (void) + Generates: + rtie + + -- Built-in Function: void __builtin_arc_sleep (int A + Generates: + sleep A + + -- Built-in Function: void __builtin_arc_sr (unsigned int AUXR, + unsigned int VAL) + The first argument, AUXV, is the address of an auxiliary register, + the second argument, VAL, is a compile time constant to be written + to the register. Generates: + sr AUXR, [VAL] + + -- Built-in Function: int __builtin_arc_swap (int SRC) + Only valid with '-mswap'. Generates: + swap DEST, SRC + Where the value in DEST will be the result returned from the + built-in. + + -- Built-in Function: void __builtin_arc_swi (void) + Generates: + swi + + -- Built-in Function: void __builtin_arc_sync (void) + Only available with '-mcpu=ARC700'. Generates: + sync + + -- Built-in Function: void __builtin_arc_trap_s (unsigned int C) + Only available with '-mcpu=ARC700'. Generates: + trap_s C + + -- Built-in Function: void __builtin_arc_unimp_s (void) + Only available with '-mcpu=ARC700'. Generates: + unimp_s + + The instructions generated by the following builtins are not considered +as candidates for scheduling. They are not moved around by the compiler +during scheduling, and thus can be expected to appear where they are put +in the C code: + __builtin_arc_brk() + __builtin_arc_core_read() + __builtin_arc_core_write() + __builtin_arc_flag() + __builtin_arc_lr() + __builtin_arc_sleep() + __builtin_arc_sr() + __builtin_arc_swi() + + +File: gcc.info, Node: ARC SIMD Built-in Functions, Next: ARM iWMMXt Built-in Functions, Prev: ARC Built-in Functions, Up: Target Builtins + +6.57.4 ARC SIMD Built-in Functions +---------------------------------- + +SIMD builtins provided by the compiler can be used to generate the +vector instructions. This section describes the available builtins and +their usage in programs. With the '-msimd' option, the compiler +provides 128-bit vector types, which can be specified using the +'vector_size' attribute. The header file 'arc-simd.h' can be included +to use the following predefined types: + typedef int __v4si __attribute__((vector_size(16))); + typedef short __v8hi __attribute__((vector_size(16))); + + These types can be used to define 128-bit variables. The built-in +functions listed in the following section can be used on these variables +to generate the vector operations. + + For all builtins, '__builtin_arc_SOMEINSN', the header file +'arc-simd.h' also provides equivalent macros called '_SOMEINSN' that can +be used for programming ease and improved readability. The following +macros for DMA control are also provided: + #define _setup_dma_in_channel_reg _vdiwr + #define _setup_dma_out_channel_reg _vdowr + + The following is a complete list of all the SIMD built-ins provided for +ARC, grouped by calling signature. + + The following take two '__v8hi' arguments and return a '__v8hi' result: + __v8hi __builtin_arc_vaddaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vaddw (__v8hi, __v8hi) + __v8hi __builtin_arc_vand (__v8hi, __v8hi) + __v8hi __builtin_arc_vandaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vavb (__v8hi, __v8hi) + __v8hi __builtin_arc_vavrb (__v8hi, __v8hi) + __v8hi __builtin_arc_vbic (__v8hi, __v8hi) + __v8hi __builtin_arc_vbicaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vdifaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vdifw (__v8hi, __v8hi) + __v8hi __builtin_arc_veqw (__v8hi, __v8hi) + __v8hi __builtin_arc_vh264f (__v8hi, __v8hi) + __v8hi __builtin_arc_vh264ft (__v8hi, __v8hi) + __v8hi __builtin_arc_vh264fw (__v8hi, __v8hi) + __v8hi __builtin_arc_vlew (__v8hi, __v8hi) + __v8hi __builtin_arc_vltw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmaxaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmaxw (__v8hi, __v8hi) + __v8hi __builtin_arc_vminaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vminw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr1aw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr1w (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr2aw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr2w (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr3aw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr3w (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr4aw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr4w (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr5aw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr5w (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr6aw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr6w (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr7aw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmr7w (__v8hi, __v8hi) + __v8hi __builtin_arc_vmrb (__v8hi, __v8hi) + __v8hi __builtin_arc_vmulaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmulfaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmulfw (__v8hi, __v8hi) + __v8hi __builtin_arc_vmulw (__v8hi, __v8hi) + __v8hi __builtin_arc_vnew (__v8hi, __v8hi) + __v8hi __builtin_arc_vor (__v8hi, __v8hi) + __v8hi __builtin_arc_vsubaw (__v8hi, __v8hi) + __v8hi __builtin_arc_vsubw (__v8hi, __v8hi) + __v8hi __builtin_arc_vsummw (__v8hi, __v8hi) + __v8hi __builtin_arc_vvc1f (__v8hi, __v8hi) + __v8hi __builtin_arc_vvc1ft (__v8hi, __v8hi) + __v8hi __builtin_arc_vxor (__v8hi, __v8hi) + __v8hi __builtin_arc_vxoraw (__v8hi, __v8hi) + + The following take one '__v8hi' and one 'int' argument and return a +'__v8hi' result: + + __v8hi __builtin_arc_vbaddw (__v8hi, int) + __v8hi __builtin_arc_vbmaxw (__v8hi, int) + __v8hi __builtin_arc_vbminw (__v8hi, int) + __v8hi __builtin_arc_vbmulaw (__v8hi, int) + __v8hi __builtin_arc_vbmulfw (__v8hi, int) + __v8hi __builtin_arc_vbmulw (__v8hi, int) + __v8hi __builtin_arc_vbrsubw (__v8hi, int) + __v8hi __builtin_arc_vbsubw (__v8hi, int) + + The following take one '__v8hi' argument and one 'int' argument which +must be a 3-bit compile time constant indicating a register number +I0-I7. They return a '__v8hi' result. + __v8hi __builtin_arc_vasrw (__v8hi, const int) + __v8hi __builtin_arc_vsr8 (__v8hi, const int) + __v8hi __builtin_arc_vsr8aw (__v8hi, const int) + + The following take one '__v8hi' argument and one 'int' argument which +must be a 6-bit compile time constant. They return a '__v8hi' result. + __v8hi __builtin_arc_vasrpwbi (__v8hi, const int) + __v8hi __builtin_arc_vasrrpwbi (__v8hi, const int) + __v8hi __builtin_arc_vasrrwi (__v8hi, const int) + __v8hi __builtin_arc_vasrsrwi (__v8hi, const int) + __v8hi __builtin_arc_vasrwi (__v8hi, const int) + __v8hi __builtin_arc_vsr8awi (__v8hi, const int) + __v8hi __builtin_arc_vsr8i (__v8hi, const int) + + The following take one '__v8hi' argument and one 'int' argument which +must be a 8-bit compile time constant. They return a '__v8hi' result. + __v8hi __builtin_arc_vd6tapf (__v8hi, const int) + __v8hi __builtin_arc_vmvaw (__v8hi, const int) + __v8hi __builtin_arc_vmvw (__v8hi, const int) + __v8hi __builtin_arc_vmvzw (__v8hi, const int) + + The following take two 'int' arguments, the second of which which must +be a 8-bit compile time constant. They return a '__v8hi' result: + __v8hi __builtin_arc_vmovaw (int, const int) + __v8hi __builtin_arc_vmovw (int, const int) + __v8hi __builtin_arc_vmovzw (int, const int) + + The following take a single '__v8hi' argument and return a '__v8hi' +result: + __v8hi __builtin_arc_vabsaw (__v8hi) + __v8hi __builtin_arc_vabsw (__v8hi) + __v8hi __builtin_arc_vaddsuw (__v8hi) + __v8hi __builtin_arc_vexch1 (__v8hi) + __v8hi __builtin_arc_vexch2 (__v8hi) + __v8hi __builtin_arc_vexch4 (__v8hi) + __v8hi __builtin_arc_vsignw (__v8hi) + __v8hi __builtin_arc_vupbaw (__v8hi) + __v8hi __builtin_arc_vupbw (__v8hi) + __v8hi __builtin_arc_vupsbaw (__v8hi) + __v8hi __builtin_arc_vupsbw (__v8hi) + + The followign take two 'int' arguments and return no result: + void __builtin_arc_vdirun (int, int) + void __builtin_arc_vdorun (int, int) + + The following take two 'int' arguments and return no result. The first +argument must a 3-bit compile time constant indicating one of the +DR0-DR7 DMA setup channels: + void __builtin_arc_vdiwr (const int, int) + void __builtin_arc_vdowr (const int, int) + + The following take an 'int' argument and return no result: + void __builtin_arc_vendrec (int) + void __builtin_arc_vrec (int) + void __builtin_arc_vrecrun (int) + void __builtin_arc_vrun (int) + + The following take a '__v8hi' argument and two 'int' arguments and +return a '__v8hi' result. The second argument must be a 3-bit compile +time constants, indicating one the registers I0-I7, and the third +argument must be an 8-bit compile time constant. + + _Note:_ Although the equivalent hardware instructions do not take an +SIMD register as an operand, these builtins overwrite the relevant bits +of the '__v8hi' register provided as the first argument with the value +loaded from the '[Ib, u8]' location in the SDM. + + __v8hi __builtin_arc_vld32 (__v8hi, const int, const int) + __v8hi __builtin_arc_vld32wh (__v8hi, const int, const int) + __v8hi __builtin_arc_vld32wl (__v8hi, const int, const int) + __v8hi __builtin_arc_vld64 (__v8hi, const int, const int) + + The following take two 'int' arguments and return a '__v8hi' result. +The first argument must be a 3-bit compile time constants, indicating +one the registers I0-I7, and the second argument must be an 8-bit +compile time constant. + + __v8hi __builtin_arc_vld128 (const int, const int) + __v8hi __builtin_arc_vld64w (const int, const int) + + The following take a '__v8hi' argument and two 'int' arguments and +return no result. The second argument must be a 3-bit compile time +constants, indicating one the registers I0-I7, and the third argument +must be an 8-bit compile time constant. + + void __builtin_arc_vst128 (__v8hi, const int, const int) + void __builtin_arc_vst64 (__v8hi, const int, const int) + + The following take a '__v8hi' argument and three 'int' arguments and +return no result. The second argument must be a 3-bit compile-time +constant, identifying the 16-bit sub-register to be stored, the third +argument must be a 3-bit compile time constants, indicating one the +registers I0-I7, and the fourth argument must be an 8-bit compile time +constant. + + void __builtin_arc_vst16_n (__v8hi, const int, const int, const int) + void __builtin_arc_vst32_n (__v8hi, const int, const int, const int) + + +File: gcc.info, Node: ARM iWMMXt Built-in Functions, Next: ARM NEON Intrinsics, Prev: ARC SIMD Built-in Functions, Up: Target Builtins + +6.57.5 ARM iWMMXt Built-in Functions +------------------------------------ + +These built-in functions are available for the ARM family of processors +when the '-mcpu=iwmmxt' switch is used: + + typedef int v2si __attribute__ ((vector_size (8))); + typedef short v4hi __attribute__ ((vector_size (8))); + typedef char v8qi __attribute__ ((vector_size (8))); + + int __builtin_arm_getwcgr0 (void) + void __builtin_arm_setwcgr0 (int) + int __builtin_arm_getwcgr1 (void) + void __builtin_arm_setwcgr1 (int) + int __builtin_arm_getwcgr2 (void) + void __builtin_arm_setwcgr2 (int) + int __builtin_arm_getwcgr3 (void) + void __builtin_arm_setwcgr3 (int) + int __builtin_arm_textrmsb (v8qi, int) + int __builtin_arm_textrmsh (v4hi, int) + int __builtin_arm_textrmsw (v2si, int) + int __builtin_arm_textrmub (v8qi, int) + int __builtin_arm_textrmuh (v4hi, int) + int __builtin_arm_textrmuw (v2si, int) + v8qi __builtin_arm_tinsrb (v8qi, int, int) + v4hi __builtin_arm_tinsrh (v4hi, int, int) + v2si __builtin_arm_tinsrw (v2si, int, int) + long long __builtin_arm_tmia (long long, int, int) + long long __builtin_arm_tmiabb (long long, int, int) + long long __builtin_arm_tmiabt (long long, int, int) + long long __builtin_arm_tmiaph (long long, int, int) + long long __builtin_arm_tmiatb (long long, int, int) + long long __builtin_arm_tmiatt (long long, int, int) + int __builtin_arm_tmovmskb (v8qi) + int __builtin_arm_tmovmskh (v4hi) + int __builtin_arm_tmovmskw (v2si) + long long __builtin_arm_waccb (v8qi) + long long __builtin_arm_wacch (v4hi) + long long __builtin_arm_waccw (v2si) + v8qi __builtin_arm_waddb (v8qi, v8qi) + v8qi __builtin_arm_waddbss (v8qi, v8qi) + v8qi __builtin_arm_waddbus (v8qi, v8qi) + v4hi __builtin_arm_waddh (v4hi, v4hi) + v4hi __builtin_arm_waddhss (v4hi, v4hi) + v4hi __builtin_arm_waddhus (v4hi, v4hi) + v2si __builtin_arm_waddw (v2si, v2si) + v2si __builtin_arm_waddwss (v2si, v2si) + v2si __builtin_arm_waddwus (v2si, v2si) + v8qi __builtin_arm_walign (v8qi, v8qi, int) + long long __builtin_arm_wand(long long, long long) + long long __builtin_arm_wandn (long long, long long) + v8qi __builtin_arm_wavg2b (v8qi, v8qi) + v8qi __builtin_arm_wavg2br (v8qi, v8qi) + v4hi __builtin_arm_wavg2h (v4hi, v4hi) + v4hi __builtin_arm_wavg2hr (v4hi, v4hi) + v8qi __builtin_arm_wcmpeqb (v8qi, v8qi) + v4hi __builtin_arm_wcmpeqh (v4hi, v4hi) + v2si __builtin_arm_wcmpeqw (v2si, v2si) + v8qi __builtin_arm_wcmpgtsb (v8qi, v8qi) + v4hi __builtin_arm_wcmpgtsh (v4hi, v4hi) + v2si __builtin_arm_wcmpgtsw (v2si, v2si) + v8qi __builtin_arm_wcmpgtub (v8qi, v8qi) + v4hi __builtin_arm_wcmpgtuh (v4hi, v4hi) + v2si __builtin_arm_wcmpgtuw (v2si, v2si) + long long __builtin_arm_wmacs (long long, v4hi, v4hi) + long long __builtin_arm_wmacsz (v4hi, v4hi) + long long __builtin_arm_wmacu (long long, v4hi, v4hi) + long long __builtin_arm_wmacuz (v4hi, v4hi) + v4hi __builtin_arm_wmadds (v4hi, v4hi) + v4hi __builtin_arm_wmaddu (v4hi, v4hi) + v8qi __builtin_arm_wmaxsb (v8qi, v8qi) + v4hi __builtin_arm_wmaxsh (v4hi, v4hi) + v2si __builtin_arm_wmaxsw (v2si, v2si) + v8qi __builtin_arm_wmaxub (v8qi, v8qi) + v4hi __builtin_arm_wmaxuh (v4hi, v4hi) + v2si __builtin_arm_wmaxuw (v2si, v2si) + v8qi __builtin_arm_wminsb (v8qi, v8qi) + v4hi __builtin_arm_wminsh (v4hi, v4hi) + v2si __builtin_arm_wminsw (v2si, v2si) + v8qi __builtin_arm_wminub (v8qi, v8qi) + v4hi __builtin_arm_wminuh (v4hi, v4hi) + v2si __builtin_arm_wminuw (v2si, v2si) + v4hi __builtin_arm_wmulsm (v4hi, v4hi) + v4hi __builtin_arm_wmulul (v4hi, v4hi) + v4hi __builtin_arm_wmulum (v4hi, v4hi) + long long __builtin_arm_wor (long long, long long) + v2si __builtin_arm_wpackdss (long long, long long) + v2si __builtin_arm_wpackdus (long long, long long) + v8qi __builtin_arm_wpackhss (v4hi, v4hi) + v8qi __builtin_arm_wpackhus (v4hi, v4hi) + v4hi __builtin_arm_wpackwss (v2si, v2si) + v4hi __builtin_arm_wpackwus (v2si, v2si) + long long __builtin_arm_wrord (long long, long long) + long long __builtin_arm_wrordi (long long, int) + v4hi __builtin_arm_wrorh (v4hi, long long) + v4hi __builtin_arm_wrorhi (v4hi, int) + v2si __builtin_arm_wrorw (v2si, long long) + v2si __builtin_arm_wrorwi (v2si, int) + v2si __builtin_arm_wsadb (v2si, v8qi, v8qi) + v2si __builtin_arm_wsadbz (v8qi, v8qi) + v2si __builtin_arm_wsadh (v2si, v4hi, v4hi) + v2si __builtin_arm_wsadhz (v4hi, v4hi) + v4hi __builtin_arm_wshufh (v4hi, int) + long long __builtin_arm_wslld (long long, long long) + long long __builtin_arm_wslldi (long long, int) + v4hi __builtin_arm_wsllh (v4hi, long long) + v4hi __builtin_arm_wsllhi (v4hi, int) + v2si __builtin_arm_wsllw (v2si, long long) + v2si __builtin_arm_wsllwi (v2si, int) + long long __builtin_arm_wsrad (long long, long long) + long long __builtin_arm_wsradi (long long, int) + v4hi __builtin_arm_wsrah (v4hi, long long) + v4hi __builtin_arm_wsrahi (v4hi, int) + v2si __builtin_arm_wsraw (v2si, long long) + v2si __builtin_arm_wsrawi (v2si, int) + long long __builtin_arm_wsrld (long long, long long) + long long __builtin_arm_wsrldi (long long, int) + v4hi __builtin_arm_wsrlh (v4hi, long long) + v4hi __builtin_arm_wsrlhi (v4hi, int) + v2si __builtin_arm_wsrlw (v2si, long long) + v2si __builtin_arm_wsrlwi (v2si, int) + v8qi __builtin_arm_wsubb (v8qi, v8qi) + v8qi __builtin_arm_wsubbss (v8qi, v8qi) + v8qi __builtin_arm_wsubbus (v8qi, v8qi) + v4hi __builtin_arm_wsubh (v4hi, v4hi) + v4hi __builtin_arm_wsubhss (v4hi, v4hi) + v4hi __builtin_arm_wsubhus (v4hi, v4hi) + v2si __builtin_arm_wsubw (v2si, v2si) + v2si __builtin_arm_wsubwss (v2si, v2si) + v2si __builtin_arm_wsubwus (v2si, v2si) + v4hi __builtin_arm_wunpckehsb (v8qi) + v2si __builtin_arm_wunpckehsh (v4hi) + long long __builtin_arm_wunpckehsw (v2si) + v4hi __builtin_arm_wunpckehub (v8qi) + v2si __builtin_arm_wunpckehuh (v4hi) + long long __builtin_arm_wunpckehuw (v2si) + v4hi __builtin_arm_wunpckelsb (v8qi) + v2si __builtin_arm_wunpckelsh (v4hi) + long long __builtin_arm_wunpckelsw (v2si) + v4hi __builtin_arm_wunpckelub (v8qi) + v2si __builtin_arm_wunpckeluh (v4hi) + long long __builtin_arm_wunpckeluw (v2si) + v8qi __builtin_arm_wunpckihb (v8qi, v8qi) + v4hi __builtin_arm_wunpckihh (v4hi, v4hi) + v2si __builtin_arm_wunpckihw (v2si, v2si) + v8qi __builtin_arm_wunpckilb (v8qi, v8qi) + v4hi __builtin_arm_wunpckilh (v4hi, v4hi) + v2si __builtin_arm_wunpckilw (v2si, v2si) + long long __builtin_arm_wxor (long long, long long) + long long __builtin_arm_wzero () + + +File: gcc.info, Node: ARM NEON Intrinsics, Next: ARM ACLE Intrinsics, Prev: ARM iWMMXt Built-in Functions, Up: Target Builtins + +6.57.6 ARM NEON Intrinsics +-------------------------- + +These built-in intrinsics for the ARM Advanced SIMD extension are +available when the '-mfpu=neon' switch is used: + +6.57.6.1 Addition +................. + + * uint32x2_t vadd_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vadd.i32 D0, D0, D0' + + * uint16x4_t vadd_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vadd.i16 D0, D0, D0' + + * uint8x8_t vadd_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vadd.i8 D0, D0, D0' + + * int32x2_t vadd_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vadd.i32 D0, D0, D0' + + * int16x4_t vadd_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vadd.i16 D0, D0, D0' + + * int8x8_t vadd_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vadd.i8 D0, D0, D0' + + * float32x2_t vadd_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vadd.f32 D0, D0, D0' + + * uint64x1_t vadd_u64 (uint64x1_t, uint64x1_t) + + * int64x1_t vadd_s64 (int64x1_t, int64x1_t) + + * uint32x4_t vaddq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vadd.i32 Q0, Q0, Q0' + + * uint16x8_t vaddq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vadd.i16 Q0, Q0, Q0' + + * uint8x16_t vaddq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vadd.i8 Q0, Q0, Q0' + + * int32x4_t vaddq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vadd.i32 Q0, Q0, Q0' + + * int16x8_t vaddq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vadd.i16 Q0, Q0, Q0' + + * int8x16_t vaddq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vadd.i8 Q0, Q0, Q0' + + * uint64x2_t vaddq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vadd.i64 Q0, Q0, Q0' + + * int64x2_t vaddq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vadd.i64 Q0, Q0, Q0' + + * float32x4_t vaddq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vadd.f32 Q0, Q0, Q0' + + * uint64x2_t vaddl_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vaddl.u32 Q0, D0, D0' + + * uint32x4_t vaddl_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vaddl.u16 Q0, D0, D0' + + * uint16x8_t vaddl_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vaddl.u8 Q0, D0, D0' + + * int64x2_t vaddl_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vaddl.s32 Q0, D0, D0' + + * int32x4_t vaddl_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vaddl.s16 Q0, D0, D0' + + * int16x8_t vaddl_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vaddl.s8 Q0, D0, D0' + + * uint64x2_t vaddw_u32 (uint64x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vaddw.u32 Q0, Q0, D0' + + * uint32x4_t vaddw_u16 (uint32x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vaddw.u16 Q0, Q0, D0' + + * uint16x8_t vaddw_u8 (uint16x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vaddw.u8 Q0, Q0, D0' + + * int64x2_t vaddw_s32 (int64x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vaddw.s32 Q0, Q0, D0' + + * int32x4_t vaddw_s16 (int32x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vaddw.s16 Q0, Q0, D0' + + * int16x8_t vaddw_s8 (int16x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vaddw.s8 Q0, Q0, D0' + + * uint32x2_t vhadd_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vhadd.u32 D0, D0, D0' + + * uint16x4_t vhadd_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vhadd.u16 D0, D0, D0' + + * uint8x8_t vhadd_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vhadd.u8 D0, D0, D0' + + * int32x2_t vhadd_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vhadd.s32 D0, D0, D0' + + * int16x4_t vhadd_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vhadd.s16 D0, D0, D0' + + * int8x8_t vhadd_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vhadd.s8 D0, D0, D0' + + * uint32x4_t vhaddq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vhadd.u32 Q0, Q0, Q0' + + * uint16x8_t vhaddq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vhadd.u16 Q0, Q0, Q0' + + * uint8x16_t vhaddq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vhadd.u8 Q0, Q0, Q0' + + * int32x4_t vhaddq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vhadd.s32 Q0, Q0, Q0' + + * int16x8_t vhaddq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vhadd.s16 Q0, Q0, Q0' + + * int8x16_t vhaddq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vhadd.s8 Q0, Q0, Q0' + + * uint32x2_t vrhadd_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vrhadd.u32 D0, D0, D0' + + * uint16x4_t vrhadd_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vrhadd.u16 D0, D0, D0' + + * uint8x8_t vrhadd_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vrhadd.u8 D0, D0, D0' + + * int32x2_t vrhadd_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vrhadd.s32 D0, D0, D0' + + * int16x4_t vrhadd_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vrhadd.s16 D0, D0, D0' + + * int8x8_t vrhadd_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vrhadd.s8 D0, D0, D0' + + * uint32x4_t vrhaddq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vrhadd.u32 Q0, Q0, Q0' + + * uint16x8_t vrhaddq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vrhadd.u16 Q0, Q0, Q0' + + * uint8x16_t vrhaddq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vrhadd.u8 Q0, Q0, Q0' + + * int32x4_t vrhaddq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vrhadd.s32 Q0, Q0, Q0' + + * int16x8_t vrhaddq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vrhadd.s16 Q0, Q0, Q0' + + * int8x16_t vrhaddq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vrhadd.s8 Q0, Q0, Q0' + + * uint32x2_t vqadd_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vqadd.u32 D0, D0, D0' + + * uint16x4_t vqadd_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vqadd.u16 D0, D0, D0' + + * uint8x8_t vqadd_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vqadd.u8 D0, D0, D0' + + * int32x2_t vqadd_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqadd.s32 D0, D0, D0' + + * int16x4_t vqadd_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqadd.s16 D0, D0, D0' + + * int8x8_t vqadd_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vqadd.s8 D0, D0, D0' + + * uint64x1_t vqadd_u64 (uint64x1_t, uint64x1_t) + _Form of expected instruction(s):_ 'vqadd.u64 D0, D0, D0' + + * int64x1_t vqadd_s64 (int64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vqadd.s64 D0, D0, D0' + + * uint32x4_t vqaddq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vqadd.u32 Q0, Q0, Q0' + + * uint16x8_t vqaddq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vqadd.u16 Q0, Q0, Q0' + + * uint8x16_t vqaddq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vqadd.u8 Q0, Q0, Q0' + + * int32x4_t vqaddq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vqadd.s32 Q0, Q0, Q0' + + * int16x8_t vqaddq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vqadd.s16 Q0, Q0, Q0' + + * int8x16_t vqaddq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vqadd.s8 Q0, Q0, Q0' + + * uint64x2_t vqaddq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vqadd.u64 Q0, Q0, Q0' + + * int64x2_t vqaddq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vqadd.s64 Q0, Q0, Q0' + + * uint32x2_t vaddhn_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vaddhn.i64 D0, Q0, Q0' + + * uint16x4_t vaddhn_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vaddhn.i32 D0, Q0, Q0' + + * uint8x8_t vaddhn_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vaddhn.i16 D0, Q0, Q0' + + * int32x2_t vaddhn_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vaddhn.i64 D0, Q0, Q0' + + * int16x4_t vaddhn_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vaddhn.i32 D0, Q0, Q0' + + * int8x8_t vaddhn_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vaddhn.i16 D0, Q0, Q0' + + * uint32x2_t vraddhn_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vraddhn.i64 D0, Q0, Q0' + + * uint16x4_t vraddhn_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vraddhn.i32 D0, Q0, Q0' + + * uint8x8_t vraddhn_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vraddhn.i16 D0, Q0, Q0' + + * int32x2_t vraddhn_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vraddhn.i64 D0, Q0, Q0' + + * int16x4_t vraddhn_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vraddhn.i32 D0, Q0, Q0' + + * int8x8_t vraddhn_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vraddhn.i16 D0, Q0, Q0' + +6.57.6.2 Multiplication +....................... + + * uint32x2_t vmul_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vmul.i32 D0, D0, D0' + + * uint16x4_t vmul_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vmul.i16 D0, D0, D0' + + * uint8x8_t vmul_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vmul.i8 D0, D0, D0' + + * int32x2_t vmul_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vmul.i32 D0, D0, D0' + + * int16x4_t vmul_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vmul.i16 D0, D0, D0' + + * int8x8_t vmul_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vmul.i8 D0, D0, D0' + + * float32x2_t vmul_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vmul.f32 D0, D0, D0' + + * poly8x8_t vmul_p8 (poly8x8_t, poly8x8_t) + _Form of expected instruction(s):_ 'vmul.p8 D0, D0, D0' + + * uint32x4_t vmulq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vmul.i32 Q0, Q0, Q0' + + * uint16x8_t vmulq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vmul.i16 Q0, Q0, Q0' + + * uint8x16_t vmulq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vmul.i8 Q0, Q0, Q0' + + * int32x4_t vmulq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vmul.i32 Q0, Q0, Q0' + + * int16x8_t vmulq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vmul.i16 Q0, Q0, Q0' + + * int8x16_t vmulq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vmul.i8 Q0, Q0, Q0' + + * float32x4_t vmulq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vmul.f32 Q0, Q0, Q0' + + * poly8x16_t vmulq_p8 (poly8x16_t, poly8x16_t) + _Form of expected instruction(s):_ 'vmul.p8 Q0, Q0, Q0' + + * int32x2_t vqdmulh_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqdmulh.s32 D0, D0, D0' + + * int16x4_t vqdmulh_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqdmulh.s16 D0, D0, D0' + + * int32x4_t vqdmulhq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vqdmulh.s32 Q0, Q0, Q0' + + * int16x8_t vqdmulhq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vqdmulh.s16 Q0, Q0, Q0' + + * int32x2_t vqrdmulh_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqrdmulh.s32 D0, D0, D0' + + * int16x4_t vqrdmulh_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqrdmulh.s16 D0, D0, D0' + + * int32x4_t vqrdmulhq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vqrdmulh.s32 Q0, Q0, Q0' + + * int16x8_t vqrdmulhq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vqrdmulh.s16 Q0, Q0, Q0' + + * uint64x2_t vmull_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vmull.u32 Q0, D0, D0' + + * uint32x4_t vmull_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vmull.u16 Q0, D0, D0' + + * uint16x8_t vmull_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vmull.u8 Q0, D0, D0' + + * int64x2_t vmull_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vmull.s32 Q0, D0, D0' + + * int32x4_t vmull_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vmull.s16 Q0, D0, D0' + + * int16x8_t vmull_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vmull.s8 Q0, D0, D0' + + * poly16x8_t vmull_p8 (poly8x8_t, poly8x8_t) + _Form of expected instruction(s):_ 'vmull.p8 Q0, D0, D0' + + * int64x2_t vqdmull_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqdmull.s32 Q0, D0, D0' + + * int32x4_t vqdmull_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqdmull.s16 Q0, D0, D0' + +6.57.6.3 Multiply-accumulate +............................ + + * uint32x2_t vmla_u32 (uint32x2_t, uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vmla.i32 D0, D0, D0' + + * uint16x4_t vmla_u16 (uint16x4_t, uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vmla.i16 D0, D0, D0' + + * uint8x8_t vmla_u8 (uint8x8_t, uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vmla.i8 D0, D0, D0' + + * int32x2_t vmla_s32 (int32x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vmla.i32 D0, D0, D0' + + * int16x4_t vmla_s16 (int16x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vmla.i16 D0, D0, D0' + + * int8x8_t vmla_s8 (int8x8_t, int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vmla.i8 D0, D0, D0' + + * float32x2_t vmla_f32 (float32x2_t, float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vmla.f32 D0, D0, D0' + + * uint32x4_t vmlaq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vmla.i32 Q0, Q0, Q0' + + * uint16x8_t vmlaq_u16 (uint16x8_t, uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vmla.i16 Q0, Q0, Q0' + + * uint8x16_t vmlaq_u8 (uint8x16_t, uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vmla.i8 Q0, Q0, Q0' + + * int32x4_t vmlaq_s32 (int32x4_t, int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vmla.i32 Q0, Q0, Q0' + + * int16x8_t vmlaq_s16 (int16x8_t, int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vmla.i16 Q0, Q0, Q0' + + * int8x16_t vmlaq_s8 (int8x16_t, int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vmla.i8 Q0, Q0, Q0' + + * float32x4_t vmlaq_f32 (float32x4_t, float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vmla.f32 Q0, Q0, Q0' + + * uint64x2_t vmlal_u32 (uint64x2_t, uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vmlal.u32 Q0, D0, D0' + + * uint32x4_t vmlal_u16 (uint32x4_t, uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vmlal.u16 Q0, D0, D0' + + * uint16x8_t vmlal_u8 (uint16x8_t, uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vmlal.u8 Q0, D0, D0' + + * int64x2_t vmlal_s32 (int64x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vmlal.s32 Q0, D0, D0' + + * int32x4_t vmlal_s16 (int32x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vmlal.s16 Q0, D0, D0' + + * int16x8_t vmlal_s8 (int16x8_t, int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vmlal.s8 Q0, D0, D0' + + * int64x2_t vqdmlal_s32 (int64x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqdmlal.s32 Q0, D0, D0' + + * int32x4_t vqdmlal_s16 (int32x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqdmlal.s16 Q0, D0, D0' + +6.57.6.4 Multiply-subtract +.......................... + + * uint32x2_t vmls_u32 (uint32x2_t, uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vmls.i32 D0, D0, D0' + + * uint16x4_t vmls_u16 (uint16x4_t, uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vmls.i16 D0, D0, D0' + + * uint8x8_t vmls_u8 (uint8x8_t, uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vmls.i8 D0, D0, D0' + + * int32x2_t vmls_s32 (int32x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vmls.i32 D0, D0, D0' + + * int16x4_t vmls_s16 (int16x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vmls.i16 D0, D0, D0' + + * int8x8_t vmls_s8 (int8x8_t, int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vmls.i8 D0, D0, D0' + + * float32x2_t vmls_f32 (float32x2_t, float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vmls.f32 D0, D0, D0' + + * uint32x4_t vmlsq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vmls.i32 Q0, Q0, Q0' + + * uint16x8_t vmlsq_u16 (uint16x8_t, uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vmls.i16 Q0, Q0, Q0' + + * uint8x16_t vmlsq_u8 (uint8x16_t, uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vmls.i8 Q0, Q0, Q0' + + * int32x4_t vmlsq_s32 (int32x4_t, int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vmls.i32 Q0, Q0, Q0' + + * int16x8_t vmlsq_s16 (int16x8_t, int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vmls.i16 Q0, Q0, Q0' + + * int8x16_t vmlsq_s8 (int8x16_t, int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vmls.i8 Q0, Q0, Q0' + + * float32x4_t vmlsq_f32 (float32x4_t, float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vmls.f32 Q0, Q0, Q0' + + * uint64x2_t vmlsl_u32 (uint64x2_t, uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vmlsl.u32 Q0, D0, D0' + + * uint32x4_t vmlsl_u16 (uint32x4_t, uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vmlsl.u16 Q0, D0, D0' + + * uint16x8_t vmlsl_u8 (uint16x8_t, uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vmlsl.u8 Q0, D0, D0' + + * int64x2_t vmlsl_s32 (int64x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vmlsl.s32 Q0, D0, D0' + + * int32x4_t vmlsl_s16 (int32x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vmlsl.s16 Q0, D0, D0' + + * int16x8_t vmlsl_s8 (int16x8_t, int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vmlsl.s8 Q0, D0, D0' + + * int64x2_t vqdmlsl_s32 (int64x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqdmlsl.s32 Q0, D0, D0' + + * int32x4_t vqdmlsl_s16 (int32x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqdmlsl.s16 Q0, D0, D0' + +6.57.6.5 Fused-multiply-accumulate +.................................. + + * float32x2_t vfma_f32 (float32x2_t, float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vfma.f32 D0, D0, D0' + + * float32x4_t vfmaq_f32 (float32x4_t, float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vfma.f32 Q0, Q0, Q0' + +6.57.6.6 Fused-multiply-subtract +................................ + + * float32x2_t vfms_f32 (float32x2_t, float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vfms.f32 D0, D0, D0' + + * float32x4_t vfmsq_f32 (float32x4_t, float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vfms.f32 Q0, Q0, Q0' + +6.57.6.7 Round to integral (to nearest, ties to even) +..................................................... + + * float32x2_t vrndn_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vrintn.f32 D0, D0' + + * float32x4_t vrndqn_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vrintn.f32 Q0, Q0' + +6.57.6.8 Round to integral (to nearest, ties away from zero) +............................................................ + + * float32x2_t vrnda_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vrinta.f32 D0, D0' + + * float32x4_t vrndqa_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vrinta.f32 Q0, Q0' + +6.57.6.9 Round to integral (towards +Inf) +......................................... + + * float32x2_t vrndp_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vrintp.f32 D0, D0' + + * float32x4_t vrndqp_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vrintp.f32 Q0, Q0' + +6.57.6.10 Round to integral (towards -Inf) +.......................................... + + * float32x2_t vrndm_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vrintm.f32 D0, D0' + + * float32x4_t vrndqm_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vrintm.f32 Q0, Q0' + +6.57.6.11 Round to integral (towards 0) +....................................... + + * float32x2_t vrnd_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vrintz.f32 D0, D0' + + * float32x4_t vrndq_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vrintz.f32 Q0, Q0' + +6.57.6.12 Subtraction +..................... + + * uint32x2_t vsub_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vsub.i32 D0, D0, D0' + + * uint16x4_t vsub_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vsub.i16 D0, D0, D0' + + * uint8x8_t vsub_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vsub.i8 D0, D0, D0' + + * int32x2_t vsub_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vsub.i32 D0, D0, D0' + + * int16x4_t vsub_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vsub.i16 D0, D0, D0' + + * int8x8_t vsub_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vsub.i8 D0, D0, D0' + + * float32x2_t vsub_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vsub.f32 D0, D0, D0' + + * uint64x1_t vsub_u64 (uint64x1_t, uint64x1_t) + + * int64x1_t vsub_s64 (int64x1_t, int64x1_t) + + * uint32x4_t vsubq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vsub.i32 Q0, Q0, Q0' + + * uint16x8_t vsubq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vsub.i16 Q0, Q0, Q0' + + * uint8x16_t vsubq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vsub.i8 Q0, Q0, Q0' + + * int32x4_t vsubq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vsub.i32 Q0, Q0, Q0' + + * int16x8_t vsubq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vsub.i16 Q0, Q0, Q0' + + * int8x16_t vsubq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vsub.i8 Q0, Q0, Q0' + + * uint64x2_t vsubq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vsub.i64 Q0, Q0, Q0' + + * int64x2_t vsubq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vsub.i64 Q0, Q0, Q0' + + * float32x4_t vsubq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vsub.f32 Q0, Q0, Q0' + + * uint64x2_t vsubl_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vsubl.u32 Q0, D0, D0' + + * uint32x4_t vsubl_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vsubl.u16 Q0, D0, D0' + + * uint16x8_t vsubl_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vsubl.u8 Q0, D0, D0' + + * int64x2_t vsubl_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vsubl.s32 Q0, D0, D0' + + * int32x4_t vsubl_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vsubl.s16 Q0, D0, D0' + + * int16x8_t vsubl_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vsubl.s8 Q0, D0, D0' + + * uint64x2_t vsubw_u32 (uint64x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vsubw.u32 Q0, Q0, D0' + + * uint32x4_t vsubw_u16 (uint32x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vsubw.u16 Q0, Q0, D0' + + * uint16x8_t vsubw_u8 (uint16x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vsubw.u8 Q0, Q0, D0' + + * int64x2_t vsubw_s32 (int64x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vsubw.s32 Q0, Q0, D0' + + * int32x4_t vsubw_s16 (int32x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vsubw.s16 Q0, Q0, D0' + + * int16x8_t vsubw_s8 (int16x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vsubw.s8 Q0, Q0, D0' + + * uint32x2_t vhsub_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vhsub.u32 D0, D0, D0' + + * uint16x4_t vhsub_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vhsub.u16 D0, D0, D0' + + * uint8x8_t vhsub_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vhsub.u8 D0, D0, D0' + + * int32x2_t vhsub_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vhsub.s32 D0, D0, D0' + + * int16x4_t vhsub_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vhsub.s16 D0, D0, D0' + + * int8x8_t vhsub_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vhsub.s8 D0, D0, D0' + + * uint32x4_t vhsubq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vhsub.u32 Q0, Q0, Q0' + + * uint16x8_t vhsubq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vhsub.u16 Q0, Q0, Q0' + + * uint8x16_t vhsubq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vhsub.u8 Q0, Q0, Q0' + + * int32x4_t vhsubq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vhsub.s32 Q0, Q0, Q0' + + * int16x8_t vhsubq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vhsub.s16 Q0, Q0, Q0' + + * int8x16_t vhsubq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vhsub.s8 Q0, Q0, Q0' + + * uint32x2_t vqsub_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vqsub.u32 D0, D0, D0' + + * uint16x4_t vqsub_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vqsub.u16 D0, D0, D0' + + * uint8x8_t vqsub_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vqsub.u8 D0, D0, D0' + + * int32x2_t vqsub_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqsub.s32 D0, D0, D0' + + * int16x4_t vqsub_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqsub.s16 D0, D0, D0' + + * int8x8_t vqsub_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vqsub.s8 D0, D0, D0' + + * uint64x1_t vqsub_u64 (uint64x1_t, uint64x1_t) + _Form of expected instruction(s):_ 'vqsub.u64 D0, D0, D0' + + * int64x1_t vqsub_s64 (int64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vqsub.s64 D0, D0, D0' + + * uint32x4_t vqsubq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vqsub.u32 Q0, Q0, Q0' + + * uint16x8_t vqsubq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vqsub.u16 Q0, Q0, Q0' + + * uint8x16_t vqsubq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vqsub.u8 Q0, Q0, Q0' + + * int32x4_t vqsubq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vqsub.s32 Q0, Q0, Q0' + + * int16x8_t vqsubq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vqsub.s16 Q0, Q0, Q0' + + * int8x16_t vqsubq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vqsub.s8 Q0, Q0, Q0' + + * uint64x2_t vqsubq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vqsub.u64 Q0, Q0, Q0' + + * int64x2_t vqsubq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vqsub.s64 Q0, Q0, Q0' + + * uint32x2_t vsubhn_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vsubhn.i64 D0, Q0, Q0' + + * uint16x4_t vsubhn_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vsubhn.i32 D0, Q0, Q0' + + * uint8x8_t vsubhn_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vsubhn.i16 D0, Q0, Q0' + + * int32x2_t vsubhn_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vsubhn.i64 D0, Q0, Q0' + + * int16x4_t vsubhn_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vsubhn.i32 D0, Q0, Q0' + + * int8x8_t vsubhn_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vsubhn.i16 D0, Q0, Q0' + + * uint32x2_t vrsubhn_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vrsubhn.i64 D0, Q0, Q0' + + * uint16x4_t vrsubhn_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vrsubhn.i32 D0, Q0, Q0' + + * uint8x8_t vrsubhn_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vrsubhn.i16 D0, Q0, Q0' + + * int32x2_t vrsubhn_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vrsubhn.i64 D0, Q0, Q0' + + * int16x4_t vrsubhn_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vrsubhn.i32 D0, Q0, Q0' + + * int8x8_t vrsubhn_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vrsubhn.i16 D0, Q0, Q0' + +6.57.6.13 Comparison (equal-to) +............................... + + * uint32x2_t vceq_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vceq.i32 D0, D0, D0' + + * uint16x4_t vceq_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vceq.i16 D0, D0, D0' + + * uint8x8_t vceq_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vceq.i8 D0, D0, D0' + + * uint32x2_t vceq_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vceq.i32 D0, D0, D0' + + * uint16x4_t vceq_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vceq.i16 D0, D0, D0' + + * uint8x8_t vceq_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vceq.i8 D0, D0, D0' + + * uint32x2_t vceq_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vceq.f32 D0, D0, D0' + + * uint8x8_t vceq_p8 (poly8x8_t, poly8x8_t) + _Form of expected instruction(s):_ 'vceq.i8 D0, D0, D0' + + * uint32x4_t vceqq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vceq.i32 Q0, Q0, Q0' + + * uint16x8_t vceqq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vceq.i16 Q0, Q0, Q0' + + * uint8x16_t vceqq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vceq.i8 Q0, Q0, Q0' + + * uint32x4_t vceqq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vceq.i32 Q0, Q0, Q0' + + * uint16x8_t vceqq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vceq.i16 Q0, Q0, Q0' + + * uint8x16_t vceqq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vceq.i8 Q0, Q0, Q0' + + * uint32x4_t vceqq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vceq.f32 Q0, Q0, Q0' + + * uint8x16_t vceqq_p8 (poly8x16_t, poly8x16_t) + _Form of expected instruction(s):_ 'vceq.i8 Q0, Q0, Q0' + +6.57.6.14 Comparison (greater-than-or-equal-to) +............................................... + + * uint32x2_t vcge_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vcge.s32 D0, D0, D0' + + * uint16x4_t vcge_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vcge.s16 D0, D0, D0' + + * uint8x8_t vcge_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vcge.s8 D0, D0, D0' + + * uint32x2_t vcge_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vcge.f32 D0, D0, D0' + + * uint32x2_t vcge_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vcge.u32 D0, D0, D0' + + * uint16x4_t vcge_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vcge.u16 D0, D0, D0' + + * uint8x8_t vcge_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vcge.u8 D0, D0, D0' + + * uint32x4_t vcgeq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vcge.s32 Q0, Q0, Q0' + + * uint16x8_t vcgeq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vcge.s16 Q0, Q0, Q0' + + * uint8x16_t vcgeq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vcge.s8 Q0, Q0, Q0' + + * uint32x4_t vcgeq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vcge.f32 Q0, Q0, Q0' + + * uint32x4_t vcgeq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vcge.u32 Q0, Q0, Q0' + + * uint16x8_t vcgeq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vcge.u16 Q0, Q0, Q0' + + * uint8x16_t vcgeq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vcge.u8 Q0, Q0, Q0' + +6.57.6.15 Comparison (less-than-or-equal-to) +............................................ + + * uint32x2_t vcle_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vcge.s32 D0, D0, D0' + + * uint16x4_t vcle_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vcge.s16 D0, D0, D0' + + * uint8x8_t vcle_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vcge.s8 D0, D0, D0' + + * uint32x2_t vcle_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vcge.f32 D0, D0, D0' + + * uint32x2_t vcle_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vcge.u32 D0, D0, D0' + + * uint16x4_t vcle_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vcge.u16 D0, D0, D0' + + * uint8x8_t vcle_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vcge.u8 D0, D0, D0' + + * uint32x4_t vcleq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vcge.s32 Q0, Q0, Q0' + + * uint16x8_t vcleq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vcge.s16 Q0, Q0, Q0' + + * uint8x16_t vcleq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vcge.s8 Q0, Q0, Q0' + + * uint32x4_t vcleq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vcge.f32 Q0, Q0, Q0' + + * uint32x4_t vcleq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vcge.u32 Q0, Q0, Q0' + + * uint16x8_t vcleq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vcge.u16 Q0, Q0, Q0' + + * uint8x16_t vcleq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vcge.u8 Q0, Q0, Q0' + +6.57.6.16 Comparison (greater-than) +................................... + + * uint32x2_t vcgt_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vcgt.s32 D0, D0, D0' + + * uint16x4_t vcgt_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vcgt.s16 D0, D0, D0' + + * uint8x8_t vcgt_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vcgt.s8 D0, D0, D0' + + * uint32x2_t vcgt_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vcgt.f32 D0, D0, D0' + + * uint32x2_t vcgt_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vcgt.u32 D0, D0, D0' + + * uint16x4_t vcgt_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vcgt.u16 D0, D0, D0' + + * uint8x8_t vcgt_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vcgt.u8 D0, D0, D0' + + * uint32x4_t vcgtq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vcgt.s32 Q0, Q0, Q0' + + * uint16x8_t vcgtq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vcgt.s16 Q0, Q0, Q0' + + * uint8x16_t vcgtq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vcgt.s8 Q0, Q0, Q0' + + * uint32x4_t vcgtq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vcgt.f32 Q0, Q0, Q0' + + * uint32x4_t vcgtq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vcgt.u32 Q0, Q0, Q0' + + * uint16x8_t vcgtq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vcgt.u16 Q0, Q0, Q0' + + * uint8x16_t vcgtq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vcgt.u8 Q0, Q0, Q0' + +6.57.6.17 Comparison (less-than) +................................ + + * uint32x2_t vclt_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vcgt.s32 D0, D0, D0' + + * uint16x4_t vclt_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vcgt.s16 D0, D0, D0' + + * uint8x8_t vclt_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vcgt.s8 D0, D0, D0' + + * uint32x2_t vclt_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vcgt.f32 D0, D0, D0' + + * uint32x2_t vclt_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vcgt.u32 D0, D0, D0' + + * uint16x4_t vclt_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vcgt.u16 D0, D0, D0' + + * uint8x8_t vclt_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vcgt.u8 D0, D0, D0' + + * uint32x4_t vcltq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vcgt.s32 Q0, Q0, Q0' + + * uint16x8_t vcltq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vcgt.s16 Q0, Q0, Q0' + + * uint8x16_t vcltq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vcgt.s8 Q0, Q0, Q0' + + * uint32x4_t vcltq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vcgt.f32 Q0, Q0, Q0' + + * uint32x4_t vcltq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vcgt.u32 Q0, Q0, Q0' + + * uint16x8_t vcltq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vcgt.u16 Q0, Q0, Q0' + + * uint8x16_t vcltq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vcgt.u8 Q0, Q0, Q0' + +6.57.6.18 Comparison (absolute greater-than-or-equal-to) +........................................................ + + * uint32x2_t vcage_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vacge.f32 D0, D0, D0' + + * uint32x4_t vcageq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vacge.f32 Q0, Q0, Q0' + +6.57.6.19 Comparison (absolute less-than-or-equal-to) +..................................................... + + * uint32x2_t vcale_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vacge.f32 D0, D0, D0' + + * uint32x4_t vcaleq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vacge.f32 Q0, Q0, Q0' + +6.57.6.20 Comparison (absolute greater-than) +............................................ + + * uint32x2_t vcagt_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vacgt.f32 D0, D0, D0' + + * uint32x4_t vcagtq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vacgt.f32 Q0, Q0, Q0' + +6.57.6.21 Comparison (absolute less-than) +......................................... + + * uint32x2_t vcalt_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vacgt.f32 D0, D0, D0' + + * uint32x4_t vcaltq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vacgt.f32 Q0, Q0, Q0' + +6.57.6.22 Test bits +................... + + * uint32x2_t vtst_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vtst.32 D0, D0, D0' + + * uint16x4_t vtst_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vtst.16 D0, D0, D0' + + * uint8x8_t vtst_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtst.8 D0, D0, D0' + + * uint32x2_t vtst_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vtst.32 D0, D0, D0' + + * uint16x4_t vtst_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vtst.16 D0, D0, D0' + + * uint8x8_t vtst_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vtst.8 D0, D0, D0' + + * uint8x8_t vtst_p8 (poly8x8_t, poly8x8_t) + _Form of expected instruction(s):_ 'vtst.8 D0, D0, D0' + + * uint32x4_t vtstq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vtst.32 Q0, Q0, Q0' + + * uint16x8_t vtstq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vtst.16 Q0, Q0, Q0' + + * uint8x16_t vtstq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vtst.8 Q0, Q0, Q0' + + * uint32x4_t vtstq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vtst.32 Q0, Q0, Q0' + + * uint16x8_t vtstq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vtst.16 Q0, Q0, Q0' + + * uint8x16_t vtstq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vtst.8 Q0, Q0, Q0' + + * uint8x16_t vtstq_p8 (poly8x16_t, poly8x16_t) + _Form of expected instruction(s):_ 'vtst.8 Q0, Q0, Q0' + +6.57.6.23 Absolute difference +............................. + + * uint32x2_t vabd_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vabd.u32 D0, D0, D0' + + * uint16x4_t vabd_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vabd.u16 D0, D0, D0' + + * uint8x8_t vabd_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vabd.u8 D0, D0, D0' + + * int32x2_t vabd_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vabd.s32 D0, D0, D0' + + * int16x4_t vabd_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vabd.s16 D0, D0, D0' + + * int8x8_t vabd_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vabd.s8 D0, D0, D0' + + * float32x2_t vabd_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vabd.f32 D0, D0, D0' + + * uint32x4_t vabdq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vabd.u32 Q0, Q0, Q0' + + * uint16x8_t vabdq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vabd.u16 Q0, Q0, Q0' + + * uint8x16_t vabdq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vabd.u8 Q0, Q0, Q0' + + * int32x4_t vabdq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vabd.s32 Q0, Q0, Q0' + + * int16x8_t vabdq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vabd.s16 Q0, Q0, Q0' + + * int8x16_t vabdq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vabd.s8 Q0, Q0, Q0' + + * float32x4_t vabdq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vabd.f32 Q0, Q0, Q0' + + * uint64x2_t vabdl_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vabdl.u32 Q0, D0, D0' + + * uint32x4_t vabdl_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vabdl.u16 Q0, D0, D0' + + * uint16x8_t vabdl_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vabdl.u8 Q0, D0, D0' + + * int64x2_t vabdl_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vabdl.s32 Q0, D0, D0' + + * int32x4_t vabdl_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vabdl.s16 Q0, D0, D0' + + * int16x8_t vabdl_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vabdl.s8 Q0, D0, D0' + +6.57.6.24 Absolute difference and accumulate +............................................ + + * uint32x2_t vaba_u32 (uint32x2_t, uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vaba.u32 D0, D0, D0' + + * uint16x4_t vaba_u16 (uint16x4_t, uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vaba.u16 D0, D0, D0' + + * uint8x8_t vaba_u8 (uint8x8_t, uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vaba.u8 D0, D0, D0' + + * int32x2_t vaba_s32 (int32x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vaba.s32 D0, D0, D0' + + * int16x4_t vaba_s16 (int16x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vaba.s16 D0, D0, D0' + + * int8x8_t vaba_s8 (int8x8_t, int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vaba.s8 D0, D0, D0' + + * uint32x4_t vabaq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vaba.u32 Q0, Q0, Q0' + + * uint16x8_t vabaq_u16 (uint16x8_t, uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vaba.u16 Q0, Q0, Q0' + + * uint8x16_t vabaq_u8 (uint8x16_t, uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vaba.u8 Q0, Q0, Q0' + + * int32x4_t vabaq_s32 (int32x4_t, int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vaba.s32 Q0, Q0, Q0' + + * int16x8_t vabaq_s16 (int16x8_t, int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vaba.s16 Q0, Q0, Q0' + + * int8x16_t vabaq_s8 (int8x16_t, int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vaba.s8 Q0, Q0, Q0' + + * uint64x2_t vabal_u32 (uint64x2_t, uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vabal.u32 Q0, D0, D0' + + * uint32x4_t vabal_u16 (uint32x4_t, uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vabal.u16 Q0, D0, D0' + + * uint16x8_t vabal_u8 (uint16x8_t, uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vabal.u8 Q0, D0, D0' + + * int64x2_t vabal_s32 (int64x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vabal.s32 Q0, D0, D0' + + * int32x4_t vabal_s16 (int32x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vabal.s16 Q0, D0, D0' + + * int16x8_t vabal_s8 (int16x8_t, int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vabal.s8 Q0, D0, D0' + +6.57.6.25 Maximum +................. + + * uint32x2_t vmax_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vmax.u32 D0, D0, D0' + + * uint16x4_t vmax_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vmax.u16 D0, D0, D0' + + * uint8x8_t vmax_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vmax.u8 D0, D0, D0' + + * int32x2_t vmax_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vmax.s32 D0, D0, D0' + + * int16x4_t vmax_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vmax.s16 D0, D0, D0' + + * int8x8_t vmax_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vmax.s8 D0, D0, D0' + + * float32x2_t vmax_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vmax.f32 D0, D0, D0' + + * uint32x4_t vmaxq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vmax.u32 Q0, Q0, Q0' + + * uint16x8_t vmaxq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vmax.u16 Q0, Q0, Q0' + + * uint8x16_t vmaxq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vmax.u8 Q0, Q0, Q0' + + * int32x4_t vmaxq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vmax.s32 Q0, Q0, Q0' + + * int16x8_t vmaxq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vmax.s16 Q0, Q0, Q0' + + * int8x16_t vmaxq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vmax.s8 Q0, Q0, Q0' + + * float32x4_t vmaxq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vmax.f32 Q0, Q0, Q0' + +6.57.6.26 Minimum +................. + + * uint32x2_t vmin_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vmin.u32 D0, D0, D0' + + * uint16x4_t vmin_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vmin.u16 D0, D0, D0' + + * uint8x8_t vmin_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vmin.u8 D0, D0, D0' + + * int32x2_t vmin_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vmin.s32 D0, D0, D0' + + * int16x4_t vmin_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vmin.s16 D0, D0, D0' + + * int8x8_t vmin_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vmin.s8 D0, D0, D0' + + * float32x2_t vmin_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vmin.f32 D0, D0, D0' + + * uint32x4_t vminq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vmin.u32 Q0, Q0, Q0' + + * uint16x8_t vminq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vmin.u16 Q0, Q0, Q0' + + * uint8x16_t vminq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vmin.u8 Q0, Q0, Q0' + + * int32x4_t vminq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vmin.s32 Q0, Q0, Q0' + + * int16x8_t vminq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vmin.s16 Q0, Q0, Q0' + + * int8x16_t vminq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vmin.s8 Q0, Q0, Q0' + + * float32x4_t vminq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vmin.f32 Q0, Q0, Q0' + +6.57.6.27 Pairwise add +...................... + + * uint32x2_t vpadd_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vpadd.i32 D0, D0, D0' + + * uint16x4_t vpadd_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vpadd.i16 D0, D0, D0' + + * uint8x8_t vpadd_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vpadd.i8 D0, D0, D0' + + * int32x2_t vpadd_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vpadd.i32 D0, D0, D0' + + * int16x4_t vpadd_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vpadd.i16 D0, D0, D0' + + * int8x8_t vpadd_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vpadd.i8 D0, D0, D0' + + * float32x2_t vpadd_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vpadd.f32 D0, D0, D0' + + * uint64x1_t vpaddl_u32 (uint32x2_t) + _Form of expected instruction(s):_ 'vpaddl.u32 D0, D0' + + * uint32x2_t vpaddl_u16 (uint16x4_t) + _Form of expected instruction(s):_ 'vpaddl.u16 D0, D0' + + * uint16x4_t vpaddl_u8 (uint8x8_t) + _Form of expected instruction(s):_ 'vpaddl.u8 D0, D0' + + * int64x1_t vpaddl_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vpaddl.s32 D0, D0' + + * int32x2_t vpaddl_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vpaddl.s16 D0, D0' + + * int16x4_t vpaddl_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vpaddl.s8 D0, D0' + + * uint64x2_t vpaddlq_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vpaddl.u32 Q0, Q0' + + * uint32x4_t vpaddlq_u16 (uint16x8_t) + _Form of expected instruction(s):_ 'vpaddl.u16 Q0, Q0' + + * uint16x8_t vpaddlq_u8 (uint8x16_t) + _Form of expected instruction(s):_ 'vpaddl.u8 Q0, Q0' + + * int64x2_t vpaddlq_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vpaddl.s32 Q0, Q0' + + * int32x4_t vpaddlq_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vpaddl.s16 Q0, Q0' + + * int16x8_t vpaddlq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vpaddl.s8 Q0, Q0' + +6.57.6.28 Pairwise add, single_opcode widen and accumulate +.......................................................... + + * uint64x1_t vpadal_u32 (uint64x1_t, uint32x2_t) + _Form of expected instruction(s):_ 'vpadal.u32 D0, D0' + + * uint32x2_t vpadal_u16 (uint32x2_t, uint16x4_t) + _Form of expected instruction(s):_ 'vpadal.u16 D0, D0' + + * uint16x4_t vpadal_u8 (uint16x4_t, uint8x8_t) + _Form of expected instruction(s):_ 'vpadal.u8 D0, D0' + + * int64x1_t vpadal_s32 (int64x1_t, int32x2_t) + _Form of expected instruction(s):_ 'vpadal.s32 D0, D0' + + * int32x2_t vpadal_s16 (int32x2_t, int16x4_t) + _Form of expected instruction(s):_ 'vpadal.s16 D0, D0' + + * int16x4_t vpadal_s8 (int16x4_t, int8x8_t) + _Form of expected instruction(s):_ 'vpadal.s8 D0, D0' + + * uint64x2_t vpadalq_u32 (uint64x2_t, uint32x4_t) + _Form of expected instruction(s):_ 'vpadal.u32 Q0, Q0' + + * uint32x4_t vpadalq_u16 (uint32x4_t, uint16x8_t) + _Form of expected instruction(s):_ 'vpadal.u16 Q0, Q0' + + * uint16x8_t vpadalq_u8 (uint16x8_t, uint8x16_t) + _Form of expected instruction(s):_ 'vpadal.u8 Q0, Q0' + + * int64x2_t vpadalq_s32 (int64x2_t, int32x4_t) + _Form of expected instruction(s):_ 'vpadal.s32 Q0, Q0' + + * int32x4_t vpadalq_s16 (int32x4_t, int16x8_t) + _Form of expected instruction(s):_ 'vpadal.s16 Q0, Q0' + + * int16x8_t vpadalq_s8 (int16x8_t, int8x16_t) + _Form of expected instruction(s):_ 'vpadal.s8 Q0, Q0' + +6.57.6.29 Folding maximum +......................... + + * uint32x2_t vpmax_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vpmax.u32 D0, D0, D0' + + * uint16x4_t vpmax_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vpmax.u16 D0, D0, D0' + + * uint8x8_t vpmax_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vpmax.u8 D0, D0, D0' + + * int32x2_t vpmax_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vpmax.s32 D0, D0, D0' + + * int16x4_t vpmax_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vpmax.s16 D0, D0, D0' + + * int8x8_t vpmax_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vpmax.s8 D0, D0, D0' + + * float32x2_t vpmax_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vpmax.f32 D0, D0, D0' + +6.57.6.30 Folding minimum +......................... + + * uint32x2_t vpmin_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vpmin.u32 D0, D0, D0' + + * uint16x4_t vpmin_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vpmin.u16 D0, D0, D0' + + * uint8x8_t vpmin_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vpmin.u8 D0, D0, D0' + + * int32x2_t vpmin_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vpmin.s32 D0, D0, D0' + + * int16x4_t vpmin_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vpmin.s16 D0, D0, D0' + + * int8x8_t vpmin_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vpmin.s8 D0, D0, D0' + + * float32x2_t vpmin_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vpmin.f32 D0, D0, D0' + +6.57.6.31 Reciprocal step +......................... + + * float32x2_t vrecps_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vrecps.f32 D0, D0, D0' + + * float32x4_t vrecpsq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vrecps.f32 Q0, Q0, Q0' + + * float32x2_t vrsqrts_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vrsqrts.f32 D0, D0, D0' + + * float32x4_t vrsqrtsq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vrsqrts.f32 Q0, Q0, Q0' + +6.57.6.32 Vector shift left +........................... + + * uint32x2_t vshl_u32 (uint32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vshl.u32 D0, D0, D0' + + * uint16x4_t vshl_u16 (uint16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vshl.u16 D0, D0, D0' + + * uint8x8_t vshl_u8 (uint8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vshl.u8 D0, D0, D0' + + * int32x2_t vshl_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vshl.s32 D0, D0, D0' + + * int16x4_t vshl_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vshl.s16 D0, D0, D0' + + * int8x8_t vshl_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vshl.s8 D0, D0, D0' + + * uint64x1_t vshl_u64 (uint64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vshl.u64 D0, D0, D0' + + * int64x1_t vshl_s64 (int64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vshl.s64 D0, D0, D0' + + * uint32x4_t vshlq_u32 (uint32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vshl.u32 Q0, Q0, Q0' + + * uint16x8_t vshlq_u16 (uint16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vshl.u16 Q0, Q0, Q0' + + * uint8x16_t vshlq_u8 (uint8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vshl.u8 Q0, Q0, Q0' + + * int32x4_t vshlq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vshl.s32 Q0, Q0, Q0' + + * int16x8_t vshlq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vshl.s16 Q0, Q0, Q0' + + * int8x16_t vshlq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vshl.s8 Q0, Q0, Q0' + + * uint64x2_t vshlq_u64 (uint64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vshl.u64 Q0, Q0, Q0' + + * int64x2_t vshlq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vshl.s64 Q0, Q0, Q0' + + * uint32x2_t vrshl_u32 (uint32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vrshl.u32 D0, D0, D0' + + * uint16x4_t vrshl_u16 (uint16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vrshl.u16 D0, D0, D0' + + * uint8x8_t vrshl_u8 (uint8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vrshl.u8 D0, D0, D0' + + * int32x2_t vrshl_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vrshl.s32 D0, D0, D0' + + * int16x4_t vrshl_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vrshl.s16 D0, D0, D0' + + * int8x8_t vrshl_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vrshl.s8 D0, D0, D0' + + * uint64x1_t vrshl_u64 (uint64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vrshl.u64 D0, D0, D0' + + * int64x1_t vrshl_s64 (int64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vrshl.s64 D0, D0, D0' + + * uint32x4_t vrshlq_u32 (uint32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vrshl.u32 Q0, Q0, Q0' + + * uint16x8_t vrshlq_u16 (uint16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vrshl.u16 Q0, Q0, Q0' + + * uint8x16_t vrshlq_u8 (uint8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vrshl.u8 Q0, Q0, Q0' + + * int32x4_t vrshlq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vrshl.s32 Q0, Q0, Q0' + + * int16x8_t vrshlq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vrshl.s16 Q0, Q0, Q0' + + * int8x16_t vrshlq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vrshl.s8 Q0, Q0, Q0' + + * uint64x2_t vrshlq_u64 (uint64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vrshl.u64 Q0, Q0, Q0' + + * int64x2_t vrshlq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vrshl.s64 Q0, Q0, Q0' + + * uint32x2_t vqshl_u32 (uint32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqshl.u32 D0, D0, D0' + + * uint16x4_t vqshl_u16 (uint16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqshl.u16 D0, D0, D0' + + * uint8x8_t vqshl_u8 (uint8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vqshl.u8 D0, D0, D0' + + * int32x2_t vqshl_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqshl.s32 D0, D0, D0' + + * int16x4_t vqshl_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqshl.s16 D0, D0, D0' + + * int8x8_t vqshl_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vqshl.s8 D0, D0, D0' + + * uint64x1_t vqshl_u64 (uint64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vqshl.u64 D0, D0, D0' + + * int64x1_t vqshl_s64 (int64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vqshl.s64 D0, D0, D0' + + * uint32x4_t vqshlq_u32 (uint32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vqshl.u32 Q0, Q0, Q0' + + * uint16x8_t vqshlq_u16 (uint16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vqshl.u16 Q0, Q0, Q0' + + * uint8x16_t vqshlq_u8 (uint8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vqshl.u8 Q0, Q0, Q0' + + * int32x4_t vqshlq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vqshl.s32 Q0, Q0, Q0' + + * int16x8_t vqshlq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vqshl.s16 Q0, Q0, Q0' + + * int8x16_t vqshlq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vqshl.s8 Q0, Q0, Q0' + + * uint64x2_t vqshlq_u64 (uint64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vqshl.u64 Q0, Q0, Q0' + + * int64x2_t vqshlq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vqshl.s64 Q0, Q0, Q0' + + * uint32x2_t vqrshl_u32 (uint32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqrshl.u32 D0, D0, D0' + + * uint16x4_t vqrshl_u16 (uint16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqrshl.u16 D0, D0, D0' + + * uint8x8_t vqrshl_u8 (uint8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vqrshl.u8 D0, D0, D0' + + * int32x2_t vqrshl_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vqrshl.s32 D0, D0, D0' + + * int16x4_t vqrshl_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vqrshl.s16 D0, D0, D0' + + * int8x8_t vqrshl_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vqrshl.s8 D0, D0, D0' + + * uint64x1_t vqrshl_u64 (uint64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vqrshl.u64 D0, D0, D0' + + * int64x1_t vqrshl_s64 (int64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vqrshl.s64 D0, D0, D0' + + * uint32x4_t vqrshlq_u32 (uint32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vqrshl.u32 Q0, Q0, Q0' + + * uint16x8_t vqrshlq_u16 (uint16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vqrshl.u16 Q0, Q0, Q0' + + * uint8x16_t vqrshlq_u8 (uint8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vqrshl.u8 Q0, Q0, Q0' + + * int32x4_t vqrshlq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vqrshl.s32 Q0, Q0, Q0' + + * int16x8_t vqrshlq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vqrshl.s16 Q0, Q0, Q0' + + * int8x16_t vqrshlq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vqrshl.s8 Q0, Q0, Q0' + + * uint64x2_t vqrshlq_u64 (uint64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vqrshl.u64 Q0, Q0, Q0' + + * int64x2_t vqrshlq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vqrshl.s64 Q0, Q0, Q0' + +6.57.6.33 Vector shift left by constant +....................................... + + * uint32x2_t vshl_n_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vshl.i32 D0, D0, #0' + + * uint16x4_t vshl_n_u16 (uint16x4_t, const int) + _Form of expected instruction(s):_ 'vshl.i16 D0, D0, #0' + + * uint8x8_t vshl_n_u8 (uint8x8_t, const int) + _Form of expected instruction(s):_ 'vshl.i8 D0, D0, #0' + + * int32x2_t vshl_n_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vshl.i32 D0, D0, #0' + + * int16x4_t vshl_n_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vshl.i16 D0, D0, #0' + + * int8x8_t vshl_n_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vshl.i8 D0, D0, #0' + + * uint64x1_t vshl_n_u64 (uint64x1_t, const int) + _Form of expected instruction(s):_ 'vshl.i64 D0, D0, #0' + + * int64x1_t vshl_n_s64 (int64x1_t, const int) + _Form of expected instruction(s):_ 'vshl.i64 D0, D0, #0' + + * uint32x4_t vshlq_n_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vshl.i32 Q0, Q0, #0' + + * uint16x8_t vshlq_n_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vshl.i16 Q0, Q0, #0' + + * uint8x16_t vshlq_n_u8 (uint8x16_t, const int) + _Form of expected instruction(s):_ 'vshl.i8 Q0, Q0, #0' + + * int32x4_t vshlq_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vshl.i32 Q0, Q0, #0' + + * int16x8_t vshlq_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vshl.i16 Q0, Q0, #0' + + * int8x16_t vshlq_n_s8 (int8x16_t, const int) + _Form of expected instruction(s):_ 'vshl.i8 Q0, Q0, #0' + + * uint64x2_t vshlq_n_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vshl.i64 Q0, Q0, #0' + + * int64x2_t vshlq_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vshl.i64 Q0, Q0, #0' + + * uint32x2_t vqshl_n_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vqshl.u32 D0, D0, #0' + + * uint16x4_t vqshl_n_u16 (uint16x4_t, const int) + _Form of expected instruction(s):_ 'vqshl.u16 D0, D0, #0' + + * uint8x8_t vqshl_n_u8 (uint8x8_t, const int) + _Form of expected instruction(s):_ 'vqshl.u8 D0, D0, #0' + + * int32x2_t vqshl_n_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vqshl.s32 D0, D0, #0' + + * int16x4_t vqshl_n_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vqshl.s16 D0, D0, #0' + + * int8x8_t vqshl_n_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vqshl.s8 D0, D0, #0' + + * uint64x1_t vqshl_n_u64 (uint64x1_t, const int) + _Form of expected instruction(s):_ 'vqshl.u64 D0, D0, #0' + + * int64x1_t vqshl_n_s64 (int64x1_t, const int) + _Form of expected instruction(s):_ 'vqshl.s64 D0, D0, #0' + + * uint32x4_t vqshlq_n_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vqshl.u32 Q0, Q0, #0' + + * uint16x8_t vqshlq_n_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vqshl.u16 Q0, Q0, #0' + + * uint8x16_t vqshlq_n_u8 (uint8x16_t, const int) + _Form of expected instruction(s):_ 'vqshl.u8 Q0, Q0, #0' + + * int32x4_t vqshlq_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vqshl.s32 Q0, Q0, #0' + + * int16x8_t vqshlq_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vqshl.s16 Q0, Q0, #0' + + * int8x16_t vqshlq_n_s8 (int8x16_t, const int) + _Form of expected instruction(s):_ 'vqshl.s8 Q0, Q0, #0' + + * uint64x2_t vqshlq_n_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vqshl.u64 Q0, Q0, #0' + + * int64x2_t vqshlq_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vqshl.s64 Q0, Q0, #0' + + * uint64x1_t vqshlu_n_s64 (int64x1_t, const int) + _Form of expected instruction(s):_ 'vqshlu.s64 D0, D0, #0' + + * uint32x2_t vqshlu_n_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vqshlu.s32 D0, D0, #0' + + * uint16x4_t vqshlu_n_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vqshlu.s16 D0, D0, #0' + + * uint8x8_t vqshlu_n_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vqshlu.s8 D0, D0, #0' + + * uint64x2_t vqshluq_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vqshlu.s64 Q0, Q0, #0' + + * uint32x4_t vqshluq_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vqshlu.s32 Q0, Q0, #0' + + * uint16x8_t vqshluq_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vqshlu.s16 Q0, Q0, #0' + + * uint8x16_t vqshluq_n_s8 (int8x16_t, const int) + _Form of expected instruction(s):_ 'vqshlu.s8 Q0, Q0, #0' + + * uint64x2_t vshll_n_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vshll.u32 Q0, D0, #0' + + * uint32x4_t vshll_n_u16 (uint16x4_t, const int) + _Form of expected instruction(s):_ 'vshll.u16 Q0, D0, #0' + + * uint16x8_t vshll_n_u8 (uint8x8_t, const int) + _Form of expected instruction(s):_ 'vshll.u8 Q0, D0, #0' + + * int64x2_t vshll_n_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vshll.s32 Q0, D0, #0' + + * int32x4_t vshll_n_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vshll.s16 Q0, D0, #0' + + * int16x8_t vshll_n_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vshll.s8 Q0, D0, #0' + +6.57.6.34 Vector shift right by constant +........................................ + + * uint32x2_t vshr_n_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vshr.u32 D0, D0, #0' + + * uint16x4_t vshr_n_u16 (uint16x4_t, const int) + _Form of expected instruction(s):_ 'vshr.u16 D0, D0, #0' + + * uint8x8_t vshr_n_u8 (uint8x8_t, const int) + _Form of expected instruction(s):_ 'vshr.u8 D0, D0, #0' + + * int32x2_t vshr_n_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vshr.s32 D0, D0, #0' + + * int16x4_t vshr_n_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vshr.s16 D0, D0, #0' + + * int8x8_t vshr_n_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vshr.s8 D0, D0, #0' + + * uint64x1_t vshr_n_u64 (uint64x1_t, const int) + _Form of expected instruction(s):_ 'vshr.u64 D0, D0, #0' + + * int64x1_t vshr_n_s64 (int64x1_t, const int) + _Form of expected instruction(s):_ 'vshr.s64 D0, D0, #0' + + * uint32x4_t vshrq_n_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vshr.u32 Q0, Q0, #0' + + * uint16x8_t vshrq_n_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vshr.u16 Q0, Q0, #0' + + * uint8x16_t vshrq_n_u8 (uint8x16_t, const int) + _Form of expected instruction(s):_ 'vshr.u8 Q0, Q0, #0' + + * int32x4_t vshrq_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vshr.s32 Q0, Q0, #0' + + * int16x8_t vshrq_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vshr.s16 Q0, Q0, #0' + + * int8x16_t vshrq_n_s8 (int8x16_t, const int) + _Form of expected instruction(s):_ 'vshr.s8 Q0, Q0, #0' + + * uint64x2_t vshrq_n_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vshr.u64 Q0, Q0, #0' + + * int64x2_t vshrq_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vshr.s64 Q0, Q0, #0' + + * uint32x2_t vrshr_n_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vrshr.u32 D0, D0, #0' + + * uint16x4_t vrshr_n_u16 (uint16x4_t, const int) + _Form of expected instruction(s):_ 'vrshr.u16 D0, D0, #0' + + * uint8x8_t vrshr_n_u8 (uint8x8_t, const int) + _Form of expected instruction(s):_ 'vrshr.u8 D0, D0, #0' + + * int32x2_t vrshr_n_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vrshr.s32 D0, D0, #0' + + * int16x4_t vrshr_n_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vrshr.s16 D0, D0, #0' + + * int8x8_t vrshr_n_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vrshr.s8 D0, D0, #0' + + * uint64x1_t vrshr_n_u64 (uint64x1_t, const int) + _Form of expected instruction(s):_ 'vrshr.u64 D0, D0, #0' + + * int64x1_t vrshr_n_s64 (int64x1_t, const int) + _Form of expected instruction(s):_ 'vrshr.s64 D0, D0, #0' + + * uint32x4_t vrshrq_n_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vrshr.u32 Q0, Q0, #0' + + * uint16x8_t vrshrq_n_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vrshr.u16 Q0, Q0, #0' + + * uint8x16_t vrshrq_n_u8 (uint8x16_t, const int) + _Form of expected instruction(s):_ 'vrshr.u8 Q0, Q0, #0' + + * int32x4_t vrshrq_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vrshr.s32 Q0, Q0, #0' + + * int16x8_t vrshrq_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vrshr.s16 Q0, Q0, #0' + + * int8x16_t vrshrq_n_s8 (int8x16_t, const int) + _Form of expected instruction(s):_ 'vrshr.s8 Q0, Q0, #0' + + * uint64x2_t vrshrq_n_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vrshr.u64 Q0, Q0, #0' + + * int64x2_t vrshrq_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vrshr.s64 Q0, Q0, #0' + + * uint32x2_t vshrn_n_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vshrn.i64 D0, Q0, #0' + + * uint16x4_t vshrn_n_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vshrn.i32 D0, Q0, #0' + + * uint8x8_t vshrn_n_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vshrn.i16 D0, Q0, #0' + + * int32x2_t vshrn_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vshrn.i64 D0, Q0, #0' + + * int16x4_t vshrn_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vshrn.i32 D0, Q0, #0' + + * int8x8_t vshrn_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vshrn.i16 D0, Q0, #0' + + * uint32x2_t vrshrn_n_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vrshrn.i64 D0, Q0, #0' + + * uint16x4_t vrshrn_n_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vrshrn.i32 D0, Q0, #0' + + * uint8x8_t vrshrn_n_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vrshrn.i16 D0, Q0, #0' + + * int32x2_t vrshrn_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vrshrn.i64 D0, Q0, #0' + + * int16x4_t vrshrn_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vrshrn.i32 D0, Q0, #0' + + * int8x8_t vrshrn_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vrshrn.i16 D0, Q0, #0' + + * uint32x2_t vqshrn_n_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vqshrn.u64 D0, Q0, #0' + + * uint16x4_t vqshrn_n_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vqshrn.u32 D0, Q0, #0' + + * uint8x8_t vqshrn_n_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vqshrn.u16 D0, Q0, #0' + + * int32x2_t vqshrn_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vqshrn.s64 D0, Q0, #0' + + * int16x4_t vqshrn_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vqshrn.s32 D0, Q0, #0' + + * int8x8_t vqshrn_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vqshrn.s16 D0, Q0, #0' + + * uint32x2_t vqrshrn_n_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vqrshrn.u64 D0, Q0, #0' + + * uint16x4_t vqrshrn_n_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vqrshrn.u32 D0, Q0, #0' + + * uint8x8_t vqrshrn_n_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vqrshrn.u16 D0, Q0, #0' + + * int32x2_t vqrshrn_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vqrshrn.s64 D0, Q0, #0' + + * int16x4_t vqrshrn_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vqrshrn.s32 D0, Q0, #0' + + * int8x8_t vqrshrn_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vqrshrn.s16 D0, Q0, #0' + + * uint32x2_t vqshrun_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vqshrun.s64 D0, Q0, #0' + + * uint16x4_t vqshrun_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vqshrun.s32 D0, Q0, #0' + + * uint8x8_t vqshrun_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vqshrun.s16 D0, Q0, #0' + + * uint32x2_t vqrshrun_n_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vqrshrun.s64 D0, Q0, #0' + + * uint16x4_t vqrshrun_n_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vqrshrun.s32 D0, Q0, #0' + + * uint8x8_t vqrshrun_n_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vqrshrun.s16 D0, Q0, #0' + +6.57.6.35 Vector shift right by constant and accumulate +....................................................... + + * uint32x2_t vsra_n_u32 (uint32x2_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vsra.u32 D0, D0, #0' + + * uint16x4_t vsra_n_u16 (uint16x4_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vsra.u16 D0, D0, #0' + + * uint8x8_t vsra_n_u8 (uint8x8_t, uint8x8_t, const int) + _Form of expected instruction(s):_ 'vsra.u8 D0, D0, #0' + + * int32x2_t vsra_n_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vsra.s32 D0, D0, #0' + + * int16x4_t vsra_n_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vsra.s16 D0, D0, #0' + + * int8x8_t vsra_n_s8 (int8x8_t, int8x8_t, const int) + _Form of expected instruction(s):_ 'vsra.s8 D0, D0, #0' + + * uint64x1_t vsra_n_u64 (uint64x1_t, uint64x1_t, const int) + _Form of expected instruction(s):_ 'vsra.u64 D0, D0, #0' + + * int64x1_t vsra_n_s64 (int64x1_t, int64x1_t, const int) + _Form of expected instruction(s):_ 'vsra.s64 D0, D0, #0' + + * uint32x4_t vsraq_n_u32 (uint32x4_t, uint32x4_t, const int) + _Form of expected instruction(s):_ 'vsra.u32 Q0, Q0, #0' + + * uint16x8_t vsraq_n_u16 (uint16x8_t, uint16x8_t, const int) + _Form of expected instruction(s):_ 'vsra.u16 Q0, Q0, #0' + + * uint8x16_t vsraq_n_u8 (uint8x16_t, uint8x16_t, const int) + _Form of expected instruction(s):_ 'vsra.u8 Q0, Q0, #0' + + * int32x4_t vsraq_n_s32 (int32x4_t, int32x4_t, const int) + _Form of expected instruction(s):_ 'vsra.s32 Q0, Q0, #0' + + * int16x8_t vsraq_n_s16 (int16x8_t, int16x8_t, const int) + _Form of expected instruction(s):_ 'vsra.s16 Q0, Q0, #0' + + * int8x16_t vsraq_n_s8 (int8x16_t, int8x16_t, const int) + _Form of expected instruction(s):_ 'vsra.s8 Q0, Q0, #0' + + * uint64x2_t vsraq_n_u64 (uint64x2_t, uint64x2_t, const int) + _Form of expected instruction(s):_ 'vsra.u64 Q0, Q0, #0' + + * int64x2_t vsraq_n_s64 (int64x2_t, int64x2_t, const int) + _Form of expected instruction(s):_ 'vsra.s64 Q0, Q0, #0' + + * uint32x2_t vrsra_n_u32 (uint32x2_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vrsra.u32 D0, D0, #0' + + * uint16x4_t vrsra_n_u16 (uint16x4_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vrsra.u16 D0, D0, #0' + + * uint8x8_t vrsra_n_u8 (uint8x8_t, uint8x8_t, const int) + _Form of expected instruction(s):_ 'vrsra.u8 D0, D0, #0' + + * int32x2_t vrsra_n_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vrsra.s32 D0, D0, #0' + + * int16x4_t vrsra_n_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vrsra.s16 D0, D0, #0' + + * int8x8_t vrsra_n_s8 (int8x8_t, int8x8_t, const int) + _Form of expected instruction(s):_ 'vrsra.s8 D0, D0, #0' + + * uint64x1_t vrsra_n_u64 (uint64x1_t, uint64x1_t, const int) + _Form of expected instruction(s):_ 'vrsra.u64 D0, D0, #0' + + * int64x1_t vrsra_n_s64 (int64x1_t, int64x1_t, const int) + _Form of expected instruction(s):_ 'vrsra.s64 D0, D0, #0' + + * uint32x4_t vrsraq_n_u32 (uint32x4_t, uint32x4_t, const int) + _Form of expected instruction(s):_ 'vrsra.u32 Q0, Q0, #0' + + * uint16x8_t vrsraq_n_u16 (uint16x8_t, uint16x8_t, const int) + _Form of expected instruction(s):_ 'vrsra.u16 Q0, Q0, #0' + + * uint8x16_t vrsraq_n_u8 (uint8x16_t, uint8x16_t, const int) + _Form of expected instruction(s):_ 'vrsra.u8 Q0, Q0, #0' + + * int32x4_t vrsraq_n_s32 (int32x4_t, int32x4_t, const int) + _Form of expected instruction(s):_ 'vrsra.s32 Q0, Q0, #0' + + * int16x8_t vrsraq_n_s16 (int16x8_t, int16x8_t, const int) + _Form of expected instruction(s):_ 'vrsra.s16 Q0, Q0, #0' + + * int8x16_t vrsraq_n_s8 (int8x16_t, int8x16_t, const int) + _Form of expected instruction(s):_ 'vrsra.s8 Q0, Q0, #0' + + * uint64x2_t vrsraq_n_u64 (uint64x2_t, uint64x2_t, const int) + _Form of expected instruction(s):_ 'vrsra.u64 Q0, Q0, #0' + + * int64x2_t vrsraq_n_s64 (int64x2_t, int64x2_t, const int) + _Form of expected instruction(s):_ 'vrsra.s64 Q0, Q0, #0' + +6.57.6.36 Vector shift right and insert +....................................... + + * poly64x1_t vsri_n_p64 (poly64x1_t, poly64x1_t, const int) + _Form of expected instruction(s):_ 'vsri.64 D0, D0, #0' + + * uint32x2_t vsri_n_u32 (uint32x2_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vsri.32 D0, D0, #0' + + * uint16x4_t vsri_n_u16 (uint16x4_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vsri.16 D0, D0, #0' + + * uint8x8_t vsri_n_u8 (uint8x8_t, uint8x8_t, const int) + _Form of expected instruction(s):_ 'vsri.8 D0, D0, #0' + + * int32x2_t vsri_n_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vsri.32 D0, D0, #0' + + * int16x4_t vsri_n_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vsri.16 D0, D0, #0' + + * int8x8_t vsri_n_s8 (int8x8_t, int8x8_t, const int) + _Form of expected instruction(s):_ 'vsri.8 D0, D0, #0' + + * uint64x1_t vsri_n_u64 (uint64x1_t, uint64x1_t, const int) + _Form of expected instruction(s):_ 'vsri.64 D0, D0, #0' + + * int64x1_t vsri_n_s64 (int64x1_t, int64x1_t, const int) + _Form of expected instruction(s):_ 'vsri.64 D0, D0, #0' + + * poly16x4_t vsri_n_p16 (poly16x4_t, poly16x4_t, const int) + _Form of expected instruction(s):_ 'vsri.16 D0, D0, #0' + + * poly8x8_t vsri_n_p8 (poly8x8_t, poly8x8_t, const int) + _Form of expected instruction(s):_ 'vsri.8 D0, D0, #0' + + * poly64x2_t vsriq_n_p64 (poly64x2_t, poly64x2_t, const int) + _Form of expected instruction(s):_ 'vsri.64 Q0, Q0, #0' + + * uint32x4_t vsriq_n_u32 (uint32x4_t, uint32x4_t, const int) + _Form of expected instruction(s):_ 'vsri.32 Q0, Q0, #0' + + * uint16x8_t vsriq_n_u16 (uint16x8_t, uint16x8_t, const int) + _Form of expected instruction(s):_ 'vsri.16 Q0, Q0, #0' + + * uint8x16_t vsriq_n_u8 (uint8x16_t, uint8x16_t, const int) + _Form of expected instruction(s):_ 'vsri.8 Q0, Q0, #0' + + * int32x4_t vsriq_n_s32 (int32x4_t, int32x4_t, const int) + _Form of expected instruction(s):_ 'vsri.32 Q0, Q0, #0' + + * int16x8_t vsriq_n_s16 (int16x8_t, int16x8_t, const int) + _Form of expected instruction(s):_ 'vsri.16 Q0, Q0, #0' + + * int8x16_t vsriq_n_s8 (int8x16_t, int8x16_t, const int) + _Form of expected instruction(s):_ 'vsri.8 Q0, Q0, #0' + + * uint64x2_t vsriq_n_u64 (uint64x2_t, uint64x2_t, const int) + _Form of expected instruction(s):_ 'vsri.64 Q0, Q0, #0' + + * int64x2_t vsriq_n_s64 (int64x2_t, int64x2_t, const int) + _Form of expected instruction(s):_ 'vsri.64 Q0, Q0, #0' + + * poly16x8_t vsriq_n_p16 (poly16x8_t, poly16x8_t, const int) + _Form of expected instruction(s):_ 'vsri.16 Q0, Q0, #0' + + * poly8x16_t vsriq_n_p8 (poly8x16_t, poly8x16_t, const int) + _Form of expected instruction(s):_ 'vsri.8 Q0, Q0, #0' + +6.57.6.37 Vector shift left and insert +...................................... + + * poly64x1_t vsli_n_p64 (poly64x1_t, poly64x1_t, const int) + _Form of expected instruction(s):_ 'vsli.64 D0, D0, #0' + + * uint32x2_t vsli_n_u32 (uint32x2_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vsli.32 D0, D0, #0' + + * uint16x4_t vsli_n_u16 (uint16x4_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vsli.16 D0, D0, #0' + + * uint8x8_t vsli_n_u8 (uint8x8_t, uint8x8_t, const int) + _Form of expected instruction(s):_ 'vsli.8 D0, D0, #0' + + * int32x2_t vsli_n_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vsli.32 D0, D0, #0' + + * int16x4_t vsli_n_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vsli.16 D0, D0, #0' + + * int8x8_t vsli_n_s8 (int8x8_t, int8x8_t, const int) + _Form of expected instruction(s):_ 'vsli.8 D0, D0, #0' + + * uint64x1_t vsli_n_u64 (uint64x1_t, uint64x1_t, const int) + _Form of expected instruction(s):_ 'vsli.64 D0, D0, #0' + + * int64x1_t vsli_n_s64 (int64x1_t, int64x1_t, const int) + _Form of expected instruction(s):_ 'vsli.64 D0, D0, #0' + + * poly16x4_t vsli_n_p16 (poly16x4_t, poly16x4_t, const int) + _Form of expected instruction(s):_ 'vsli.16 D0, D0, #0' + + * poly8x8_t vsli_n_p8 (poly8x8_t, poly8x8_t, const int) + _Form of expected instruction(s):_ 'vsli.8 D0, D0, #0' + + * poly64x2_t vsliq_n_p64 (poly64x2_t, poly64x2_t, const int) + _Form of expected instruction(s):_ 'vsli.64 Q0, Q0, #0' + + * uint32x4_t vsliq_n_u32 (uint32x4_t, uint32x4_t, const int) + _Form of expected instruction(s):_ 'vsli.32 Q0, Q0, #0' + + * uint16x8_t vsliq_n_u16 (uint16x8_t, uint16x8_t, const int) + _Form of expected instruction(s):_ 'vsli.16 Q0, Q0, #0' + + * uint8x16_t vsliq_n_u8 (uint8x16_t, uint8x16_t, const int) + _Form of expected instruction(s):_ 'vsli.8 Q0, Q0, #0' + + * int32x4_t vsliq_n_s32 (int32x4_t, int32x4_t, const int) + _Form of expected instruction(s):_ 'vsli.32 Q0, Q0, #0' + + * int16x8_t vsliq_n_s16 (int16x8_t, int16x8_t, const int) + _Form of expected instruction(s):_ 'vsli.16 Q0, Q0, #0' + + * int8x16_t vsliq_n_s8 (int8x16_t, int8x16_t, const int) + _Form of expected instruction(s):_ 'vsli.8 Q0, Q0, #0' + + * uint64x2_t vsliq_n_u64 (uint64x2_t, uint64x2_t, const int) + _Form of expected instruction(s):_ 'vsli.64 Q0, Q0, #0' + + * int64x2_t vsliq_n_s64 (int64x2_t, int64x2_t, const int) + _Form of expected instruction(s):_ 'vsli.64 Q0, Q0, #0' + + * poly16x8_t vsliq_n_p16 (poly16x8_t, poly16x8_t, const int) + _Form of expected instruction(s):_ 'vsli.16 Q0, Q0, #0' + + * poly8x16_t vsliq_n_p8 (poly8x16_t, poly8x16_t, const int) + _Form of expected instruction(s):_ 'vsli.8 Q0, Q0, #0' + +6.57.6.38 Absolute value +........................ + + * float32x2_t vabs_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vabs.f32 D0, D0' + + * int32x2_t vabs_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vabs.s32 D0, D0' + + * int16x4_t vabs_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vabs.s16 D0, D0' + + * int8x8_t vabs_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vabs.s8 D0, D0' + + * float32x4_t vabsq_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vabs.f32 Q0, Q0' + + * int32x4_t vabsq_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vabs.s32 Q0, Q0' + + * int16x8_t vabsq_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vabs.s16 Q0, Q0' + + * int8x16_t vabsq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vabs.s8 Q0, Q0' + + * int32x2_t vqabs_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vqabs.s32 D0, D0' + + * int16x4_t vqabs_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vqabs.s16 D0, D0' + + * int8x8_t vqabs_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vqabs.s8 D0, D0' + + * int32x4_t vqabsq_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vqabs.s32 Q0, Q0' + + * int16x8_t vqabsq_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vqabs.s16 Q0, Q0' + + * int8x16_t vqabsq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vqabs.s8 Q0, Q0' + +6.57.6.39 Negation +.................. + + * float32x2_t vneg_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vneg.f32 D0, D0' + + * int32x2_t vneg_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vneg.s32 D0, D0' + + * int16x4_t vneg_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vneg.s16 D0, D0' + + * int8x8_t vneg_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vneg.s8 D0, D0' + + * float32x4_t vnegq_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vneg.f32 Q0, Q0' + + * int32x4_t vnegq_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vneg.s32 Q0, Q0' + + * int16x8_t vnegq_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vneg.s16 Q0, Q0' + + * int8x16_t vnegq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vneg.s8 Q0, Q0' + + * int32x2_t vqneg_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vqneg.s32 D0, D0' + + * int16x4_t vqneg_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vqneg.s16 D0, D0' + + * int8x8_t vqneg_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vqneg.s8 D0, D0' + + * int32x4_t vqnegq_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vqneg.s32 Q0, Q0' + + * int16x8_t vqnegq_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vqneg.s16 Q0, Q0' + + * int8x16_t vqnegq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vqneg.s8 Q0, Q0' + +6.57.6.40 Bitwise not +..................... + + * uint32x2_t vmvn_u32 (uint32x2_t) + _Form of expected instruction(s):_ 'vmvn D0, D0' + + * uint16x4_t vmvn_u16 (uint16x4_t) + _Form of expected instruction(s):_ 'vmvn D0, D0' + + * uint8x8_t vmvn_u8 (uint8x8_t) + _Form of expected instruction(s):_ 'vmvn D0, D0' + + * int32x2_t vmvn_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vmvn D0, D0' + + * int16x4_t vmvn_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vmvn D0, D0' + + * int8x8_t vmvn_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vmvn D0, D0' + + * poly8x8_t vmvn_p8 (poly8x8_t) + _Form of expected instruction(s):_ 'vmvn D0, D0' + + * uint32x4_t vmvnq_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vmvn Q0, Q0' + + * uint16x8_t vmvnq_u16 (uint16x8_t) + _Form of expected instruction(s):_ 'vmvn Q0, Q0' + + * uint8x16_t vmvnq_u8 (uint8x16_t) + _Form of expected instruction(s):_ 'vmvn Q0, Q0' + + * int32x4_t vmvnq_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vmvn Q0, Q0' + + * int16x8_t vmvnq_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vmvn Q0, Q0' + + * int8x16_t vmvnq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vmvn Q0, Q0' + + * poly8x16_t vmvnq_p8 (poly8x16_t) + _Form of expected instruction(s):_ 'vmvn Q0, Q0' + +6.57.6.41 Count leading sign bits +................................. + + * int32x2_t vcls_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vcls.s32 D0, D0' + + * int16x4_t vcls_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vcls.s16 D0, D0' + + * int8x8_t vcls_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vcls.s8 D0, D0' + + * int32x4_t vclsq_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vcls.s32 Q0, Q0' + + * int16x8_t vclsq_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vcls.s16 Q0, Q0' + + * int8x16_t vclsq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vcls.s8 Q0, Q0' + +6.57.6.42 Count leading zeros +............................. + + * uint32x2_t vclz_u32 (uint32x2_t) + _Form of expected instruction(s):_ 'vclz.i32 D0, D0' + + * uint16x4_t vclz_u16 (uint16x4_t) + _Form of expected instruction(s):_ 'vclz.i16 D0, D0' + + * uint8x8_t vclz_u8 (uint8x8_t) + _Form of expected instruction(s):_ 'vclz.i8 D0, D0' + + * int32x2_t vclz_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vclz.i32 D0, D0' + + * int16x4_t vclz_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vclz.i16 D0, D0' + + * int8x8_t vclz_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vclz.i8 D0, D0' + + * uint32x4_t vclzq_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vclz.i32 Q0, Q0' + + * uint16x8_t vclzq_u16 (uint16x8_t) + _Form of expected instruction(s):_ 'vclz.i16 Q0, Q0' + + * uint8x16_t vclzq_u8 (uint8x16_t) + _Form of expected instruction(s):_ 'vclz.i8 Q0, Q0' + + * int32x4_t vclzq_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vclz.i32 Q0, Q0' + + * int16x8_t vclzq_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vclz.i16 Q0, Q0' + + * int8x16_t vclzq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vclz.i8 Q0, Q0' + +6.57.6.43 Count number of set bits +.................................. + + * uint8x8_t vcnt_u8 (uint8x8_t) + _Form of expected instruction(s):_ 'vcnt.8 D0, D0' + + * int8x8_t vcnt_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vcnt.8 D0, D0' + + * poly8x8_t vcnt_p8 (poly8x8_t) + _Form of expected instruction(s):_ 'vcnt.8 D0, D0' + + * uint8x16_t vcntq_u8 (uint8x16_t) + _Form of expected instruction(s):_ 'vcnt.8 Q0, Q0' + + * int8x16_t vcntq_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vcnt.8 Q0, Q0' + + * poly8x16_t vcntq_p8 (poly8x16_t) + _Form of expected instruction(s):_ 'vcnt.8 Q0, Q0' + +6.57.6.44 Reciprocal estimate +............................. + + * float32x2_t vrecpe_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vrecpe.f32 D0, D0' + + * uint32x2_t vrecpe_u32 (uint32x2_t) + _Form of expected instruction(s):_ 'vrecpe.u32 D0, D0' + + * float32x4_t vrecpeq_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vrecpe.f32 Q0, Q0' + + * uint32x4_t vrecpeq_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vrecpe.u32 Q0, Q0' + +6.57.6.45 Reciprocal square-root estimate +......................................... + + * float32x2_t vrsqrte_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vrsqrte.f32 D0, D0' + + * uint32x2_t vrsqrte_u32 (uint32x2_t) + _Form of expected instruction(s):_ 'vrsqrte.u32 D0, D0' + + * float32x4_t vrsqrteq_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vrsqrte.f32 Q0, Q0' + + * uint32x4_t vrsqrteq_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vrsqrte.u32 Q0, Q0' + +6.57.6.46 Get lanes from a vector +................................. + + * uint32_t vget_lane_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vmov.32 R0, D0[0]' + + * uint16_t vget_lane_u16 (uint16x4_t, const int) + _Form of expected instruction(s):_ 'vmov.u16 R0, D0[0]' + + * uint8_t vget_lane_u8 (uint8x8_t, const int) + _Form of expected instruction(s):_ 'vmov.u8 R0, D0[0]' + + * int32_t vget_lane_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vmov.32 R0, D0[0]' + + * int16_t vget_lane_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vmov.s16 R0, D0[0]' + + * int8_t vget_lane_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vmov.s8 R0, D0[0]' + + * float32_t vget_lane_f32 (float32x2_t, const int) + _Form of expected instruction(s):_ 'vmov.32 R0, D0[0]' + + * poly16_t vget_lane_p16 (poly16x4_t, const int) + _Form of expected instruction(s):_ 'vmov.u16 R0, D0[0]' + + * poly8_t vget_lane_p8 (poly8x8_t, const int) + _Form of expected instruction(s):_ 'vmov.u8 R0, D0[0]' + + * uint64_t vget_lane_u64 (uint64x1_t, const int) + + * int64_t vget_lane_s64 (int64x1_t, const int) + + * uint32_t vgetq_lane_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vmov.32 R0, D0[0]' + + * uint16_t vgetq_lane_u16 (uint16x8_t, const int) + _Form of expected instruction(s):_ 'vmov.u16 R0, D0[0]' + + * uint8_t vgetq_lane_u8 (uint8x16_t, const int) + _Form of expected instruction(s):_ 'vmov.u8 R0, D0[0]' + + * int32_t vgetq_lane_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vmov.32 R0, D0[0]' + + * int16_t vgetq_lane_s16 (int16x8_t, const int) + _Form of expected instruction(s):_ 'vmov.s16 R0, D0[0]' + + * int8_t vgetq_lane_s8 (int8x16_t, const int) + _Form of expected instruction(s):_ 'vmov.s8 R0, D0[0]' + + * float32_t vgetq_lane_f32 (float32x4_t, const int) + _Form of expected instruction(s):_ 'vmov.32 R0, D0[0]' + + * poly16_t vgetq_lane_p16 (poly16x8_t, const int) + _Form of expected instruction(s):_ 'vmov.u16 R0, D0[0]' + + * poly8_t vgetq_lane_p8 (poly8x16_t, const int) + _Form of expected instruction(s):_ 'vmov.u8 R0, D0[0]' + + * uint64_t vgetq_lane_u64 (uint64x2_t, const int) + _Form of expected instruction(s):_ 'vmov R0, R0, D0' _or_ 'fmrrd + R0, R0, D0' + + * int64_t vgetq_lane_s64 (int64x2_t, const int) + _Form of expected instruction(s):_ 'vmov R0, R0, D0' _or_ 'fmrrd + R0, R0, D0' + +6.57.6.47 Set lanes in a vector +............................... + + * uint32x2_t vset_lane_u32 (uint32_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vmov.32 D0[0], R0' + + * uint16x4_t vset_lane_u16 (uint16_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vmov.16 D0[0], R0' + + * uint8x8_t vset_lane_u8 (uint8_t, uint8x8_t, const int) + _Form of expected instruction(s):_ 'vmov.8 D0[0], R0' + + * int32x2_t vset_lane_s32 (int32_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vmov.32 D0[0], R0' + + * int16x4_t vset_lane_s16 (int16_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vmov.16 D0[0], R0' + + * int8x8_t vset_lane_s8 (int8_t, int8x8_t, const int) + _Form of expected instruction(s):_ 'vmov.8 D0[0], R0' + + * float32x2_t vset_lane_f32 (float32_t, float32x2_t, const int) + _Form of expected instruction(s):_ 'vmov.32 D0[0], R0' + + * poly16x4_t vset_lane_p16 (poly16_t, poly16x4_t, const int) + _Form of expected instruction(s):_ 'vmov.16 D0[0], R0' + + * poly8x8_t vset_lane_p8 (poly8_t, poly8x8_t, const int) + _Form of expected instruction(s):_ 'vmov.8 D0[0], R0' + + * uint64x1_t vset_lane_u64 (uint64_t, uint64x1_t, const int) + + * int64x1_t vset_lane_s64 (int64_t, int64x1_t, const int) + + * uint32x4_t vsetq_lane_u32 (uint32_t, uint32x4_t, const int) + _Form of expected instruction(s):_ 'vmov.32 D0[0], R0' + + * uint16x8_t vsetq_lane_u16 (uint16_t, uint16x8_t, const int) + _Form of expected instruction(s):_ 'vmov.16 D0[0], R0' + + * uint8x16_t vsetq_lane_u8 (uint8_t, uint8x16_t, const int) + _Form of expected instruction(s):_ 'vmov.8 D0[0], R0' + + * int32x4_t vsetq_lane_s32 (int32_t, int32x4_t, const int) + _Form of expected instruction(s):_ 'vmov.32 D0[0], R0' + + * int16x8_t vsetq_lane_s16 (int16_t, int16x8_t, const int) + _Form of expected instruction(s):_ 'vmov.16 D0[0], R0' + + * int8x16_t vsetq_lane_s8 (int8_t, int8x16_t, const int) + _Form of expected instruction(s):_ 'vmov.8 D0[0], R0' + + * float32x4_t vsetq_lane_f32 (float32_t, float32x4_t, const int) + _Form of expected instruction(s):_ 'vmov.32 D0[0], R0' + + * poly16x8_t vsetq_lane_p16 (poly16_t, poly16x8_t, const int) + _Form of expected instruction(s):_ 'vmov.16 D0[0], R0' + + * poly8x16_t vsetq_lane_p8 (poly8_t, poly8x16_t, const int) + _Form of expected instruction(s):_ 'vmov.8 D0[0], R0' + + * uint64x2_t vsetq_lane_u64 (uint64_t, uint64x2_t, const int) + _Form of expected instruction(s):_ 'vmov D0, R0, R0' + + * int64x2_t vsetq_lane_s64 (int64_t, int64x2_t, const int) + _Form of expected instruction(s):_ 'vmov D0, R0, R0' + +6.57.6.48 Create vector from literal bit pattern +................................................ + + * poly64x1_t vcreate_p64 (uint64_t) + + * uint32x2_t vcreate_u32 (uint64_t) + + * uint16x4_t vcreate_u16 (uint64_t) + + * uint8x8_t vcreate_u8 (uint64_t) + + * int32x2_t vcreate_s32 (uint64_t) + + * int16x4_t vcreate_s16 (uint64_t) + + * int8x8_t vcreate_s8 (uint64_t) + + * uint64x1_t vcreate_u64 (uint64_t) + + * int64x1_t vcreate_s64 (uint64_t) + + * float32x2_t vcreate_f32 (uint64_t) + + * poly16x4_t vcreate_p16 (uint64_t) + + * poly8x8_t vcreate_p8 (uint64_t) + +6.57.6.49 Set all lanes to the same value +......................................... + + * uint32x2_t vdup_n_u32 (uint32_t) + _Form of expected instruction(s):_ 'vdup.32 D0, R0' + + * uint16x4_t vdup_n_u16 (uint16_t) + _Form of expected instruction(s):_ 'vdup.16 D0, R0' + + * uint8x8_t vdup_n_u8 (uint8_t) + _Form of expected instruction(s):_ 'vdup.8 D0, R0' + + * int32x2_t vdup_n_s32 (int32_t) + _Form of expected instruction(s):_ 'vdup.32 D0, R0' + + * int16x4_t vdup_n_s16 (int16_t) + _Form of expected instruction(s):_ 'vdup.16 D0, R0' + + * int8x8_t vdup_n_s8 (int8_t) + _Form of expected instruction(s):_ 'vdup.8 D0, R0' + + * float32x2_t vdup_n_f32 (float32_t) + _Form of expected instruction(s):_ 'vdup.32 D0, R0' + + * poly16x4_t vdup_n_p16 (poly16_t) + _Form of expected instruction(s):_ 'vdup.16 D0, R0' + + * poly8x8_t vdup_n_p8 (poly8_t) + _Form of expected instruction(s):_ 'vdup.8 D0, R0' + + * poly64x1_t vdup_n_p64 (poly64_t) + + * uint64x1_t vdup_n_u64 (uint64_t) + + * int64x1_t vdup_n_s64 (int64_t) + + * poly64x2_t vdupq_n_p64 (poly64_t) + + * uint32x4_t vdupq_n_u32 (uint32_t) + _Form of expected instruction(s):_ 'vdup.32 Q0, R0' + + * uint16x8_t vdupq_n_u16 (uint16_t) + _Form of expected instruction(s):_ 'vdup.16 Q0, R0' + + * uint8x16_t vdupq_n_u8 (uint8_t) + _Form of expected instruction(s):_ 'vdup.8 Q0, R0' + + * int32x4_t vdupq_n_s32 (int32_t) + _Form of expected instruction(s):_ 'vdup.32 Q0, R0' + + * int16x8_t vdupq_n_s16 (int16_t) + _Form of expected instruction(s):_ 'vdup.16 Q0, R0' + + * int8x16_t vdupq_n_s8 (int8_t) + _Form of expected instruction(s):_ 'vdup.8 Q0, R0' + + * float32x4_t vdupq_n_f32 (float32_t) + _Form of expected instruction(s):_ 'vdup.32 Q0, R0' + + * poly16x8_t vdupq_n_p16 (poly16_t) + _Form of expected instruction(s):_ 'vdup.16 Q0, R0' + + * poly8x16_t vdupq_n_p8 (poly8_t) + _Form of expected instruction(s):_ 'vdup.8 Q0, R0' + + * uint64x2_t vdupq_n_u64 (uint64_t) + + * int64x2_t vdupq_n_s64 (int64_t) + + * uint32x2_t vmov_n_u32 (uint32_t) + _Form of expected instruction(s):_ 'vdup.32 D0, R0' + + * uint16x4_t vmov_n_u16 (uint16_t) + _Form of expected instruction(s):_ 'vdup.16 D0, R0' + + * uint8x8_t vmov_n_u8 (uint8_t) + _Form of expected instruction(s):_ 'vdup.8 D0, R0' + + * int32x2_t vmov_n_s32 (int32_t) + _Form of expected instruction(s):_ 'vdup.32 D0, R0' + + * int16x4_t vmov_n_s16 (int16_t) + _Form of expected instruction(s):_ 'vdup.16 D0, R0' + + * int8x8_t vmov_n_s8 (int8_t) + _Form of expected instruction(s):_ 'vdup.8 D0, R0' + + * float32x2_t vmov_n_f32 (float32_t) + _Form of expected instruction(s):_ 'vdup.32 D0, R0' + + * poly16x4_t vmov_n_p16 (poly16_t) + _Form of expected instruction(s):_ 'vdup.16 D0, R0' + + * poly8x8_t vmov_n_p8 (poly8_t) + _Form of expected instruction(s):_ 'vdup.8 D0, R0' + + * uint64x1_t vmov_n_u64 (uint64_t) + + * int64x1_t vmov_n_s64 (int64_t) + + * uint32x4_t vmovq_n_u32 (uint32_t) + _Form of expected instruction(s):_ 'vdup.32 Q0, R0' + + * uint16x8_t vmovq_n_u16 (uint16_t) + _Form of expected instruction(s):_ 'vdup.16 Q0, R0' + + * uint8x16_t vmovq_n_u8 (uint8_t) + _Form of expected instruction(s):_ 'vdup.8 Q0, R0' + + * int32x4_t vmovq_n_s32 (int32_t) + _Form of expected instruction(s):_ 'vdup.32 Q0, R0' + + * int16x8_t vmovq_n_s16 (int16_t) + _Form of expected instruction(s):_ 'vdup.16 Q0, R0' + + * int8x16_t vmovq_n_s8 (int8_t) + _Form of expected instruction(s):_ 'vdup.8 Q0, R0' + + * float32x4_t vmovq_n_f32 (float32_t) + _Form of expected instruction(s):_ 'vdup.32 Q0, R0' + + * poly16x8_t vmovq_n_p16 (poly16_t) + _Form of expected instruction(s):_ 'vdup.16 Q0, R0' + + * poly8x16_t vmovq_n_p8 (poly8_t) + _Form of expected instruction(s):_ 'vdup.8 Q0, R0' + + * uint64x2_t vmovq_n_u64 (uint64_t) + + * int64x2_t vmovq_n_s64 (int64_t) + + * uint32x2_t vdup_lane_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vdup.32 D0, D0[0]' + + * uint16x4_t vdup_lane_u16 (uint16x4_t, const int) + _Form of expected instruction(s):_ 'vdup.16 D0, D0[0]' + + * uint8x8_t vdup_lane_u8 (uint8x8_t, const int) + _Form of expected instruction(s):_ 'vdup.8 D0, D0[0]' + + * int32x2_t vdup_lane_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vdup.32 D0, D0[0]' + + * int16x4_t vdup_lane_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vdup.16 D0, D0[0]' + + * int8x8_t vdup_lane_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vdup.8 D0, D0[0]' + + * float32x2_t vdup_lane_f32 (float32x2_t, const int) + _Form of expected instruction(s):_ 'vdup.32 D0, D0[0]' + + * poly16x4_t vdup_lane_p16 (poly16x4_t, const int) + _Form of expected instruction(s):_ 'vdup.16 D0, D0[0]' + + * poly8x8_t vdup_lane_p8 (poly8x8_t, const int) + _Form of expected instruction(s):_ 'vdup.8 D0, D0[0]' + + * poly64x1_t vdup_lane_p64 (poly64x1_t, const int) + + * uint64x1_t vdup_lane_u64 (uint64x1_t, const int) + + * int64x1_t vdup_lane_s64 (int64x1_t, const int) + + * uint32x4_t vdupq_lane_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vdup.32 Q0, D0[0]' + + * uint16x8_t vdupq_lane_u16 (uint16x4_t, const int) + _Form of expected instruction(s):_ 'vdup.16 Q0, D0[0]' + + * uint8x16_t vdupq_lane_u8 (uint8x8_t, const int) + _Form of expected instruction(s):_ 'vdup.8 Q0, D0[0]' + + * int32x4_t vdupq_lane_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vdup.32 Q0, D0[0]' + + * int16x8_t vdupq_lane_s16 (int16x4_t, const int) + _Form of expected instruction(s):_ 'vdup.16 Q0, D0[0]' + + * int8x16_t vdupq_lane_s8 (int8x8_t, const int) + _Form of expected instruction(s):_ 'vdup.8 Q0, D0[0]' + + * float32x4_t vdupq_lane_f32 (float32x2_t, const int) + _Form of expected instruction(s):_ 'vdup.32 Q0, D0[0]' + + * poly16x8_t vdupq_lane_p16 (poly16x4_t, const int) + _Form of expected instruction(s):_ 'vdup.16 Q0, D0[0]' + + * poly8x16_t vdupq_lane_p8 (poly8x8_t, const int) + _Form of expected instruction(s):_ 'vdup.8 Q0, D0[0]' + + * poly64x2_t vdupq_lane_p64 (poly64x1_t, const int) + + * uint64x2_t vdupq_lane_u64 (uint64x1_t, const int) + + * int64x2_t vdupq_lane_s64 (int64x1_t, const int) + +6.57.6.50 Combining vectors +........................... + + * poly64x2_t vcombine_p64 (poly64x1_t, poly64x1_t) + + * uint32x4_t vcombine_u32 (uint32x2_t, uint32x2_t) + + * uint16x8_t vcombine_u16 (uint16x4_t, uint16x4_t) + + * uint8x16_t vcombine_u8 (uint8x8_t, uint8x8_t) + + * int32x4_t vcombine_s32 (int32x2_t, int32x2_t) + + * int16x8_t vcombine_s16 (int16x4_t, int16x4_t) + + * int8x16_t vcombine_s8 (int8x8_t, int8x8_t) + + * uint64x2_t vcombine_u64 (uint64x1_t, uint64x1_t) + + * int64x2_t vcombine_s64 (int64x1_t, int64x1_t) + + * float32x4_t vcombine_f32 (float32x2_t, float32x2_t) + + * poly16x8_t vcombine_p16 (poly16x4_t, poly16x4_t) + + * poly8x16_t vcombine_p8 (poly8x8_t, poly8x8_t) + +6.57.6.51 Splitting vectors +........................... + + * poly64x1_t vget_high_p64 (poly64x2_t) + + * uint32x2_t vget_high_u32 (uint32x4_t) + + * uint16x4_t vget_high_u16 (uint16x8_t) + + * uint8x8_t vget_high_u8 (uint8x16_t) + + * int32x2_t vget_high_s32 (int32x4_t) + + * int16x4_t vget_high_s16 (int16x8_t) + + * int8x8_t vget_high_s8 (int8x16_t) + + * uint64x1_t vget_high_u64 (uint64x2_t) + + * int64x1_t vget_high_s64 (int64x2_t) + + * float32x2_t vget_high_f32 (float32x4_t) + + * poly16x4_t vget_high_p16 (poly16x8_t) + + * poly8x8_t vget_high_p8 (poly8x16_t) + + * uint32x2_t vget_low_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * uint16x4_t vget_low_u16 (uint16x8_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * uint8x8_t vget_low_u8 (uint8x16_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * int32x2_t vget_low_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * int16x4_t vget_low_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * int8x8_t vget_low_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * float32x2_t vget_low_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * poly16x4_t vget_low_p16 (poly16x8_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * poly8x8_t vget_low_p8 (poly8x16_t) + _Form of expected instruction(s):_ 'vmov D0, D0' + + * poly64x1_t vget_low_p64 (poly64x2_t) + + * uint64x1_t vget_low_u64 (uint64x2_t) + + * int64x1_t vget_low_s64 (int64x2_t) + +6.57.6.52 Conversions +..................... + + * float32x2_t vcvt_f32_u32 (uint32x2_t) + _Form of expected instruction(s):_ 'vcvt.f32.u32 D0, D0' + + * float32x2_t vcvt_f32_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vcvt.f32.s32 D0, D0' + + * uint32x2_t vcvt_u32_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vcvt.u32.f32 D0, D0' + + * int32x2_t vcvt_s32_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vcvt.s32.f32 D0, D0' + + * float32x4_t vcvtq_f32_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vcvt.f32.u32 Q0, Q0' + + * float32x4_t vcvtq_f32_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vcvt.f32.s32 Q0, Q0' + + * uint32x4_t vcvtq_u32_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vcvt.u32.f32 Q0, Q0' + + * int32x4_t vcvtq_s32_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vcvt.s32.f32 Q0, Q0' + + * float16x4_t vcvt_f16_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vcvt.f16.f32 D0, Q0' + + * float32x4_t vcvt_f32_f16 (float16x4_t) + _Form of expected instruction(s):_ 'vcvt.f32.f16 Q0, D0' + + * float32x2_t vcvt_n_f32_u32 (uint32x2_t, const int) + _Form of expected instruction(s):_ 'vcvt.f32.u32 D0, D0, #0' + + * float32x2_t vcvt_n_f32_s32 (int32x2_t, const int) + _Form of expected instruction(s):_ 'vcvt.f32.s32 D0, D0, #0' + + * uint32x2_t vcvt_n_u32_f32 (float32x2_t, const int) + _Form of expected instruction(s):_ 'vcvt.u32.f32 D0, D0, #0' + + * int32x2_t vcvt_n_s32_f32 (float32x2_t, const int) + _Form of expected instruction(s):_ 'vcvt.s32.f32 D0, D0, #0' + + * float32x4_t vcvtq_n_f32_u32 (uint32x4_t, const int) + _Form of expected instruction(s):_ 'vcvt.f32.u32 Q0, Q0, #0' + + * float32x4_t vcvtq_n_f32_s32 (int32x4_t, const int) + _Form of expected instruction(s):_ 'vcvt.f32.s32 Q0, Q0, #0' + + * uint32x4_t vcvtq_n_u32_f32 (float32x4_t, const int) + _Form of expected instruction(s):_ 'vcvt.u32.f32 Q0, Q0, #0' + + * int32x4_t vcvtq_n_s32_f32 (float32x4_t, const int) + _Form of expected instruction(s):_ 'vcvt.s32.f32 Q0, Q0, #0' + +6.57.6.53 Move, single_opcode narrowing +....................................... + + * uint32x2_t vmovn_u64 (uint64x2_t) + _Form of expected instruction(s):_ 'vmovn.i64 D0, Q0' + + * uint16x4_t vmovn_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vmovn.i32 D0, Q0' + + * uint8x8_t vmovn_u16 (uint16x8_t) + _Form of expected instruction(s):_ 'vmovn.i16 D0, Q0' + + * int32x2_t vmovn_s64 (int64x2_t) + _Form of expected instruction(s):_ 'vmovn.i64 D0, Q0' + + * int16x4_t vmovn_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vmovn.i32 D0, Q0' + + * int8x8_t vmovn_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vmovn.i16 D0, Q0' + + * uint32x2_t vqmovn_u64 (uint64x2_t) + _Form of expected instruction(s):_ 'vqmovn.u64 D0, Q0' + + * uint16x4_t vqmovn_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vqmovn.u32 D0, Q0' + + * uint8x8_t vqmovn_u16 (uint16x8_t) + _Form of expected instruction(s):_ 'vqmovn.u16 D0, Q0' + + * int32x2_t vqmovn_s64 (int64x2_t) + _Form of expected instruction(s):_ 'vqmovn.s64 D0, Q0' + + * int16x4_t vqmovn_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vqmovn.s32 D0, Q0' + + * int8x8_t vqmovn_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vqmovn.s16 D0, Q0' + + * uint32x2_t vqmovun_s64 (int64x2_t) + _Form of expected instruction(s):_ 'vqmovun.s64 D0, Q0' + + * uint16x4_t vqmovun_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vqmovun.s32 D0, Q0' + + * uint8x8_t vqmovun_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vqmovun.s16 D0, Q0' + +6.57.6.54 Move, single_opcode long +.................................. + + * uint64x2_t vmovl_u32 (uint32x2_t) + _Form of expected instruction(s):_ 'vmovl.u32 Q0, D0' + + * uint32x4_t vmovl_u16 (uint16x4_t) + _Form of expected instruction(s):_ 'vmovl.u16 Q0, D0' + + * uint16x8_t vmovl_u8 (uint8x8_t) + _Form of expected instruction(s):_ 'vmovl.u8 Q0, D0' + + * int64x2_t vmovl_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vmovl.s32 Q0, D0' + + * int32x4_t vmovl_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vmovl.s16 Q0, D0' + + * int16x8_t vmovl_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vmovl.s8 Q0, D0' + +6.57.6.55 Table lookup +...................... + + * poly8x8_t vtbl1_p8 (poly8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0}, D0' + + * int8x8_t vtbl1_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0}, D0' + + * uint8x8_t vtbl1_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0}, D0' + + * poly8x8_t vtbl2_p8 (poly8x8x2_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1}, D0' + + * int8x8_t vtbl2_s8 (int8x8x2_t, int8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1}, D0' + + * uint8x8_t vtbl2_u8 (uint8x8x2_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1}, D0' + + * poly8x8_t vtbl3_p8 (poly8x8x3_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1, D2}, D0' + + * int8x8_t vtbl3_s8 (int8x8x3_t, int8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1, D2}, D0' + + * uint8x8_t vtbl3_u8 (uint8x8x3_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1, D2}, D0' + + * poly8x8_t vtbl4_p8 (poly8x8x4_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1, D2, D3}, + D0' + + * int8x8_t vtbl4_s8 (int8x8x4_t, int8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1, D2, D3}, + D0' + + * uint8x8_t vtbl4_u8 (uint8x8x4_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbl.8 D0, {D0, D1, D2, D3}, + D0' + +6.57.6.56 Extended table lookup +............................... + + * poly8x8_t vtbx1_p8 (poly8x8_t, poly8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0}, D0' + + * int8x8_t vtbx1_s8 (int8x8_t, int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0}, D0' + + * uint8x8_t vtbx1_u8 (uint8x8_t, uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0}, D0' + + * poly8x8_t vtbx2_p8 (poly8x8_t, poly8x8x2_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1}, D0' + + * int8x8_t vtbx2_s8 (int8x8_t, int8x8x2_t, int8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1}, D0' + + * uint8x8_t vtbx2_u8 (uint8x8_t, uint8x8x2_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1}, D0' + + * poly8x8_t vtbx3_p8 (poly8x8_t, poly8x8x3_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1, D2}, D0' + + * int8x8_t vtbx3_s8 (int8x8_t, int8x8x3_t, int8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1, D2}, D0' + + * uint8x8_t vtbx3_u8 (uint8x8_t, uint8x8x3_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1, D2}, D0' + + * poly8x8_t vtbx4_p8 (poly8x8_t, poly8x8x4_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1, D2, D3}, + D0' + + * int8x8_t vtbx4_s8 (int8x8_t, int8x8x4_t, int8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1, D2, D3}, + D0' + + * uint8x8_t vtbx4_u8 (uint8x8_t, uint8x8x4_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtbx.8 D0, {D0, D1, D2, D3}, + D0' + +6.57.6.57 Multiply, lane +........................ + + * float32x2_t vmul_lane_f32 (float32x2_t, float32x2_t, const int) + _Form of expected instruction(s):_ 'vmul.f32 D0, D0, D0[0]' + + * uint32x2_t vmul_lane_u32 (uint32x2_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vmul.i32 D0, D0, D0[0]' + + * uint16x4_t vmul_lane_u16 (uint16x4_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vmul.i16 D0, D0, D0[0]' + + * int32x2_t vmul_lane_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vmul.i32 D0, D0, D0[0]' + + * int16x4_t vmul_lane_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vmul.i16 D0, D0, D0[0]' + + * float32x4_t vmulq_lane_f32 (float32x4_t, float32x2_t, const int) + _Form of expected instruction(s):_ 'vmul.f32 Q0, Q0, D0[0]' + + * uint32x4_t vmulq_lane_u32 (uint32x4_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vmul.i32 Q0, Q0, D0[0]' + + * uint16x8_t vmulq_lane_u16 (uint16x8_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vmul.i16 Q0, Q0, D0[0]' + + * int32x4_t vmulq_lane_s32 (int32x4_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vmul.i32 Q0, Q0, D0[0]' + + * int16x8_t vmulq_lane_s16 (int16x8_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vmul.i16 Q0, Q0, D0[0]' + +6.57.6.58 Long multiply, lane +............................. + + * uint64x2_t vmull_lane_u32 (uint32x2_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vmull.u32 Q0, D0, D0[0]' + + * uint32x4_t vmull_lane_u16 (uint16x4_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vmull.u16 Q0, D0, D0[0]' + + * int64x2_t vmull_lane_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vmull.s32 Q0, D0, D0[0]' + + * int32x4_t vmull_lane_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vmull.s16 Q0, D0, D0[0]' + +6.57.6.59 Saturating doubling long multiply, lane +................................................. + + * int64x2_t vqdmull_lane_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vqdmull.s32 Q0, D0, D0[0]' + + * int32x4_t vqdmull_lane_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vqdmull.s16 Q0, D0, D0[0]' + +6.57.6.60 Saturating doubling multiply high, lane +................................................. + + * int32x4_t vqdmulhq_lane_s32 (int32x4_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vqdmulh.s32 Q0, Q0, D0[0]' + + * int16x8_t vqdmulhq_lane_s16 (int16x8_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vqdmulh.s16 Q0, Q0, D0[0]' + + * int32x2_t vqdmulh_lane_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vqdmulh.s32 D0, D0, D0[0]' + + * int16x4_t vqdmulh_lane_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vqdmulh.s16 D0, D0, D0[0]' + + * int32x4_t vqrdmulhq_lane_s32 (int32x4_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vqrdmulh.s32 Q0, Q0, D0[0]' + + * int16x8_t vqrdmulhq_lane_s16 (int16x8_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vqrdmulh.s16 Q0, Q0, D0[0]' + + * int32x2_t vqrdmulh_lane_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vqrdmulh.s32 D0, D0, D0[0]' + + * int16x4_t vqrdmulh_lane_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vqrdmulh.s16 D0, D0, D0[0]' + +6.57.6.61 Multiply-accumulate, lane +................................... + + * float32x2_t vmla_lane_f32 (float32x2_t, float32x2_t, float32x2_t, + const int) + _Form of expected instruction(s):_ 'vmla.f32 D0, D0, D0[0]' + + * uint32x2_t vmla_lane_u32 (uint32x2_t, uint32x2_t, uint32x2_t, const + int) + _Form of expected instruction(s):_ 'vmla.i32 D0, D0, D0[0]' + + * uint16x4_t vmla_lane_u16 (uint16x4_t, uint16x4_t, uint16x4_t, const + int) + _Form of expected instruction(s):_ 'vmla.i16 D0, D0, D0[0]' + + * int32x2_t vmla_lane_s32 (int32x2_t, int32x2_t, int32x2_t, const + int) + _Form of expected instruction(s):_ 'vmla.i32 D0, D0, D0[0]' + + * int16x4_t vmla_lane_s16 (int16x4_t, int16x4_t, int16x4_t, const + int) + _Form of expected instruction(s):_ 'vmla.i16 D0, D0, D0[0]' + + * float32x4_t vmlaq_lane_f32 (float32x4_t, float32x4_t, float32x2_t, + const int) + _Form of expected instruction(s):_ 'vmla.f32 Q0, Q0, D0[0]' + + * uint32x4_t vmlaq_lane_u32 (uint32x4_t, uint32x4_t, uint32x2_t, + const int) + _Form of expected instruction(s):_ 'vmla.i32 Q0, Q0, D0[0]' + + * uint16x8_t vmlaq_lane_u16 (uint16x8_t, uint16x8_t, uint16x4_t, + const int) + _Form of expected instruction(s):_ 'vmla.i16 Q0, Q0, D0[0]' + + * int32x4_t vmlaq_lane_s32 (int32x4_t, int32x4_t, int32x2_t, const + int) + _Form of expected instruction(s):_ 'vmla.i32 Q0, Q0, D0[0]' + + * int16x8_t vmlaq_lane_s16 (int16x8_t, int16x8_t, int16x4_t, const + int) + _Form of expected instruction(s):_ 'vmla.i16 Q0, Q0, D0[0]' + + * uint64x2_t vmlal_lane_u32 (uint64x2_t, uint32x2_t, uint32x2_t, + const int) + _Form of expected instruction(s):_ 'vmlal.u32 Q0, D0, D0[0]' + + * uint32x4_t vmlal_lane_u16 (uint32x4_t, uint16x4_t, uint16x4_t, + const int) + _Form of expected instruction(s):_ 'vmlal.u16 Q0, D0, D0[0]' + + * int64x2_t vmlal_lane_s32 (int64x2_t, int32x2_t, int32x2_t, const + int) + _Form of expected instruction(s):_ 'vmlal.s32 Q0, D0, D0[0]' + + * int32x4_t vmlal_lane_s16 (int32x4_t, int16x4_t, int16x4_t, const + int) + _Form of expected instruction(s):_ 'vmlal.s16 Q0, D0, D0[0]' + + * int64x2_t vqdmlal_lane_s32 (int64x2_t, int32x2_t, int32x2_t, const + int) + _Form of expected instruction(s):_ 'vqdmlal.s32 Q0, D0, D0[0]' + + * int32x4_t vqdmlal_lane_s16 (int32x4_t, int16x4_t, int16x4_t, const + int) + _Form of expected instruction(s):_ 'vqdmlal.s16 Q0, D0, D0[0]' + +6.57.6.62 Multiply-subtract, lane +................................. + + * float32x2_t vmls_lane_f32 (float32x2_t, float32x2_t, float32x2_t, + const int) + _Form of expected instruction(s):_ 'vmls.f32 D0, D0, D0[0]' + + * uint32x2_t vmls_lane_u32 (uint32x2_t, uint32x2_t, uint32x2_t, const + int) + _Form of expected instruction(s):_ 'vmls.i32 D0, D0, D0[0]' + + * uint16x4_t vmls_lane_u16 (uint16x4_t, uint16x4_t, uint16x4_t, const + int) + _Form of expected instruction(s):_ 'vmls.i16 D0, D0, D0[0]' + + * int32x2_t vmls_lane_s32 (int32x2_t, int32x2_t, int32x2_t, const + int) + _Form of expected instruction(s):_ 'vmls.i32 D0, D0, D0[0]' + + * int16x4_t vmls_lane_s16 (int16x4_t, int16x4_t, int16x4_t, const + int) + _Form of expected instruction(s):_ 'vmls.i16 D0, D0, D0[0]' + + * float32x4_t vmlsq_lane_f32 (float32x4_t, float32x4_t, float32x2_t, + const int) + _Form of expected instruction(s):_ 'vmls.f32 Q0, Q0, D0[0]' + + * uint32x4_t vmlsq_lane_u32 (uint32x4_t, uint32x4_t, uint32x2_t, + const int) + _Form of expected instruction(s):_ 'vmls.i32 Q0, Q0, D0[0]' + + * uint16x8_t vmlsq_lane_u16 (uint16x8_t, uint16x8_t, uint16x4_t, + const int) + _Form of expected instruction(s):_ 'vmls.i16 Q0, Q0, D0[0]' + + * int32x4_t vmlsq_lane_s32 (int32x4_t, int32x4_t, int32x2_t, const + int) + _Form of expected instruction(s):_ 'vmls.i32 Q0, Q0, D0[0]' + + * int16x8_t vmlsq_lane_s16 (int16x8_t, int16x8_t, int16x4_t, const + int) + _Form of expected instruction(s):_ 'vmls.i16 Q0, Q0, D0[0]' + + * uint64x2_t vmlsl_lane_u32 (uint64x2_t, uint32x2_t, uint32x2_t, + const int) + _Form of expected instruction(s):_ 'vmlsl.u32 Q0, D0, D0[0]' + + * uint32x4_t vmlsl_lane_u16 (uint32x4_t, uint16x4_t, uint16x4_t, + const int) + _Form of expected instruction(s):_ 'vmlsl.u16 Q0, D0, D0[0]' + + * int64x2_t vmlsl_lane_s32 (int64x2_t, int32x2_t, int32x2_t, const + int) + _Form of expected instruction(s):_ 'vmlsl.s32 Q0, D0, D0[0]' + + * int32x4_t vmlsl_lane_s16 (int32x4_t, int16x4_t, int16x4_t, const + int) + _Form of expected instruction(s):_ 'vmlsl.s16 Q0, D0, D0[0]' + + * int64x2_t vqdmlsl_lane_s32 (int64x2_t, int32x2_t, int32x2_t, const + int) + _Form of expected instruction(s):_ 'vqdmlsl.s32 Q0, D0, D0[0]' + + * int32x4_t vqdmlsl_lane_s16 (int32x4_t, int16x4_t, int16x4_t, const + int) + _Form of expected instruction(s):_ 'vqdmlsl.s16 Q0, D0, D0[0]' + +6.57.6.63 Vector multiply by scalar +................................... + + * float32x2_t vmul_n_f32 (float32x2_t, float32_t) + _Form of expected instruction(s):_ 'vmul.f32 D0, D0, D0[0]' + + * uint32x2_t vmul_n_u32 (uint32x2_t, uint32_t) + _Form of expected instruction(s):_ 'vmul.i32 D0, D0, D0[0]' + + * uint16x4_t vmul_n_u16 (uint16x4_t, uint16_t) + _Form of expected instruction(s):_ 'vmul.i16 D0, D0, D0[0]' + + * int32x2_t vmul_n_s32 (int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vmul.i32 D0, D0, D0[0]' + + * int16x4_t vmul_n_s16 (int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vmul.i16 D0, D0, D0[0]' + + * float32x4_t vmulq_n_f32 (float32x4_t, float32_t) + _Form of expected instruction(s):_ 'vmul.f32 Q0, Q0, D0[0]' + + * uint32x4_t vmulq_n_u32 (uint32x4_t, uint32_t) + _Form of expected instruction(s):_ 'vmul.i32 Q0, Q0, D0[0]' + + * uint16x8_t vmulq_n_u16 (uint16x8_t, uint16_t) + _Form of expected instruction(s):_ 'vmul.i16 Q0, Q0, D0[0]' + + * int32x4_t vmulq_n_s32 (int32x4_t, int32_t) + _Form of expected instruction(s):_ 'vmul.i32 Q0, Q0, D0[0]' + + * int16x8_t vmulq_n_s16 (int16x8_t, int16_t) + _Form of expected instruction(s):_ 'vmul.i16 Q0, Q0, D0[0]' + +6.57.6.64 Vector long multiply by scalar +........................................ + + * uint64x2_t vmull_n_u32 (uint32x2_t, uint32_t) + _Form of expected instruction(s):_ 'vmull.u32 Q0, D0, D0[0]' + + * uint32x4_t vmull_n_u16 (uint16x4_t, uint16_t) + _Form of expected instruction(s):_ 'vmull.u16 Q0, D0, D0[0]' + + * int64x2_t vmull_n_s32 (int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vmull.s32 Q0, D0, D0[0]' + + * int32x4_t vmull_n_s16 (int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vmull.s16 Q0, D0, D0[0]' + +6.57.6.65 Vector saturating doubling long multiply by scalar +............................................................ + + * int64x2_t vqdmull_n_s32 (int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vqdmull.s32 Q0, D0, D0[0]' + + * int32x4_t vqdmull_n_s16 (int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vqdmull.s16 Q0, D0, D0[0]' + +6.57.6.66 Vector saturating doubling multiply high by scalar +............................................................ + + * int32x4_t vqdmulhq_n_s32 (int32x4_t, int32_t) + _Form of expected instruction(s):_ 'vqdmulh.s32 Q0, Q0, D0[0]' + + * int16x8_t vqdmulhq_n_s16 (int16x8_t, int16_t) + _Form of expected instruction(s):_ 'vqdmulh.s16 Q0, Q0, D0[0]' + + * int32x2_t vqdmulh_n_s32 (int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vqdmulh.s32 D0, D0, D0[0]' + + * int16x4_t vqdmulh_n_s16 (int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vqdmulh.s16 D0, D0, D0[0]' + + * int32x4_t vqrdmulhq_n_s32 (int32x4_t, int32_t) + _Form of expected instruction(s):_ 'vqrdmulh.s32 Q0, Q0, D0[0]' + + * int16x8_t vqrdmulhq_n_s16 (int16x8_t, int16_t) + _Form of expected instruction(s):_ 'vqrdmulh.s16 Q0, Q0, D0[0]' + + * int32x2_t vqrdmulh_n_s32 (int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vqrdmulh.s32 D0, D0, D0[0]' + + * int16x4_t vqrdmulh_n_s16 (int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vqrdmulh.s16 D0, D0, D0[0]' + +6.57.6.67 Vector multiply-accumulate by scalar +.............................................. + + * float32x2_t vmla_n_f32 (float32x2_t, float32x2_t, float32_t) + _Form of expected instruction(s):_ 'vmla.f32 D0, D0, D0[0]' + + * uint32x2_t vmla_n_u32 (uint32x2_t, uint32x2_t, uint32_t) + _Form of expected instruction(s):_ 'vmla.i32 D0, D0, D0[0]' + + * uint16x4_t vmla_n_u16 (uint16x4_t, uint16x4_t, uint16_t) + _Form of expected instruction(s):_ 'vmla.i16 D0, D0, D0[0]' + + * int32x2_t vmla_n_s32 (int32x2_t, int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vmla.i32 D0, D0, D0[0]' + + * int16x4_t vmla_n_s16 (int16x4_t, int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vmla.i16 D0, D0, D0[0]' + + * float32x4_t vmlaq_n_f32 (float32x4_t, float32x4_t, float32_t) + _Form of expected instruction(s):_ 'vmla.f32 Q0, Q0, D0[0]' + + * uint32x4_t vmlaq_n_u32 (uint32x4_t, uint32x4_t, uint32_t) + _Form of expected instruction(s):_ 'vmla.i32 Q0, Q0, D0[0]' + + * uint16x8_t vmlaq_n_u16 (uint16x8_t, uint16x8_t, uint16_t) + _Form of expected instruction(s):_ 'vmla.i16 Q0, Q0, D0[0]' + + * int32x4_t vmlaq_n_s32 (int32x4_t, int32x4_t, int32_t) + _Form of expected instruction(s):_ 'vmla.i32 Q0, Q0, D0[0]' + + * int16x8_t vmlaq_n_s16 (int16x8_t, int16x8_t, int16_t) + _Form of expected instruction(s):_ 'vmla.i16 Q0, Q0, D0[0]' + + * uint64x2_t vmlal_n_u32 (uint64x2_t, uint32x2_t, uint32_t) + _Form of expected instruction(s):_ 'vmlal.u32 Q0, D0, D0[0]' + + * uint32x4_t vmlal_n_u16 (uint32x4_t, uint16x4_t, uint16_t) + _Form of expected instruction(s):_ 'vmlal.u16 Q0, D0, D0[0]' + + * int64x2_t vmlal_n_s32 (int64x2_t, int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vmlal.s32 Q0, D0, D0[0]' + + * int32x4_t vmlal_n_s16 (int32x4_t, int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vmlal.s16 Q0, D0, D0[0]' + + * int64x2_t vqdmlal_n_s32 (int64x2_t, int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vqdmlal.s32 Q0, D0, D0[0]' + + * int32x4_t vqdmlal_n_s16 (int32x4_t, int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vqdmlal.s16 Q0, D0, D0[0]' + +6.57.6.68 Vector multiply-subtract by scalar +............................................ + + * float32x2_t vmls_n_f32 (float32x2_t, float32x2_t, float32_t) + _Form of expected instruction(s):_ 'vmls.f32 D0, D0, D0[0]' + + * uint32x2_t vmls_n_u32 (uint32x2_t, uint32x2_t, uint32_t) + _Form of expected instruction(s):_ 'vmls.i32 D0, D0, D0[0]' + + * uint16x4_t vmls_n_u16 (uint16x4_t, uint16x4_t, uint16_t) + _Form of expected instruction(s):_ 'vmls.i16 D0, D0, D0[0]' + + * int32x2_t vmls_n_s32 (int32x2_t, int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vmls.i32 D0, D0, D0[0]' + + * int16x4_t vmls_n_s16 (int16x4_t, int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vmls.i16 D0, D0, D0[0]' + + * float32x4_t vmlsq_n_f32 (float32x4_t, float32x4_t, float32_t) + _Form of expected instruction(s):_ 'vmls.f32 Q0, Q0, D0[0]' + + * uint32x4_t vmlsq_n_u32 (uint32x4_t, uint32x4_t, uint32_t) + _Form of expected instruction(s):_ 'vmls.i32 Q0, Q0, D0[0]' + + * uint16x8_t vmlsq_n_u16 (uint16x8_t, uint16x8_t, uint16_t) + _Form of expected instruction(s):_ 'vmls.i16 Q0, Q0, D0[0]' + + * int32x4_t vmlsq_n_s32 (int32x4_t, int32x4_t, int32_t) + _Form of expected instruction(s):_ 'vmls.i32 Q0, Q0, D0[0]' + + * int16x8_t vmlsq_n_s16 (int16x8_t, int16x8_t, int16_t) + _Form of expected instruction(s):_ 'vmls.i16 Q0, Q0, D0[0]' + + * uint64x2_t vmlsl_n_u32 (uint64x2_t, uint32x2_t, uint32_t) + _Form of expected instruction(s):_ 'vmlsl.u32 Q0, D0, D0[0]' + + * uint32x4_t vmlsl_n_u16 (uint32x4_t, uint16x4_t, uint16_t) + _Form of expected instruction(s):_ 'vmlsl.u16 Q0, D0, D0[0]' + + * int64x2_t vmlsl_n_s32 (int64x2_t, int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vmlsl.s32 Q0, D0, D0[0]' + + * int32x4_t vmlsl_n_s16 (int32x4_t, int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vmlsl.s16 Q0, D0, D0[0]' + + * int64x2_t vqdmlsl_n_s32 (int64x2_t, int32x2_t, int32_t) + _Form of expected instruction(s):_ 'vqdmlsl.s32 Q0, D0, D0[0]' + + * int32x4_t vqdmlsl_n_s16 (int32x4_t, int16x4_t, int16_t) + _Form of expected instruction(s):_ 'vqdmlsl.s16 Q0, D0, D0[0]' + +6.57.6.69 Vector extract +........................ + + * poly64x1_t vext_p64 (poly64x1_t, poly64x1_t, const int) + _Form of expected instruction(s):_ 'vext.64 D0, D0, D0, #0' + + * uint32x2_t vext_u32 (uint32x2_t, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vext.32 D0, D0, D0, #0' + + * uint16x4_t vext_u16 (uint16x4_t, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vext.16 D0, D0, D0, #0' + + * uint8x8_t vext_u8 (uint8x8_t, uint8x8_t, const int) + _Form of expected instruction(s):_ 'vext.8 D0, D0, D0, #0' + + * int32x2_t vext_s32 (int32x2_t, int32x2_t, const int) + _Form of expected instruction(s):_ 'vext.32 D0, D0, D0, #0' + + * int16x4_t vext_s16 (int16x4_t, int16x4_t, const int) + _Form of expected instruction(s):_ 'vext.16 D0, D0, D0, #0' + + * int8x8_t vext_s8 (int8x8_t, int8x8_t, const int) + _Form of expected instruction(s):_ 'vext.8 D0, D0, D0, #0' + + * uint64x1_t vext_u64 (uint64x1_t, uint64x1_t, const int) + _Form of expected instruction(s):_ 'vext.64 D0, D0, D0, #0' + + * int64x1_t vext_s64 (int64x1_t, int64x1_t, const int) + _Form of expected instruction(s):_ 'vext.64 D0, D0, D0, #0' + + * float32x2_t vext_f32 (float32x2_t, float32x2_t, const int) + _Form of expected instruction(s):_ 'vext.32 D0, D0, D0, #0' + + * poly16x4_t vext_p16 (poly16x4_t, poly16x4_t, const int) + _Form of expected instruction(s):_ 'vext.16 D0, D0, D0, #0' + + * poly8x8_t vext_p8 (poly8x8_t, poly8x8_t, const int) + _Form of expected instruction(s):_ 'vext.8 D0, D0, D0, #0' + + * poly64x2_t vextq_p64 (poly64x2_t, poly64x2_t, const int) + _Form of expected instruction(s):_ 'vext.64 Q0, Q0, Q0, #0' + + * uint32x4_t vextq_u32 (uint32x4_t, uint32x4_t, const int) + _Form of expected instruction(s):_ 'vext.32 Q0, Q0, Q0, #0' + + * uint16x8_t vextq_u16 (uint16x8_t, uint16x8_t, const int) + _Form of expected instruction(s):_ 'vext.16 Q0, Q0, Q0, #0' + + * uint8x16_t vextq_u8 (uint8x16_t, uint8x16_t, const int) + _Form of expected instruction(s):_ 'vext.8 Q0, Q0, Q0, #0' + + * int32x4_t vextq_s32 (int32x4_t, int32x4_t, const int) + _Form of expected instruction(s):_ 'vext.32 Q0, Q0, Q0, #0' + + * int16x8_t vextq_s16 (int16x8_t, int16x8_t, const int) + _Form of expected instruction(s):_ 'vext.16 Q0, Q0, Q0, #0' + + * int8x16_t vextq_s8 (int8x16_t, int8x16_t, const int) + _Form of expected instruction(s):_ 'vext.8 Q0, Q0, Q0, #0' + + * uint64x2_t vextq_u64 (uint64x2_t, uint64x2_t, const int) + _Form of expected instruction(s):_ 'vext.64 Q0, Q0, Q0, #0' + + * int64x2_t vextq_s64 (int64x2_t, int64x2_t, const int) + _Form of expected instruction(s):_ 'vext.64 Q0, Q0, Q0, #0' + + * float32x4_t vextq_f32 (float32x4_t, float32x4_t, const int) + _Form of expected instruction(s):_ 'vext.32 Q0, Q0, Q0, #0' + + * poly16x8_t vextq_p16 (poly16x8_t, poly16x8_t, const int) + _Form of expected instruction(s):_ 'vext.16 Q0, Q0, Q0, #0' + + * poly8x16_t vextq_p8 (poly8x16_t, poly8x16_t, const int) + _Form of expected instruction(s):_ 'vext.8 Q0, Q0, Q0, #0' + +6.57.6.70 Reverse elements +.......................... + + * uint32x2_t vrev64_u32 (uint32x2_t) + _Form of expected instruction(s):_ 'vrev64.32 D0, D0' + + * uint16x4_t vrev64_u16 (uint16x4_t) + _Form of expected instruction(s):_ 'vrev64.16 D0, D0' + + * uint8x8_t vrev64_u8 (uint8x8_t) + _Form of expected instruction(s):_ 'vrev64.8 D0, D0' + + * int32x2_t vrev64_s32 (int32x2_t) + _Form of expected instruction(s):_ 'vrev64.32 D0, D0' + + * int16x4_t vrev64_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vrev64.16 D0, D0' + + * int8x8_t vrev64_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vrev64.8 D0, D0' + + * float32x2_t vrev64_f32 (float32x2_t) + _Form of expected instruction(s):_ 'vrev64.32 D0, D0' + + * poly16x4_t vrev64_p16 (poly16x4_t) + _Form of expected instruction(s):_ 'vrev64.16 D0, D0' + + * poly8x8_t vrev64_p8 (poly8x8_t) + _Form of expected instruction(s):_ 'vrev64.8 D0, D0' + + * uint32x4_t vrev64q_u32 (uint32x4_t) + _Form of expected instruction(s):_ 'vrev64.32 Q0, Q0' + + * uint16x8_t vrev64q_u16 (uint16x8_t) + _Form of expected instruction(s):_ 'vrev64.16 Q0, Q0' + + * uint8x16_t vrev64q_u8 (uint8x16_t) + _Form of expected instruction(s):_ 'vrev64.8 Q0, Q0' + + * int32x4_t vrev64q_s32 (int32x4_t) + _Form of expected instruction(s):_ 'vrev64.32 Q0, Q0' + + * int16x8_t vrev64q_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vrev64.16 Q0, Q0' + + * int8x16_t vrev64q_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vrev64.8 Q0, Q0' + + * float32x4_t vrev64q_f32 (float32x4_t) + _Form of expected instruction(s):_ 'vrev64.32 Q0, Q0' + + * poly16x8_t vrev64q_p16 (poly16x8_t) + _Form of expected instruction(s):_ 'vrev64.16 Q0, Q0' + + * poly8x16_t vrev64q_p8 (poly8x16_t) + _Form of expected instruction(s):_ 'vrev64.8 Q0, Q0' + + * uint16x4_t vrev32_u16 (uint16x4_t) + _Form of expected instruction(s):_ 'vrev32.16 D0, D0' + + * int16x4_t vrev32_s16 (int16x4_t) + _Form of expected instruction(s):_ 'vrev32.16 D0, D0' + + * uint8x8_t vrev32_u8 (uint8x8_t) + _Form of expected instruction(s):_ 'vrev32.8 D0, D0' + + * int8x8_t vrev32_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vrev32.8 D0, D0' + + * poly16x4_t vrev32_p16 (poly16x4_t) + _Form of expected instruction(s):_ 'vrev32.16 D0, D0' + + * poly8x8_t vrev32_p8 (poly8x8_t) + _Form of expected instruction(s):_ 'vrev32.8 D0, D0' + + * uint16x8_t vrev32q_u16 (uint16x8_t) + _Form of expected instruction(s):_ 'vrev32.16 Q0, Q0' + + * int16x8_t vrev32q_s16 (int16x8_t) + _Form of expected instruction(s):_ 'vrev32.16 Q0, Q0' + + * uint8x16_t vrev32q_u8 (uint8x16_t) + _Form of expected instruction(s):_ 'vrev32.8 Q0, Q0' + + * int8x16_t vrev32q_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vrev32.8 Q0, Q0' + + * poly16x8_t vrev32q_p16 (poly16x8_t) + _Form of expected instruction(s):_ 'vrev32.16 Q0, Q0' + + * poly8x16_t vrev32q_p8 (poly8x16_t) + _Form of expected instruction(s):_ 'vrev32.8 Q0, Q0' + + * uint8x8_t vrev16_u8 (uint8x8_t) + _Form of expected instruction(s):_ 'vrev16.8 D0, D0' + + * int8x8_t vrev16_s8 (int8x8_t) + _Form of expected instruction(s):_ 'vrev16.8 D0, D0' + + * poly8x8_t vrev16_p8 (poly8x8_t) + _Form of expected instruction(s):_ 'vrev16.8 D0, D0' + + * uint8x16_t vrev16q_u8 (uint8x16_t) + _Form of expected instruction(s):_ 'vrev16.8 Q0, Q0' + + * int8x16_t vrev16q_s8 (int8x16_t) + _Form of expected instruction(s):_ 'vrev16.8 Q0, Q0' + + * poly8x16_t vrev16q_p8 (poly8x16_t) + _Form of expected instruction(s):_ 'vrev16.8 Q0, Q0' + +6.57.6.71 Bit selection +....................... + + * poly64x1_t vbsl_p64 (uint64x1_t, poly64x1_t, poly64x1_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * uint32x2_t vbsl_u32 (uint32x2_t, uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * uint16x4_t vbsl_u16 (uint16x4_t, uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * uint8x8_t vbsl_u8 (uint8x8_t, uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * int32x2_t vbsl_s32 (uint32x2_t, int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * int16x4_t vbsl_s16 (uint16x4_t, int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * int8x8_t vbsl_s8 (uint8x8_t, int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * uint64x1_t vbsl_u64 (uint64x1_t, uint64x1_t, uint64x1_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * int64x1_t vbsl_s64 (uint64x1_t, int64x1_t, int64x1_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * float32x2_t vbsl_f32 (uint32x2_t, float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * poly16x4_t vbsl_p16 (uint16x4_t, poly16x4_t, poly16x4_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * poly8x8_t vbsl_p8 (uint8x8_t, poly8x8_t, poly8x8_t) + _Form of expected instruction(s):_ 'vbsl D0, D0, D0' _or_ 'vbit D0, + D0, D0' _or_ 'vbif D0, D0, D0' + + * poly64x2_t vbslq_p64 (uint64x2_t, poly64x2_t, poly64x2_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * uint32x4_t vbslq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * uint16x8_t vbslq_u16 (uint16x8_t, uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * uint8x16_t vbslq_u8 (uint8x16_t, uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * int32x4_t vbslq_s32 (uint32x4_t, int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * int16x8_t vbslq_s16 (uint16x8_t, int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * int8x16_t vbslq_s8 (uint8x16_t, int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * uint64x2_t vbslq_u64 (uint64x2_t, uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * int64x2_t vbslq_s64 (uint64x2_t, int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * float32x4_t vbslq_f32 (uint32x4_t, float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * poly16x8_t vbslq_p16 (uint16x8_t, poly16x8_t, poly16x8_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + + * poly8x16_t vbslq_p8 (uint8x16_t, poly8x16_t, poly8x16_t) + _Form of expected instruction(s):_ 'vbsl Q0, Q0, Q0' _or_ 'vbit Q0, + Q0, Q0' _or_ 'vbif Q0, Q0, Q0' + +6.57.6.72 Transpose elements +............................ + + * uint16x4x2_t vtrn_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vtrn.16 D0, D1' + + * uint8x8x2_t vtrn_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vtrn.8 D0, D1' + + * int16x4x2_t vtrn_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vtrn.16 D0, D1' + + * int8x8x2_t vtrn_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vtrn.8 D0, D1' + + * poly16x4x2_t vtrn_p16 (poly16x4_t, poly16x4_t) + _Form of expected instruction(s):_ 'vtrn.16 D0, D1' + + * poly8x8x2_t vtrn_p8 (poly8x8_t, poly8x8_t) + _Form of expected instruction(s):_ 'vtrn.8 D0, D1' + + * float32x2x2_t vtrn_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * uint32x2x2_t vtrn_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * int32x2x2_t vtrn_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * uint32x4x2_t vtrnq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vtrn.32 Q0, Q1' + + * uint16x8x2_t vtrnq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vtrn.16 Q0, Q1' + + * uint8x16x2_t vtrnq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vtrn.8 Q0, Q1' + + * int32x4x2_t vtrnq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vtrn.32 Q0, Q1' + + * int16x8x2_t vtrnq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vtrn.16 Q0, Q1' + + * int8x16x2_t vtrnq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vtrn.8 Q0, Q1' + + * float32x4x2_t vtrnq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vtrn.32 Q0, Q1' + + * poly16x8x2_t vtrnq_p16 (poly16x8_t, poly16x8_t) + _Form of expected instruction(s):_ 'vtrn.16 Q0, Q1' + + * poly8x16x2_t vtrnq_p8 (poly8x16_t, poly8x16_t) + _Form of expected instruction(s):_ 'vtrn.8 Q0, Q1' + +6.57.6.73 Zip elements +...................... + + * uint16x4x2_t vzip_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vzip.16 D0, D1' + + * uint8x8x2_t vzip_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vzip.8 D0, D1' + + * int16x4x2_t vzip_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vzip.16 D0, D1' + + * int8x8x2_t vzip_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vzip.8 D0, D1' + + * poly16x4x2_t vzip_p16 (poly16x4_t, poly16x4_t) + _Form of expected instruction(s):_ 'vzip.16 D0, D1' + + * poly8x8x2_t vzip_p8 (poly8x8_t, poly8x8_t) + _Form of expected instruction(s):_ 'vzip.8 D0, D1' + + * float32x2x2_t vzip_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * uint32x2x2_t vzip_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * int32x2x2_t vzip_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * uint32x4x2_t vzipq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vzip.32 Q0, Q1' + + * uint16x8x2_t vzipq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vzip.16 Q0, Q1' + + * uint8x16x2_t vzipq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vzip.8 Q0, Q1' + + * int32x4x2_t vzipq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vzip.32 Q0, Q1' + + * int16x8x2_t vzipq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vzip.16 Q0, Q1' + + * int8x16x2_t vzipq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vzip.8 Q0, Q1' + + * float32x4x2_t vzipq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vzip.32 Q0, Q1' + + * poly16x8x2_t vzipq_p16 (poly16x8_t, poly16x8_t) + _Form of expected instruction(s):_ 'vzip.16 Q0, Q1' + + * poly8x16x2_t vzipq_p8 (poly8x16_t, poly8x16_t) + _Form of expected instruction(s):_ 'vzip.8 Q0, Q1' + +6.57.6.74 Unzip elements +........................ + + * uint32x2x2_t vuzp_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * uint16x4x2_t vuzp_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vuzp.16 D0, D1' + + * uint8x8x2_t vuzp_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vuzp.8 D0, D1' + + * int32x2x2_t vuzp_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * int16x4x2_t vuzp_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vuzp.16 D0, D1' + + * int8x8x2_t vuzp_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vuzp.8 D0, D1' + + * float32x2x2_t vuzp_f32 (float32x2_t, float32x2_t) + _Form of expected instruction(s):_ 'vuzp.32 D0, D1' + + * poly16x4x2_t vuzp_p16 (poly16x4_t, poly16x4_t) + _Form of expected instruction(s):_ 'vuzp.16 D0, D1' + + * poly8x8x2_t vuzp_p8 (poly8x8_t, poly8x8_t) + _Form of expected instruction(s):_ 'vuzp.8 D0, D1' + + * uint32x4x2_t vuzpq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vuzp.32 Q0, Q1' + + * uint16x8x2_t vuzpq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vuzp.16 Q0, Q1' + + * uint8x16x2_t vuzpq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vuzp.8 Q0, Q1' + + * int32x4x2_t vuzpq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vuzp.32 Q0, Q1' + + * int16x8x2_t vuzpq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vuzp.16 Q0, Q1' + + * int8x16x2_t vuzpq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vuzp.8 Q0, Q1' + + * float32x4x2_t vuzpq_f32 (float32x4_t, float32x4_t) + _Form of expected instruction(s):_ 'vuzp.32 Q0, Q1' + + * poly16x8x2_t vuzpq_p16 (poly16x8_t, poly16x8_t) + _Form of expected instruction(s):_ 'vuzp.16 Q0, Q1' + + * poly8x16x2_t vuzpq_p8 (poly8x16_t, poly8x16_t) + _Form of expected instruction(s):_ 'vuzp.8 Q0, Q1' + +6.57.6.75 Element/structure loads, VLD1 variants +................................................ + + * poly64x1_t vld1_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * uint32x2_t vld1_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0}, [R0]' + + * uint16x4_t vld1_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0}, [R0]' + + * uint8x8_t vld1_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0}, [R0]' + + * int32x2_t vld1_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0}, [R0]' + + * int16x4_t vld1_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0}, [R0]' + + * int8x8_t vld1_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0}, [R0]' + + * uint64x1_t vld1_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * int64x1_t vld1_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * float32x2_t vld1_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0}, [R0]' + + * poly16x4_t vld1_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0}, [R0]' + + * poly8x8_t vld1_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0}, [R0]' + + * poly64x2_t vld1q_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + + * uint32x4_t vld1q_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0, D1}, [R0]' + + * uint16x8_t vld1q_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0, D1}, [R0]' + + * uint8x16_t vld1q_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0, D1}, [R0]' + + * int32x4_t vld1q_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0, D1}, [R0]' + + * int16x8_t vld1q_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0, D1}, [R0]' + + * int8x16_t vld1q_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0, D1}, [R0]' + + * uint64x2_t vld1q_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + + * int64x2_t vld1q_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + + * float32x4_t vld1q_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0, D1}, [R0]' + + * poly16x8_t vld1q_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0, D1}, [R0]' + + * poly8x16_t vld1q_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0, D1}, [R0]' + + * uint32x2_t vld1_lane_u32 (const uint32_t *, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vld1.32 {D0[0]}, [R0]' + + * uint16x4_t vld1_lane_u16 (const uint16_t *, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vld1.16 {D0[0]}, [R0]' + + * uint8x8_t vld1_lane_u8 (const uint8_t *, uint8x8_t, const int) + _Form of expected instruction(s):_ 'vld1.8 {D0[0]}, [R0]' + + * int32x2_t vld1_lane_s32 (const int32_t *, int32x2_t, const int) + _Form of expected instruction(s):_ 'vld1.32 {D0[0]}, [R0]' + + * int16x4_t vld1_lane_s16 (const int16_t *, int16x4_t, const int) + _Form of expected instruction(s):_ 'vld1.16 {D0[0]}, [R0]' + + * int8x8_t vld1_lane_s8 (const int8_t *, int8x8_t, const int) + _Form of expected instruction(s):_ 'vld1.8 {D0[0]}, [R0]' + + * float32x2_t vld1_lane_f32 (const float32_t *, float32x2_t, const + int) + _Form of expected instruction(s):_ 'vld1.32 {D0[0]}, [R0]' + + * poly16x4_t vld1_lane_p16 (const poly16_t *, poly16x4_t, const int) + _Form of expected instruction(s):_ 'vld1.16 {D0[0]}, [R0]' + + * poly8x8_t vld1_lane_p8 (const poly8_t *, poly8x8_t, const int) + _Form of expected instruction(s):_ 'vld1.8 {D0[0]}, [R0]' + + * poly64x1_t vld1_lane_p64 (const poly64_t *, poly64x1_t, const int) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * uint64x1_t vld1_lane_u64 (const uint64_t *, uint64x1_t, const int) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * int64x1_t vld1_lane_s64 (const int64_t *, int64x1_t, const int) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * uint32x4_t vld1q_lane_u32 (const uint32_t *, uint32x4_t, const int) + + _Form of expected instruction(s):_ 'vld1.32 {D0[0]}, [R0]' + + * uint16x8_t vld1q_lane_u16 (const uint16_t *, uint16x8_t, const int) + + _Form of expected instruction(s):_ 'vld1.16 {D0[0]}, [R0]' + + * uint8x16_t vld1q_lane_u8 (const uint8_t *, uint8x16_t, const int) + _Form of expected instruction(s):_ 'vld1.8 {D0[0]}, [R0]' + + * int32x4_t vld1q_lane_s32 (const int32_t *, int32x4_t, const int) + _Form of expected instruction(s):_ 'vld1.32 {D0[0]}, [R0]' + + * int16x8_t vld1q_lane_s16 (const int16_t *, int16x8_t, const int) + _Form of expected instruction(s):_ 'vld1.16 {D0[0]}, [R0]' + + * int8x16_t vld1q_lane_s8 (const int8_t *, int8x16_t, const int) + _Form of expected instruction(s):_ 'vld1.8 {D0[0]}, [R0]' + + * float32x4_t vld1q_lane_f32 (const float32_t *, float32x4_t, const + int) + _Form of expected instruction(s):_ 'vld1.32 {D0[0]}, [R0]' + + * poly16x8_t vld1q_lane_p16 (const poly16_t *, poly16x8_t, const int) + + _Form of expected instruction(s):_ 'vld1.16 {D0[0]}, [R0]' + + * poly8x16_t vld1q_lane_p8 (const poly8_t *, poly8x16_t, const int) + _Form of expected instruction(s):_ 'vld1.8 {D0[0]}, [R0]' + + * poly64x2_t vld1q_lane_p64 (const poly64_t *, poly64x2_t, const int) + + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * uint64x2_t vld1q_lane_u64 (const uint64_t *, uint64x2_t, const int) + + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * int64x2_t vld1q_lane_s64 (const int64_t *, int64x2_t, const int) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * uint32x2_t vld1_dup_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0[]}, [R0]' + + * uint16x4_t vld1_dup_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0[]}, [R0]' + + * uint8x8_t vld1_dup_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0[]}, [R0]' + + * int32x2_t vld1_dup_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0[]}, [R0]' + + * int16x4_t vld1_dup_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0[]}, [R0]' + + * int8x8_t vld1_dup_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0[]}, [R0]' + + * float32x2_t vld1_dup_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0[]}, [R0]' + + * poly16x4_t vld1_dup_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0[]}, [R0]' + + * poly8x8_t vld1_dup_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0[]}, [R0]' + + * poly64x1_t vld1_dup_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * uint64x1_t vld1_dup_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * int64x1_t vld1_dup_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * uint32x4_t vld1q_dup_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0[], D1[]}, [R0]' + + * uint16x8_t vld1q_dup_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0[], D1[]}, [R0]' + + * uint8x16_t vld1q_dup_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0[], D1[]}, [R0]' + + * int32x4_t vld1q_dup_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0[], D1[]}, [R0]' + + * int16x8_t vld1q_dup_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0[], D1[]}, [R0]' + + * int8x16_t vld1q_dup_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0[], D1[]}, [R0]' + + * float32x4_t vld1q_dup_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld1.32 {D0[], D1[]}, [R0]' + + * poly16x8_t vld1q_dup_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld1.16 {D0[], D1[]}, [R0]' + + * poly8x16_t vld1q_dup_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld1.8 {D0[], D1[]}, [R0]' + + * poly64x2_t vld1q_dup_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * uint64x2_t vld1q_dup_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + + * int64x2_t vld1q_dup_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0}, [R0]' + +6.57.6.76 Element/structure stores, VST1 variants +................................................. + + * void vst1_p64 (poly64_t *, poly64x1_t) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + + * void vst1_u32 (uint32_t *, uint32x2_t) + _Form of expected instruction(s):_ 'vst1.32 {D0}, [R0]' + + * void vst1_u16 (uint16_t *, uint16x4_t) + _Form of expected instruction(s):_ 'vst1.16 {D0}, [R0]' + + * void vst1_u8 (uint8_t *, uint8x8_t) + _Form of expected instruction(s):_ 'vst1.8 {D0}, [R0]' + + * void vst1_s32 (int32_t *, int32x2_t) + _Form of expected instruction(s):_ 'vst1.32 {D0}, [R0]' + + * void vst1_s16 (int16_t *, int16x4_t) + _Form of expected instruction(s):_ 'vst1.16 {D0}, [R0]' + + * void vst1_s8 (int8_t *, int8x8_t) + _Form of expected instruction(s):_ 'vst1.8 {D0}, [R0]' + + * void vst1_u64 (uint64_t *, uint64x1_t) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + + * void vst1_s64 (int64_t *, int64x1_t) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + + * void vst1_f32 (float32_t *, float32x2_t) + _Form of expected instruction(s):_ 'vst1.32 {D0}, [R0]' + + * void vst1_p16 (poly16_t *, poly16x4_t) + _Form of expected instruction(s):_ 'vst1.16 {D0}, [R0]' + + * void vst1_p8 (poly8_t *, poly8x8_t) + _Form of expected instruction(s):_ 'vst1.8 {D0}, [R0]' + + * void vst1q_p64 (poly64_t *, poly64x2_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1}, [R0]' + + * void vst1q_u32 (uint32_t *, uint32x4_t) + _Form of expected instruction(s):_ 'vst1.32 {D0, D1}, [R0]' + + * void vst1q_u16 (uint16_t *, uint16x8_t) + _Form of expected instruction(s):_ 'vst1.16 {D0, D1}, [R0]' + + * void vst1q_u8 (uint8_t *, uint8x16_t) + _Form of expected instruction(s):_ 'vst1.8 {D0, D1}, [R0]' + + * void vst1q_s32 (int32_t *, int32x4_t) + _Form of expected instruction(s):_ 'vst1.32 {D0, D1}, [R0]' + + * void vst1q_s16 (int16_t *, int16x8_t) + _Form of expected instruction(s):_ 'vst1.16 {D0, D1}, [R0]' + + * void vst1q_s8 (int8_t *, int8x16_t) + _Form of expected instruction(s):_ 'vst1.8 {D0, D1}, [R0]' + + * void vst1q_u64 (uint64_t *, uint64x2_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1}, [R0]' + + * void vst1q_s64 (int64_t *, int64x2_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1}, [R0]' + + * void vst1q_f32 (float32_t *, float32x4_t) + _Form of expected instruction(s):_ 'vst1.32 {D0, D1}, [R0]' + + * void vst1q_p16 (poly16_t *, poly16x8_t) + _Form of expected instruction(s):_ 'vst1.16 {D0, D1}, [R0]' + + * void vst1q_p8 (poly8_t *, poly8x16_t) + _Form of expected instruction(s):_ 'vst1.8 {D0, D1}, [R0]' + + * void vst1_lane_u32 (uint32_t *, uint32x2_t, const int) + _Form of expected instruction(s):_ 'vst1.32 {D0[0]}, [R0]' + + * void vst1_lane_u16 (uint16_t *, uint16x4_t, const int) + _Form of expected instruction(s):_ 'vst1.16 {D0[0]}, [R0]' + + * void vst1_lane_u8 (uint8_t *, uint8x8_t, const int) + _Form of expected instruction(s):_ 'vst1.8 {D0[0]}, [R0]' + + * void vst1_lane_s32 (int32_t *, int32x2_t, const int) + _Form of expected instruction(s):_ 'vst1.32 {D0[0]}, [R0]' + + * void vst1_lane_s16 (int16_t *, int16x4_t, const int) + _Form of expected instruction(s):_ 'vst1.16 {D0[0]}, [R0]' + + * void vst1_lane_s8 (int8_t *, int8x8_t, const int) + _Form of expected instruction(s):_ 'vst1.8 {D0[0]}, [R0]' + + * void vst1_lane_f32 (float32_t *, float32x2_t, const int) + _Form of expected instruction(s):_ 'vst1.32 {D0[0]}, [R0]' + + * void vst1_lane_p16 (poly16_t *, poly16x4_t, const int) + _Form of expected instruction(s):_ 'vst1.16 {D0[0]}, [R0]' + + * void vst1_lane_p8 (poly8_t *, poly8x8_t, const int) + _Form of expected instruction(s):_ 'vst1.8 {D0[0]}, [R0]' + + * void vst1_lane_p64 (poly64_t *, poly64x1_t, const int) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + + * void vst1_lane_s64 (int64_t *, int64x1_t, const int) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + + * void vst1_lane_u64 (uint64_t *, uint64x1_t, const int) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + + * void vst1q_lane_u32 (uint32_t *, uint32x4_t, const int) + _Form of expected instruction(s):_ 'vst1.32 {D0[0]}, [R0]' + + * void vst1q_lane_u16 (uint16_t *, uint16x8_t, const int) + _Form of expected instruction(s):_ 'vst1.16 {D0[0]}, [R0]' + + * void vst1q_lane_u8 (uint8_t *, uint8x16_t, const int) + _Form of expected instruction(s):_ 'vst1.8 {D0[0]}, [R0]' + + * void vst1q_lane_s32 (int32_t *, int32x4_t, const int) + _Form of expected instruction(s):_ 'vst1.32 {D0[0]}, [R0]' + + * void vst1q_lane_s16 (int16_t *, int16x8_t, const int) + _Form of expected instruction(s):_ 'vst1.16 {D0[0]}, [R0]' + + * void vst1q_lane_s8 (int8_t *, int8x16_t, const int) + _Form of expected instruction(s):_ 'vst1.8 {D0[0]}, [R0]' + + * void vst1q_lane_f32 (float32_t *, float32x4_t, const int) + _Form of expected instruction(s):_ 'vst1.32 {D0[0]}, [R0]' + + * void vst1q_lane_p16 (poly16_t *, poly16x8_t, const int) + _Form of expected instruction(s):_ 'vst1.16 {D0[0]}, [R0]' + + * void vst1q_lane_p8 (poly8_t *, poly8x16_t, const int) + _Form of expected instruction(s):_ 'vst1.8 {D0[0]}, [R0]' + + * void vst1q_lane_p64 (poly64_t *, poly64x2_t, const int) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + + * void vst1q_lane_s64 (int64_t *, int64x2_t, const int) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + + * void vst1q_lane_u64 (uint64_t *, uint64x2_t, const int) + _Form of expected instruction(s):_ 'vst1.64 {D0}, [R0]' + +6.57.6.77 Element/structure loads, VLD2 variants +................................................ + + * uint32x2x2_t vld2_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0, D1}, [R0]' + + * uint16x4x2_t vld2_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0, D1}, [R0]' + + * uint8x8x2_t vld2_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0, D1}, [R0]' + + * int32x2x2_t vld2_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0, D1}, [R0]' + + * int16x4x2_t vld2_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0, D1}, [R0]' + + * int8x8x2_t vld2_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0, D1}, [R0]' + + * float32x2x2_t vld2_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0, D1}, [R0]' + + * poly16x4x2_t vld2_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0, D1}, [R0]' + + * poly8x8x2_t vld2_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0, D1}, [R0]' + + * poly64x1x2_t vld2_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + + * uint64x1x2_t vld2_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + + * int64x1x2_t vld2_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + + * uint32x4x2_t vld2q_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0, D1}, [R0]' + + * uint16x8x2_t vld2q_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0, D1}, [R0]' + + * uint8x16x2_t vld2q_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0, D1}, [R0]' + + * int32x4x2_t vld2q_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0, D1}, [R0]' + + * int16x8x2_t vld2q_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0, D1}, [R0]' + + * int8x16x2_t vld2q_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0, D1}, [R0]' + + * float32x4x2_t vld2q_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0, D1}, [R0]' + + * poly16x8x2_t vld2q_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0, D1}, [R0]' + + * poly8x16x2_t vld2q_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0, D1}, [R0]' + + * uint32x2x2_t vld2_lane_u32 (const uint32_t *, uint32x2x2_t, const + int) + _Form of expected instruction(s):_ 'vld2.32 {D0[0], D1[0]}, [R0]' + + * uint16x4x2_t vld2_lane_u16 (const uint16_t *, uint16x4x2_t, const + int) + _Form of expected instruction(s):_ 'vld2.16 {D0[0], D1[0]}, [R0]' + + * uint8x8x2_t vld2_lane_u8 (const uint8_t *, uint8x8x2_t, const int) + _Form of expected instruction(s):_ 'vld2.8 {D0[0], D1[0]}, [R0]' + + * int32x2x2_t vld2_lane_s32 (const int32_t *, int32x2x2_t, const int) + + _Form of expected instruction(s):_ 'vld2.32 {D0[0], D1[0]}, [R0]' + + * int16x4x2_t vld2_lane_s16 (const int16_t *, int16x4x2_t, const int) + + _Form of expected instruction(s):_ 'vld2.16 {D0[0], D1[0]}, [R0]' + + * int8x8x2_t vld2_lane_s8 (const int8_t *, int8x8x2_t, const int) + _Form of expected instruction(s):_ 'vld2.8 {D0[0], D1[0]}, [R0]' + + * float32x2x2_t vld2_lane_f32 (const float32_t *, float32x2x2_t, + const int) + _Form of expected instruction(s):_ 'vld2.32 {D0[0], D1[0]}, [R0]' + + * poly16x4x2_t vld2_lane_p16 (const poly16_t *, poly16x4x2_t, const + int) + _Form of expected instruction(s):_ 'vld2.16 {D0[0], D1[0]}, [R0]' + + * poly8x8x2_t vld2_lane_p8 (const poly8_t *, poly8x8x2_t, const int) + _Form of expected instruction(s):_ 'vld2.8 {D0[0], D1[0]}, [R0]' + + * int32x4x2_t vld2q_lane_s32 (const int32_t *, int32x4x2_t, const + int) + _Form of expected instruction(s):_ 'vld2.32 {D0[0], D1[0]}, [R0]' + + * int16x8x2_t vld2q_lane_s16 (const int16_t *, int16x8x2_t, const + int) + _Form of expected instruction(s):_ 'vld2.16 {D0[0], D1[0]}, [R0]' + + * uint32x4x2_t vld2q_lane_u32 (const uint32_t *, uint32x4x2_t, const + int) + _Form of expected instruction(s):_ 'vld2.32 {D0[0], D1[0]}, [R0]' + + * uint16x8x2_t vld2q_lane_u16 (const uint16_t *, uint16x8x2_t, const + int) + _Form of expected instruction(s):_ 'vld2.16 {D0[0], D1[0]}, [R0]' + + * float32x4x2_t vld2q_lane_f32 (const float32_t *, float32x4x2_t, + const int) + _Form of expected instruction(s):_ 'vld2.32 {D0[0], D1[0]}, [R0]' + + * poly16x8x2_t vld2q_lane_p16 (const poly16_t *, poly16x8x2_t, const + int) + _Form of expected instruction(s):_ 'vld2.16 {D0[0], D1[0]}, [R0]' + + * uint32x2x2_t vld2_dup_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0[], D1[]}, [R0]' + + * uint16x4x2_t vld2_dup_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0[], D1[]}, [R0]' + + * uint8x8x2_t vld2_dup_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0[], D1[]}, [R0]' + + * int32x2x2_t vld2_dup_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0[], D1[]}, [R0]' + + * int16x4x2_t vld2_dup_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0[], D1[]}, [R0]' + + * int8x8x2_t vld2_dup_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0[], D1[]}, [R0]' + + * float32x2x2_t vld2_dup_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld2.32 {D0[], D1[]}, [R0]' + + * poly16x4x2_t vld2_dup_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld2.16 {D0[], D1[]}, [R0]' + + * poly8x8x2_t vld2_dup_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld2.8 {D0[], D1[]}, [R0]' + + * poly64x1x2_t vld2_dup_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + + * uint64x1x2_t vld2_dup_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + + * int64x1x2_t vld2_dup_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1}, [R0]' + +6.57.6.78 Element/structure stores, VST2 variants +................................................. + + * void vst2_u32 (uint32_t *, uint32x2x2_t) + _Form of expected instruction(s):_ 'vst2.32 {D0, D1}, [R0]' + + * void vst2_u16 (uint16_t *, uint16x4x2_t) + _Form of expected instruction(s):_ 'vst2.16 {D0, D1}, [R0]' + + * void vst2_u8 (uint8_t *, uint8x8x2_t) + _Form of expected instruction(s):_ 'vst2.8 {D0, D1}, [R0]' + + * void vst2_s32 (int32_t *, int32x2x2_t) + _Form of expected instruction(s):_ 'vst2.32 {D0, D1}, [R0]' + + * void vst2_s16 (int16_t *, int16x4x2_t) + _Form of expected instruction(s):_ 'vst2.16 {D0, D1}, [R0]' + + * void vst2_s8 (int8_t *, int8x8x2_t) + _Form of expected instruction(s):_ 'vst2.8 {D0, D1}, [R0]' + + * void vst2_f32 (float32_t *, float32x2x2_t) + _Form of expected instruction(s):_ 'vst2.32 {D0, D1}, [R0]' + + * void vst2_p16 (poly16_t *, poly16x4x2_t) + _Form of expected instruction(s):_ 'vst2.16 {D0, D1}, [R0]' + + * void vst2_p8 (poly8_t *, poly8x8x2_t) + _Form of expected instruction(s):_ 'vst2.8 {D0, D1}, [R0]' + + * void vst2_p64 (poly64_t *, poly64x1x2_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1}, [R0]' + + * void vst2_u64 (uint64_t *, uint64x1x2_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1}, [R0]' + + * void vst2_s64 (int64_t *, int64x1x2_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1}, [R0]' + + * void vst2q_u32 (uint32_t *, uint32x4x2_t) + _Form of expected instruction(s):_ 'vst2.32 {D0, D1}, [R0]' + + * void vst2q_u16 (uint16_t *, uint16x8x2_t) + _Form of expected instruction(s):_ 'vst2.16 {D0, D1}, [R0]' + + * void vst2q_u8 (uint8_t *, uint8x16x2_t) + _Form of expected instruction(s):_ 'vst2.8 {D0, D1}, [R0]' + + * void vst2q_s32 (int32_t *, int32x4x2_t) + _Form of expected instruction(s):_ 'vst2.32 {D0, D1}, [R0]' + + * void vst2q_s16 (int16_t *, int16x8x2_t) + _Form of expected instruction(s):_ 'vst2.16 {D0, D1}, [R0]' + + * void vst2q_s8 (int8_t *, int8x16x2_t) + _Form of expected instruction(s):_ 'vst2.8 {D0, D1}, [R0]' + + * void vst2q_f32 (float32_t *, float32x4x2_t) + _Form of expected instruction(s):_ 'vst2.32 {D0, D1}, [R0]' + + * void vst2q_p16 (poly16_t *, poly16x8x2_t) + _Form of expected instruction(s):_ 'vst2.16 {D0, D1}, [R0]' + + * void vst2q_p8 (poly8_t *, poly8x16x2_t) + _Form of expected instruction(s):_ 'vst2.8 {D0, D1}, [R0]' + + * void vst2_lane_u32 (uint32_t *, uint32x2x2_t, const int) + _Form of expected instruction(s):_ 'vst2.32 {D0[0], D1[0]}, [R0]' + + * void vst2_lane_u16 (uint16_t *, uint16x4x2_t, const int) + _Form of expected instruction(s):_ 'vst2.16 {D0[0], D1[0]}, [R0]' + + * void vst2_lane_u8 (uint8_t *, uint8x8x2_t, const int) + _Form of expected instruction(s):_ 'vst2.8 {D0[0], D1[0]}, [R0]' + + * void vst2_lane_s32 (int32_t *, int32x2x2_t, const int) + _Form of expected instruction(s):_ 'vst2.32 {D0[0], D1[0]}, [R0]' + + * void vst2_lane_s16 (int16_t *, int16x4x2_t, const int) + _Form of expected instruction(s):_ 'vst2.16 {D0[0], D1[0]}, [R0]' + + * void vst2_lane_s8 (int8_t *, int8x8x2_t, const int) + _Form of expected instruction(s):_ 'vst2.8 {D0[0], D1[0]}, [R0]' + + * void vst2_lane_f32 (float32_t *, float32x2x2_t, const int) + _Form of expected instruction(s):_ 'vst2.32 {D0[0], D1[0]}, [R0]' + + * void vst2_lane_p16 (poly16_t *, poly16x4x2_t, const int) + _Form of expected instruction(s):_ 'vst2.16 {D0[0], D1[0]}, [R0]' + + * void vst2_lane_p8 (poly8_t *, poly8x8x2_t, const int) + _Form of expected instruction(s):_ 'vst2.8 {D0[0], D1[0]}, [R0]' + + * void vst2q_lane_s32 (int32_t *, int32x4x2_t, const int) + _Form of expected instruction(s):_ 'vst2.32 {D0[0], D1[0]}, [R0]' + + * void vst2q_lane_s16 (int16_t *, int16x8x2_t, const int) + _Form of expected instruction(s):_ 'vst2.16 {D0[0], D1[0]}, [R0]' + + * void vst2q_lane_u32 (uint32_t *, uint32x4x2_t, const int) + _Form of expected instruction(s):_ 'vst2.32 {D0[0], D1[0]}, [R0]' + + * void vst2q_lane_u16 (uint16_t *, uint16x8x2_t, const int) + _Form of expected instruction(s):_ 'vst2.16 {D0[0], D1[0]}, [R0]' + + * void vst2q_lane_f32 (float32_t *, float32x4x2_t, const int) + _Form of expected instruction(s):_ 'vst2.32 {D0[0], D1[0]}, [R0]' + + * void vst2q_lane_p16 (poly16_t *, poly16x8x2_t, const int) + _Form of expected instruction(s):_ 'vst2.16 {D0[0], D1[0]}, [R0]' + +6.57.6.79 Element/structure loads, VLD3 variants +................................................ + + * uint32x2x3_t vld3_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0, D1, D2}, [R0]' + + * uint16x4x3_t vld3_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0, D1, D2}, [R0]' + + * uint8x8x3_t vld3_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0, D1, D2}, [R0]' + + * int32x2x3_t vld3_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0, D1, D2}, [R0]' + + * int16x4x3_t vld3_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0, D1, D2}, [R0]' + + * int8x8x3_t vld3_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0, D1, D2}, [R0]' + + * float32x2x3_t vld3_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0, D1, D2}, [R0]' + + * poly16x4x3_t vld3_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0, D1, D2}, [R0]' + + * poly8x8x3_t vld3_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0, D1, D2}, [R0]' + + * poly64x1x3_t vld3_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2}, [R0]' + + * uint64x1x3_t vld3_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2}, [R0]' + + * int64x1x3_t vld3_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2}, [R0]' + + * uint32x4x3_t vld3q_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0, D1, D2}, [R0]' + + * uint16x8x3_t vld3q_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0, D1, D2}, [R0]' + + * uint8x16x3_t vld3q_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0, D1, D2}, [R0]' + + * int32x4x3_t vld3q_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0, D1, D2}, [R0]' + + * int16x8x3_t vld3q_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0, D1, D2}, [R0]' + + * int8x16x3_t vld3q_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0, D1, D2}, [R0]' + + * float32x4x3_t vld3q_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0, D1, D2}, [R0]' + + * poly16x8x3_t vld3q_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0, D1, D2}, [R0]' + + * poly8x16x3_t vld3q_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0, D1, D2}, [R0]' + + * uint32x2x3_t vld3_lane_u32 (const uint32_t *, uint32x2x3_t, const + int) + _Form of expected instruction(s):_ 'vld3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * uint16x4x3_t vld3_lane_u16 (const uint16_t *, uint16x4x3_t, const + int) + _Form of expected instruction(s):_ 'vld3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * uint8x8x3_t vld3_lane_u8 (const uint8_t *, uint8x8x3_t, const int) + _Form of expected instruction(s):_ 'vld3.8 {D0[0], D1[0], D2[0]}, + [R0]' + + * int32x2x3_t vld3_lane_s32 (const int32_t *, int32x2x3_t, const int) + + _Form of expected instruction(s):_ 'vld3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * int16x4x3_t vld3_lane_s16 (const int16_t *, int16x4x3_t, const int) + + _Form of expected instruction(s):_ 'vld3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * int8x8x3_t vld3_lane_s8 (const int8_t *, int8x8x3_t, const int) + _Form of expected instruction(s):_ 'vld3.8 {D0[0], D1[0], D2[0]}, + [R0]' + + * float32x2x3_t vld3_lane_f32 (const float32_t *, float32x2x3_t, + const int) + _Form of expected instruction(s):_ 'vld3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * poly16x4x3_t vld3_lane_p16 (const poly16_t *, poly16x4x3_t, const + int) + _Form of expected instruction(s):_ 'vld3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * poly8x8x3_t vld3_lane_p8 (const poly8_t *, poly8x8x3_t, const int) + _Form of expected instruction(s):_ 'vld3.8 {D0[0], D1[0], D2[0]}, + [R0]' + + * int32x4x3_t vld3q_lane_s32 (const int32_t *, int32x4x3_t, const + int) + _Form of expected instruction(s):_ 'vld3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * int16x8x3_t vld3q_lane_s16 (const int16_t *, int16x8x3_t, const + int) + _Form of expected instruction(s):_ 'vld3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * uint32x4x3_t vld3q_lane_u32 (const uint32_t *, uint32x4x3_t, const + int) + _Form of expected instruction(s):_ 'vld3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * uint16x8x3_t vld3q_lane_u16 (const uint16_t *, uint16x8x3_t, const + int) + _Form of expected instruction(s):_ 'vld3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * float32x4x3_t vld3q_lane_f32 (const float32_t *, float32x4x3_t, + const int) + _Form of expected instruction(s):_ 'vld3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * poly16x8x3_t vld3q_lane_p16 (const poly16_t *, poly16x8x3_t, const + int) + _Form of expected instruction(s):_ 'vld3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * uint32x2x3_t vld3_dup_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0[], D1[], D2[]}, + [R0]' + + * uint16x4x3_t vld3_dup_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0[], D1[], D2[]}, + [R0]' + + * uint8x8x3_t vld3_dup_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0[], D1[], D2[]}, + [R0]' + + * int32x2x3_t vld3_dup_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0[], D1[], D2[]}, + [R0]' + + * int16x4x3_t vld3_dup_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0[], D1[], D2[]}, + [R0]' + + * int8x8x3_t vld3_dup_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0[], D1[], D2[]}, + [R0]' + + * float32x2x3_t vld3_dup_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld3.32 {D0[], D1[], D2[]}, + [R0]' + + * poly16x4x3_t vld3_dup_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld3.16 {D0[], D1[], D2[]}, + [R0]' + + * poly8x8x3_t vld3_dup_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld3.8 {D0[], D1[], D2[]}, + [R0]' + + * poly64x1x3_t vld3_dup_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2}, [R0]' + + * uint64x1x3_t vld3_dup_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2}, [R0]' + + * int64x1x3_t vld3_dup_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2}, [R0]' + +6.57.6.80 Element/structure stores, VST3 variants +................................................. + + * void vst3_u32 (uint32_t *, uint32x2x3_t) + _Form of expected instruction(s):_ 'vst3.32 {D0, D1, D2, D3}, [R0]' + + * void vst3_u16 (uint16_t *, uint16x4x3_t) + _Form of expected instruction(s):_ 'vst3.16 {D0, D1, D2, D3}, [R0]' + + * void vst3_u8 (uint8_t *, uint8x8x3_t) + _Form of expected instruction(s):_ 'vst3.8 {D0, D1, D2, D3}, [R0]' + + * void vst3_s32 (int32_t *, int32x2x3_t) + _Form of expected instruction(s):_ 'vst3.32 {D0, D1, D2, D3}, [R0]' + + * void vst3_s16 (int16_t *, int16x4x3_t) + _Form of expected instruction(s):_ 'vst3.16 {D0, D1, D2, D3}, [R0]' + + * void vst3_s8 (int8_t *, int8x8x3_t) + _Form of expected instruction(s):_ 'vst3.8 {D0, D1, D2, D3}, [R0]' + + * void vst3_f32 (float32_t *, float32x2x3_t) + _Form of expected instruction(s):_ 'vst3.32 {D0, D1, D2, D3}, [R0]' + + * void vst3_p16 (poly16_t *, poly16x4x3_t) + _Form of expected instruction(s):_ 'vst3.16 {D0, D1, D2, D3}, [R0]' + + * void vst3_p8 (poly8_t *, poly8x8x3_t) + _Form of expected instruction(s):_ 'vst3.8 {D0, D1, D2, D3}, [R0]' + + * void vst3_p64 (poly64_t *, poly64x1x3_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1, D2, D3}, [R0]' + + * void vst3_u64 (uint64_t *, uint64x1x3_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1, D2, D3}, [R0]' + + * void vst3_s64 (int64_t *, int64x1x3_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1, D2, D3}, [R0]' + + * void vst3q_u32 (uint32_t *, uint32x4x3_t) + _Form of expected instruction(s):_ 'vst3.32 {D0, D1, D2}, [R0]' + + * void vst3q_u16 (uint16_t *, uint16x8x3_t) + _Form of expected instruction(s):_ 'vst3.16 {D0, D1, D2}, [R0]' + + * void vst3q_u8 (uint8_t *, uint8x16x3_t) + _Form of expected instruction(s):_ 'vst3.8 {D0, D1, D2}, [R0]' + + * void vst3q_s32 (int32_t *, int32x4x3_t) + _Form of expected instruction(s):_ 'vst3.32 {D0, D1, D2}, [R0]' + + * void vst3q_s16 (int16_t *, int16x8x3_t) + _Form of expected instruction(s):_ 'vst3.16 {D0, D1, D2}, [R0]' + + * void vst3q_s8 (int8_t *, int8x16x3_t) + _Form of expected instruction(s):_ 'vst3.8 {D0, D1, D2}, [R0]' + + * void vst3q_f32 (float32_t *, float32x4x3_t) + _Form of expected instruction(s):_ 'vst3.32 {D0, D1, D2}, [R0]' + + * void vst3q_p16 (poly16_t *, poly16x8x3_t) + _Form of expected instruction(s):_ 'vst3.16 {D0, D1, D2}, [R0]' + + * void vst3q_p8 (poly8_t *, poly8x16x3_t) + _Form of expected instruction(s):_ 'vst3.8 {D0, D1, D2}, [R0]' + + * void vst3_lane_u32 (uint32_t *, uint32x2x3_t, const int) + _Form of expected instruction(s):_ 'vst3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3_lane_u16 (uint16_t *, uint16x4x3_t, const int) + _Form of expected instruction(s):_ 'vst3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3_lane_u8 (uint8_t *, uint8x8x3_t, const int) + _Form of expected instruction(s):_ 'vst3.8 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3_lane_s32 (int32_t *, int32x2x3_t, const int) + _Form of expected instruction(s):_ 'vst3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3_lane_s16 (int16_t *, int16x4x3_t, const int) + _Form of expected instruction(s):_ 'vst3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3_lane_s8 (int8_t *, int8x8x3_t, const int) + _Form of expected instruction(s):_ 'vst3.8 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3_lane_f32 (float32_t *, float32x2x3_t, const int) + _Form of expected instruction(s):_ 'vst3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3_lane_p16 (poly16_t *, poly16x4x3_t, const int) + _Form of expected instruction(s):_ 'vst3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3_lane_p8 (poly8_t *, poly8x8x3_t, const int) + _Form of expected instruction(s):_ 'vst3.8 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3q_lane_s32 (int32_t *, int32x4x3_t, const int) + _Form of expected instruction(s):_ 'vst3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3q_lane_s16 (int16_t *, int16x8x3_t, const int) + _Form of expected instruction(s):_ 'vst3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3q_lane_u32 (uint32_t *, uint32x4x3_t, const int) + _Form of expected instruction(s):_ 'vst3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3q_lane_u16 (uint16_t *, uint16x8x3_t, const int) + _Form of expected instruction(s):_ 'vst3.16 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3q_lane_f32 (float32_t *, float32x4x3_t, const int) + _Form of expected instruction(s):_ 'vst3.32 {D0[0], D1[0], D2[0]}, + [R0]' + + * void vst3q_lane_p16 (poly16_t *, poly16x8x3_t, const int) + _Form of expected instruction(s):_ 'vst3.16 {D0[0], D1[0], D2[0]}, + [R0]' + +6.57.6.81 Element/structure loads, VLD4 variants +................................................ + + * uint32x2x4_t vld4_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0, D1, D2, D3}, [R0]' + + * uint16x4x4_t vld4_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0, D1, D2, D3}, [R0]' + + * uint8x8x4_t vld4_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0, D1, D2, D3}, [R0]' + + * int32x2x4_t vld4_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0, D1, D2, D3}, [R0]' + + * int16x4x4_t vld4_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0, D1, D2, D3}, [R0]' + + * int8x8x4_t vld4_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0, D1, D2, D3}, [R0]' + + * float32x2x4_t vld4_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0, D1, D2, D3}, [R0]' + + * poly16x4x4_t vld4_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0, D1, D2, D3}, [R0]' + + * poly8x8x4_t vld4_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0, D1, D2, D3}, [R0]' + + * poly64x1x4_t vld4_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2, D3}, [R0]' + + * uint64x1x4_t vld4_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2, D3}, [R0]' + + * int64x1x4_t vld4_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2, D3}, [R0]' + + * uint32x4x4_t vld4q_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0, D1, D2, D3}, [R0]' + + * uint16x8x4_t vld4q_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0, D1, D2, D3}, [R0]' + + * uint8x16x4_t vld4q_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0, D1, D2, D3}, [R0]' + + * int32x4x4_t vld4q_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0, D1, D2, D3}, [R0]' + + * int16x8x4_t vld4q_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0, D1, D2, D3}, [R0]' + + * int8x16x4_t vld4q_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0, D1, D2, D3}, [R0]' + + * float32x4x4_t vld4q_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0, D1, D2, D3}, [R0]' + + * poly16x8x4_t vld4q_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0, D1, D2, D3}, [R0]' + + * poly8x16x4_t vld4q_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0, D1, D2, D3}, [R0]' + + * uint32x2x4_t vld4_lane_u32 (const uint32_t *, uint32x2x4_t, const + int) + _Form of expected instruction(s):_ 'vld4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * uint16x4x4_t vld4_lane_u16 (const uint16_t *, uint16x4x4_t, const + int) + _Form of expected instruction(s):_ 'vld4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * uint8x8x4_t vld4_lane_u8 (const uint8_t *, uint8x8x4_t, const int) + _Form of expected instruction(s):_ 'vld4.8 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * int32x2x4_t vld4_lane_s32 (const int32_t *, int32x2x4_t, const int) + + _Form of expected instruction(s):_ 'vld4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * int16x4x4_t vld4_lane_s16 (const int16_t *, int16x4x4_t, const int) + + _Form of expected instruction(s):_ 'vld4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * int8x8x4_t vld4_lane_s8 (const int8_t *, int8x8x4_t, const int) + _Form of expected instruction(s):_ 'vld4.8 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * float32x2x4_t vld4_lane_f32 (const float32_t *, float32x2x4_t, + const int) + _Form of expected instruction(s):_ 'vld4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * poly16x4x4_t vld4_lane_p16 (const poly16_t *, poly16x4x4_t, const + int) + _Form of expected instruction(s):_ 'vld4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * poly8x8x4_t vld4_lane_p8 (const poly8_t *, poly8x8x4_t, const int) + _Form of expected instruction(s):_ 'vld4.8 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * int32x4x4_t vld4q_lane_s32 (const int32_t *, int32x4x4_t, const + int) + _Form of expected instruction(s):_ 'vld4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * int16x8x4_t vld4q_lane_s16 (const int16_t *, int16x8x4_t, const + int) + _Form of expected instruction(s):_ 'vld4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * uint32x4x4_t vld4q_lane_u32 (const uint32_t *, uint32x4x4_t, const + int) + _Form of expected instruction(s):_ 'vld4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * uint16x8x4_t vld4q_lane_u16 (const uint16_t *, uint16x8x4_t, const + int) + _Form of expected instruction(s):_ 'vld4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * float32x4x4_t vld4q_lane_f32 (const float32_t *, float32x4x4_t, + const int) + _Form of expected instruction(s):_ 'vld4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * poly16x8x4_t vld4q_lane_p16 (const poly16_t *, poly16x8x4_t, const + int) + _Form of expected instruction(s):_ 'vld4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * uint32x2x4_t vld4_dup_u32 (const uint32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0[], D1[], D2[], + D3[]}, [R0]' + + * uint16x4x4_t vld4_dup_u16 (const uint16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0[], D1[], D2[], + D3[]}, [R0]' + + * uint8x8x4_t vld4_dup_u8 (const uint8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0[], D1[], D2[], + D3[]}, [R0]' + + * int32x2x4_t vld4_dup_s32 (const int32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0[], D1[], D2[], + D3[]}, [R0]' + + * int16x4x4_t vld4_dup_s16 (const int16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0[], D1[], D2[], + D3[]}, [R0]' + + * int8x8x4_t vld4_dup_s8 (const int8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0[], D1[], D2[], + D3[]}, [R0]' + + * float32x2x4_t vld4_dup_f32 (const float32_t *) + _Form of expected instruction(s):_ 'vld4.32 {D0[], D1[], D2[], + D3[]}, [R0]' + + * poly16x4x4_t vld4_dup_p16 (const poly16_t *) + _Form of expected instruction(s):_ 'vld4.16 {D0[], D1[], D2[], + D3[]}, [R0]' + + * poly8x8x4_t vld4_dup_p8 (const poly8_t *) + _Form of expected instruction(s):_ 'vld4.8 {D0[], D1[], D2[], + D3[]}, [R0]' + + * poly64x1x4_t vld4_dup_p64 (const poly64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2, D3}, [R0]' + + * uint64x1x4_t vld4_dup_u64 (const uint64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2, D3}, [R0]' + + * int64x1x4_t vld4_dup_s64 (const int64_t *) + _Form of expected instruction(s):_ 'vld1.64 {D0, D1, D2, D3}, [R0]' + +6.57.6.82 Element/structure stores, VST4 variants +................................................. + + * void vst4_u32 (uint32_t *, uint32x2x4_t) + _Form of expected instruction(s):_ 'vst4.32 {D0, D1, D2, D3}, [R0]' + + * void vst4_u16 (uint16_t *, uint16x4x4_t) + _Form of expected instruction(s):_ 'vst4.16 {D0, D1, D2, D3}, [R0]' + + * void vst4_u8 (uint8_t *, uint8x8x4_t) + _Form of expected instruction(s):_ 'vst4.8 {D0, D1, D2, D3}, [R0]' + + * void vst4_s32 (int32_t *, int32x2x4_t) + _Form of expected instruction(s):_ 'vst4.32 {D0, D1, D2, D3}, [R0]' + + * void vst4_s16 (int16_t *, int16x4x4_t) + _Form of expected instruction(s):_ 'vst4.16 {D0, D1, D2, D3}, [R0]' + + * void vst4_s8 (int8_t *, int8x8x4_t) + _Form of expected instruction(s):_ 'vst4.8 {D0, D1, D2, D3}, [R0]' + + * void vst4_f32 (float32_t *, float32x2x4_t) + _Form of expected instruction(s):_ 'vst4.32 {D0, D1, D2, D3}, [R0]' + + * void vst4_p16 (poly16_t *, poly16x4x4_t) + _Form of expected instruction(s):_ 'vst4.16 {D0, D1, D2, D3}, [R0]' + + * void vst4_p8 (poly8_t *, poly8x8x4_t) + _Form of expected instruction(s):_ 'vst4.8 {D0, D1, D2, D3}, [R0]' + + * void vst4_p64 (poly64_t *, poly64x1x4_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1, D2, D3}, [R0]' + + * void vst4_u64 (uint64_t *, uint64x1x4_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1, D2, D3}, [R0]' + + * void vst4_s64 (int64_t *, int64x1x4_t) + _Form of expected instruction(s):_ 'vst1.64 {D0, D1, D2, D3}, [R0]' + + * void vst4q_u32 (uint32_t *, uint32x4x4_t) + _Form of expected instruction(s):_ 'vst4.32 {D0, D1, D2, D3}, [R0]' + + * void vst4q_u16 (uint16_t *, uint16x8x4_t) + _Form of expected instruction(s):_ 'vst4.16 {D0, D1, D2, D3}, [R0]' + + * void vst4q_u8 (uint8_t *, uint8x16x4_t) + _Form of expected instruction(s):_ 'vst4.8 {D0, D1, D2, D3}, [R0]' + + * void vst4q_s32 (int32_t *, int32x4x4_t) + _Form of expected instruction(s):_ 'vst4.32 {D0, D1, D2, D3}, [R0]' + + * void vst4q_s16 (int16_t *, int16x8x4_t) + _Form of expected instruction(s):_ 'vst4.16 {D0, D1, D2, D3}, [R0]' + + * void vst4q_s8 (int8_t *, int8x16x4_t) + _Form of expected instruction(s):_ 'vst4.8 {D0, D1, D2, D3}, [R0]' + + * void vst4q_f32 (float32_t *, float32x4x4_t) + _Form of expected instruction(s):_ 'vst4.32 {D0, D1, D2, D3}, [R0]' + + * void vst4q_p16 (poly16_t *, poly16x8x4_t) + _Form of expected instruction(s):_ 'vst4.16 {D0, D1, D2, D3}, [R0]' + + * void vst4q_p8 (poly8_t *, poly8x16x4_t) + _Form of expected instruction(s):_ 'vst4.8 {D0, D1, D2, D3}, [R0]' + + * void vst4_lane_u32 (uint32_t *, uint32x2x4_t, const int) + _Form of expected instruction(s):_ 'vst4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4_lane_u16 (uint16_t *, uint16x4x4_t, const int) + _Form of expected instruction(s):_ 'vst4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4_lane_u8 (uint8_t *, uint8x8x4_t, const int) + _Form of expected instruction(s):_ 'vst4.8 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4_lane_s32 (int32_t *, int32x2x4_t, const int) + _Form of expected instruction(s):_ 'vst4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4_lane_s16 (int16_t *, int16x4x4_t, const int) + _Form of expected instruction(s):_ 'vst4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4_lane_s8 (int8_t *, int8x8x4_t, const int) + _Form of expected instruction(s):_ 'vst4.8 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4_lane_f32 (float32_t *, float32x2x4_t, const int) + _Form of expected instruction(s):_ 'vst4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4_lane_p16 (poly16_t *, poly16x4x4_t, const int) + _Form of expected instruction(s):_ 'vst4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4_lane_p8 (poly8_t *, poly8x8x4_t, const int) + _Form of expected instruction(s):_ 'vst4.8 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4q_lane_s32 (int32_t *, int32x4x4_t, const int) + _Form of expected instruction(s):_ 'vst4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4q_lane_s16 (int16_t *, int16x8x4_t, const int) + _Form of expected instruction(s):_ 'vst4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4q_lane_u32 (uint32_t *, uint32x4x4_t, const int) + _Form of expected instruction(s):_ 'vst4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4q_lane_u16 (uint16_t *, uint16x8x4_t, const int) + _Form of expected instruction(s):_ 'vst4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4q_lane_f32 (float32_t *, float32x4x4_t, const int) + _Form of expected instruction(s):_ 'vst4.32 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + + * void vst4q_lane_p16 (poly16_t *, poly16x8x4_t, const int) + _Form of expected instruction(s):_ 'vst4.16 {D0[0], D1[0], D2[0], + D3[0]}, [R0]' + +6.57.6.83 Logical operations (AND) +.................................. + + * uint32x2_t vand_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vand D0, D0, D0' + + * uint16x4_t vand_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vand D0, D0, D0' + + * uint8x8_t vand_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vand D0, D0, D0' + + * int32x2_t vand_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vand D0, D0, D0' + + * int16x4_t vand_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vand D0, D0, D0' + + * int8x8_t vand_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vand D0, D0, D0' + + * uint64x1_t vand_u64 (uint64x1_t, uint64x1_t) + + * int64x1_t vand_s64 (int64x1_t, int64x1_t) + + * uint32x4_t vandq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vand Q0, Q0, Q0' + + * uint16x8_t vandq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vand Q0, Q0, Q0' + + * uint8x16_t vandq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vand Q0, Q0, Q0' + + * int32x4_t vandq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vand Q0, Q0, Q0' + + * int16x8_t vandq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vand Q0, Q0, Q0' + + * int8x16_t vandq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vand Q0, Q0, Q0' + + * uint64x2_t vandq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vand Q0, Q0, Q0' + + * int64x2_t vandq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vand Q0, Q0, Q0' + +6.57.6.84 Logical operations (OR) +................................. + + * uint32x2_t vorr_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vorr D0, D0, D0' + + * uint16x4_t vorr_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vorr D0, D0, D0' + + * uint8x8_t vorr_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vorr D0, D0, D0' + + * int32x2_t vorr_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vorr D0, D0, D0' + + * int16x4_t vorr_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vorr D0, D0, D0' + + * int8x8_t vorr_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vorr D0, D0, D0' + + * uint64x1_t vorr_u64 (uint64x1_t, uint64x1_t) + + * int64x1_t vorr_s64 (int64x1_t, int64x1_t) + + * uint32x4_t vorrq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vorr Q0, Q0, Q0' + + * uint16x8_t vorrq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vorr Q0, Q0, Q0' + + * uint8x16_t vorrq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vorr Q0, Q0, Q0' + + * int32x4_t vorrq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vorr Q0, Q0, Q0' + + * int16x8_t vorrq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vorr Q0, Q0, Q0' + + * int8x16_t vorrq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vorr Q0, Q0, Q0' + + * uint64x2_t vorrq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vorr Q0, Q0, Q0' + + * int64x2_t vorrq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vorr Q0, Q0, Q0' + +6.57.6.85 Logical operations (exclusive OR) +........................................... + + * uint32x2_t veor_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'veor D0, D0, D0' + + * uint16x4_t veor_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'veor D0, D0, D0' + + * uint8x8_t veor_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'veor D0, D0, D0' + + * int32x2_t veor_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'veor D0, D0, D0' + + * int16x4_t veor_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'veor D0, D0, D0' + + * int8x8_t veor_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'veor D0, D0, D0' + + * uint64x1_t veor_u64 (uint64x1_t, uint64x1_t) + + * int64x1_t veor_s64 (int64x1_t, int64x1_t) + + * uint32x4_t veorq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'veor Q0, Q0, Q0' + + * uint16x8_t veorq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'veor Q0, Q0, Q0' + + * uint8x16_t veorq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'veor Q0, Q0, Q0' + + * int32x4_t veorq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'veor Q0, Q0, Q0' + + * int16x8_t veorq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'veor Q0, Q0, Q0' + + * int8x16_t veorq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'veor Q0, Q0, Q0' + + * uint64x2_t veorq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'veor Q0, Q0, Q0' + + * int64x2_t veorq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'veor Q0, Q0, Q0' + +6.57.6.86 Logical operations (AND-NOT) +...................................... + + * uint32x2_t vbic_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vbic D0, D0, D0' + + * uint16x4_t vbic_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vbic D0, D0, D0' + + * uint8x8_t vbic_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vbic D0, D0, D0' + + * int32x2_t vbic_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vbic D0, D0, D0' + + * int16x4_t vbic_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vbic D0, D0, D0' + + * int8x8_t vbic_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vbic D0, D0, D0' + + * uint64x1_t vbic_u64 (uint64x1_t, uint64x1_t) + + * int64x1_t vbic_s64 (int64x1_t, int64x1_t) + + * uint32x4_t vbicq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vbic Q0, Q0, Q0' + + * uint16x8_t vbicq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vbic Q0, Q0, Q0' + + * uint8x16_t vbicq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vbic Q0, Q0, Q0' + + * int32x4_t vbicq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vbic Q0, Q0, Q0' + + * int16x8_t vbicq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vbic Q0, Q0, Q0' + + * int8x16_t vbicq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vbic Q0, Q0, Q0' + + * uint64x2_t vbicq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vbic Q0, Q0, Q0' + + * int64x2_t vbicq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vbic Q0, Q0, Q0' + +6.57.6.87 Logical operations (OR-NOT) +..................................... + + * uint32x2_t vorn_u32 (uint32x2_t, uint32x2_t) + _Form of expected instruction(s):_ 'vorn D0, D0, D0' + + * uint16x4_t vorn_u16 (uint16x4_t, uint16x4_t) + _Form of expected instruction(s):_ 'vorn D0, D0, D0' + + * uint8x8_t vorn_u8 (uint8x8_t, uint8x8_t) + _Form of expected instruction(s):_ 'vorn D0, D0, D0' + + * int32x2_t vorn_s32 (int32x2_t, int32x2_t) + _Form of expected instruction(s):_ 'vorn D0, D0, D0' + + * int16x4_t vorn_s16 (int16x4_t, int16x4_t) + _Form of expected instruction(s):_ 'vorn D0, D0, D0' + + * int8x8_t vorn_s8 (int8x8_t, int8x8_t) + _Form of expected instruction(s):_ 'vorn D0, D0, D0' + + * uint64x1_t vorn_u64 (uint64x1_t, uint64x1_t) + + * int64x1_t vorn_s64 (int64x1_t, int64x1_t) + + * uint32x4_t vornq_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'vorn Q0, Q0, Q0' + + * uint16x8_t vornq_u16 (uint16x8_t, uint16x8_t) + _Form of expected instruction(s):_ 'vorn Q0, Q0, Q0' + + * uint8x16_t vornq_u8 (uint8x16_t, uint8x16_t) + _Form of expected instruction(s):_ 'vorn Q0, Q0, Q0' + + * int32x4_t vornq_s32 (int32x4_t, int32x4_t) + _Form of expected instruction(s):_ 'vorn Q0, Q0, Q0' + + * int16x8_t vornq_s16 (int16x8_t, int16x8_t) + _Form of expected instruction(s):_ 'vorn Q0, Q0, Q0' + + * int8x16_t vornq_s8 (int8x16_t, int8x16_t) + _Form of expected instruction(s):_ 'vorn Q0, Q0, Q0' + + * uint64x2_t vornq_u64 (uint64x2_t, uint64x2_t) + _Form of expected instruction(s):_ 'vorn Q0, Q0, Q0' + + * int64x2_t vornq_s64 (int64x2_t, int64x2_t) + _Form of expected instruction(s):_ 'vorn Q0, Q0, Q0' + +6.57.6.88 Reinterpret casts +........................... + + * poly8x8_t vreinterpret_p8_p16 (poly16x4_t) + + * poly8x8_t vreinterpret_p8_f32 (float32x2_t) + + * poly8x8_t vreinterpret_p8_p64 (poly64x1_t) + + * poly8x8_t vreinterpret_p8_s64 (int64x1_t) + + * poly8x8_t vreinterpret_p8_u64 (uint64x1_t) + + * poly8x8_t vreinterpret_p8_s8 (int8x8_t) + + * poly8x8_t vreinterpret_p8_s16 (int16x4_t) + + * poly8x8_t vreinterpret_p8_s32 (int32x2_t) + + * poly8x8_t vreinterpret_p8_u8 (uint8x8_t) + + * poly8x8_t vreinterpret_p8_u16 (uint16x4_t) + + * poly8x8_t vreinterpret_p8_u32 (uint32x2_t) + + * poly16x4_t vreinterpret_p16_p8 (poly8x8_t) + + * poly16x4_t vreinterpret_p16_f32 (float32x2_t) + + * poly16x4_t vreinterpret_p16_p64 (poly64x1_t) + + * poly16x4_t vreinterpret_p16_s64 (int64x1_t) + + * poly16x4_t vreinterpret_p16_u64 (uint64x1_t) + + * poly16x4_t vreinterpret_p16_s8 (int8x8_t) + + * poly16x4_t vreinterpret_p16_s16 (int16x4_t) + + * poly16x4_t vreinterpret_p16_s32 (int32x2_t) + + * poly16x4_t vreinterpret_p16_u8 (uint8x8_t) + + * poly16x4_t vreinterpret_p16_u16 (uint16x4_t) + + * poly16x4_t vreinterpret_p16_u32 (uint32x2_t) + + * float32x2_t vreinterpret_f32_p8 (poly8x8_t) + + * float32x2_t vreinterpret_f32_p16 (poly16x4_t) + + * float32x2_t vreinterpret_f32_p64 (poly64x1_t) + + * float32x2_t vreinterpret_f32_s64 (int64x1_t) + + * float32x2_t vreinterpret_f32_u64 (uint64x1_t) + + * float32x2_t vreinterpret_f32_s8 (int8x8_t) + + * float32x2_t vreinterpret_f32_s16 (int16x4_t) + + * float32x2_t vreinterpret_f32_s32 (int32x2_t) + + * float32x2_t vreinterpret_f32_u8 (uint8x8_t) + + * float32x2_t vreinterpret_f32_u16 (uint16x4_t) + + * float32x2_t vreinterpret_f32_u32 (uint32x2_t) + + * poly64x1_t vreinterpret_p64_p8 (poly8x8_t) + + * poly64x1_t vreinterpret_p64_p16 (poly16x4_t) + + * poly64x1_t vreinterpret_p64_f32 (float32x2_t) + + * poly64x1_t vreinterpret_p64_s64 (int64x1_t) + + * poly64x1_t vreinterpret_p64_u64 (uint64x1_t) + + * poly64x1_t vreinterpret_p64_s8 (int8x8_t) + + * poly64x1_t vreinterpret_p64_s16 (int16x4_t) + + * poly64x1_t vreinterpret_p64_s32 (int32x2_t) + + * poly64x1_t vreinterpret_p64_u8 (uint8x8_t) + + * poly64x1_t vreinterpret_p64_u16 (uint16x4_t) + + * poly64x1_t vreinterpret_p64_u32 (uint32x2_t) + + * int64x1_t vreinterpret_s64_p8 (poly8x8_t) + + * int64x1_t vreinterpret_s64_p16 (poly16x4_t) + + * int64x1_t vreinterpret_s64_f32 (float32x2_t) + + * int64x1_t vreinterpret_s64_p64 (poly64x1_t) + + * int64x1_t vreinterpret_s64_u64 (uint64x1_t) + + * int64x1_t vreinterpret_s64_s8 (int8x8_t) + + * int64x1_t vreinterpret_s64_s16 (int16x4_t) + + * int64x1_t vreinterpret_s64_s32 (int32x2_t) + + * int64x1_t vreinterpret_s64_u8 (uint8x8_t) + + * int64x1_t vreinterpret_s64_u16 (uint16x4_t) + + * int64x1_t vreinterpret_s64_u32 (uint32x2_t) + + * uint64x1_t vreinterpret_u64_p8 (poly8x8_t) + + * uint64x1_t vreinterpret_u64_p16 (poly16x4_t) + + * uint64x1_t vreinterpret_u64_f32 (float32x2_t) + + * uint64x1_t vreinterpret_u64_p64 (poly64x1_t) + + * uint64x1_t vreinterpret_u64_s64 (int64x1_t) + + * uint64x1_t vreinterpret_u64_s8 (int8x8_t) + + * uint64x1_t vreinterpret_u64_s16 (int16x4_t) + + * uint64x1_t vreinterpret_u64_s32 (int32x2_t) + + * uint64x1_t vreinterpret_u64_u8 (uint8x8_t) + + * uint64x1_t vreinterpret_u64_u16 (uint16x4_t) + + * uint64x1_t vreinterpret_u64_u32 (uint32x2_t) + + * int8x8_t vreinterpret_s8_p8 (poly8x8_t) + + * int8x8_t vreinterpret_s8_p16 (poly16x4_t) + + * int8x8_t vreinterpret_s8_f32 (float32x2_t) + + * int8x8_t vreinterpret_s8_p64 (poly64x1_t) + + * int8x8_t vreinterpret_s8_s64 (int64x1_t) + + * int8x8_t vreinterpret_s8_u64 (uint64x1_t) + + * int8x8_t vreinterpret_s8_s16 (int16x4_t) + + * int8x8_t vreinterpret_s8_s32 (int32x2_t) + + * int8x8_t vreinterpret_s8_u8 (uint8x8_t) + + * int8x8_t vreinterpret_s8_u16 (uint16x4_t) + + * int8x8_t vreinterpret_s8_u32 (uint32x2_t) + + * int16x4_t vreinterpret_s16_p8 (poly8x8_t) + + * int16x4_t vreinterpret_s16_p16 (poly16x4_t) + + * int16x4_t vreinterpret_s16_f32 (float32x2_t) + + * int16x4_t vreinterpret_s16_p64 (poly64x1_t) + + * int16x4_t vreinterpret_s16_s64 (int64x1_t) + + * int16x4_t vreinterpret_s16_u64 (uint64x1_t) + + * int16x4_t vreinterpret_s16_s8 (int8x8_t) + + * int16x4_t vreinterpret_s16_s32 (int32x2_t) + + * int16x4_t vreinterpret_s16_u8 (uint8x8_t) + + * int16x4_t vreinterpret_s16_u16 (uint16x4_t) + + * int16x4_t vreinterpret_s16_u32 (uint32x2_t) + + * int32x2_t vreinterpret_s32_p8 (poly8x8_t) + + * int32x2_t vreinterpret_s32_p16 (poly16x4_t) + + * int32x2_t vreinterpret_s32_f32 (float32x2_t) + + * int32x2_t vreinterpret_s32_p64 (poly64x1_t) + + * int32x2_t vreinterpret_s32_s64 (int64x1_t) + + * int32x2_t vreinterpret_s32_u64 (uint64x1_t) + + * int32x2_t vreinterpret_s32_s8 (int8x8_t) + + * int32x2_t vreinterpret_s32_s16 (int16x4_t) + + * int32x2_t vreinterpret_s32_u8 (uint8x8_t) + + * int32x2_t vreinterpret_s32_u16 (uint16x4_t) + + * int32x2_t vreinterpret_s32_u32 (uint32x2_t) + + * uint8x8_t vreinterpret_u8_p8 (poly8x8_t) + + * uint8x8_t vreinterpret_u8_p16 (poly16x4_t) + + * uint8x8_t vreinterpret_u8_f32 (float32x2_t) + + * uint8x8_t vreinterpret_u8_p64 (poly64x1_t) + + * uint8x8_t vreinterpret_u8_s64 (int64x1_t) + + * uint8x8_t vreinterpret_u8_u64 (uint64x1_t) + + * uint8x8_t vreinterpret_u8_s8 (int8x8_t) + + * uint8x8_t vreinterpret_u8_s16 (int16x4_t) + + * uint8x8_t vreinterpret_u8_s32 (int32x2_t) + + * uint8x8_t vreinterpret_u8_u16 (uint16x4_t) + + * uint8x8_t vreinterpret_u8_u32 (uint32x2_t) + + * uint16x4_t vreinterpret_u16_p8 (poly8x8_t) + + * uint16x4_t vreinterpret_u16_p16 (poly16x4_t) + + * uint16x4_t vreinterpret_u16_f32 (float32x2_t) + + * uint16x4_t vreinterpret_u16_p64 (poly64x1_t) + + * uint16x4_t vreinterpret_u16_s64 (int64x1_t) + + * uint16x4_t vreinterpret_u16_u64 (uint64x1_t) + + * uint16x4_t vreinterpret_u16_s8 (int8x8_t) + + * uint16x4_t vreinterpret_u16_s16 (int16x4_t) + + * uint16x4_t vreinterpret_u16_s32 (int32x2_t) + + * uint16x4_t vreinterpret_u16_u8 (uint8x8_t) + + * uint16x4_t vreinterpret_u16_u32 (uint32x2_t) + + * uint32x2_t vreinterpret_u32_p8 (poly8x8_t) + + * uint32x2_t vreinterpret_u32_p16 (poly16x4_t) + + * uint32x2_t vreinterpret_u32_f32 (float32x2_t) + + * uint32x2_t vreinterpret_u32_p64 (poly64x1_t) + + * uint32x2_t vreinterpret_u32_s64 (int64x1_t) + + * uint32x2_t vreinterpret_u32_u64 (uint64x1_t) + + * uint32x2_t vreinterpret_u32_s8 (int8x8_t) + + * uint32x2_t vreinterpret_u32_s16 (int16x4_t) + + * uint32x2_t vreinterpret_u32_s32 (int32x2_t) + + * uint32x2_t vreinterpret_u32_u8 (uint8x8_t) + + * uint32x2_t vreinterpret_u32_u16 (uint16x4_t) + + * poly8x16_t vreinterpretq_p8_p16 (poly16x8_t) + + * poly8x16_t vreinterpretq_p8_f32 (float32x4_t) + + * poly8x16_t vreinterpretq_p8_p64 (poly64x2_t) + + * poly8x16_t vreinterpretq_p8_p128 (poly128_t) + + * poly8x16_t vreinterpretq_p8_s64 (int64x2_t) + + * poly8x16_t vreinterpretq_p8_u64 (uint64x2_t) + + * poly8x16_t vreinterpretq_p8_s8 (int8x16_t) + + * poly8x16_t vreinterpretq_p8_s16 (int16x8_t) + + * poly8x16_t vreinterpretq_p8_s32 (int32x4_t) + + * poly8x16_t vreinterpretq_p8_u8 (uint8x16_t) + + * poly8x16_t vreinterpretq_p8_u16 (uint16x8_t) + + * poly8x16_t vreinterpretq_p8_u32 (uint32x4_t) + + * poly16x8_t vreinterpretq_p16_p8 (poly8x16_t) + + * poly16x8_t vreinterpretq_p16_f32 (float32x4_t) + + * poly16x8_t vreinterpretq_p16_p64 (poly64x2_t) + + * poly16x8_t vreinterpretq_p16_p128 (poly128_t) + + * poly16x8_t vreinterpretq_p16_s64 (int64x2_t) + + * poly16x8_t vreinterpretq_p16_u64 (uint64x2_t) + + * poly16x8_t vreinterpretq_p16_s8 (int8x16_t) + + * poly16x8_t vreinterpretq_p16_s16 (int16x8_t) + + * poly16x8_t vreinterpretq_p16_s32 (int32x4_t) + + * poly16x8_t vreinterpretq_p16_u8 (uint8x16_t) + + * poly16x8_t vreinterpretq_p16_u16 (uint16x8_t) + + * poly16x8_t vreinterpretq_p16_u32 (uint32x4_t) + + * float32x4_t vreinterpretq_f32_p8 (poly8x16_t) + + * float32x4_t vreinterpretq_f32_p16 (poly16x8_t) + + * float32x4_t vreinterpretq_f32_p64 (poly64x2_t) + + * float32x4_t vreinterpretq_f32_p128 (poly128_t) + + * float32x4_t vreinterpretq_f32_s64 (int64x2_t) + + * float32x4_t vreinterpretq_f32_u64 (uint64x2_t) + + * float32x4_t vreinterpretq_f32_s8 (int8x16_t) + + * float32x4_t vreinterpretq_f32_s16 (int16x8_t) + + * float32x4_t vreinterpretq_f32_s32 (int32x4_t) + + * float32x4_t vreinterpretq_f32_u8 (uint8x16_t) + + * float32x4_t vreinterpretq_f32_u16 (uint16x8_t) + + * float32x4_t vreinterpretq_f32_u32 (uint32x4_t) + + * poly64x2_t vreinterpretq_p64_p8 (poly8x16_t) + + * poly64x2_t vreinterpretq_p64_p16 (poly16x8_t) + + * poly64x2_t vreinterpretq_p64_f32 (float32x4_t) + + * poly64x2_t vreinterpretq_p64_p128 (poly128_t) + + * poly64x2_t vreinterpretq_p64_s64 (int64x2_t) + + * poly64x2_t vreinterpretq_p64_u64 (uint64x2_t) + + * poly64x2_t vreinterpretq_p64_s8 (int8x16_t) + + * poly64x2_t vreinterpretq_p64_s16 (int16x8_t) + + * poly64x2_t vreinterpretq_p64_s32 (int32x4_t) + + * poly64x2_t vreinterpretq_p64_u8 (uint8x16_t) + + * poly64x2_t vreinterpretq_p64_u16 (uint16x8_t) + + * poly64x2_t vreinterpretq_p64_u32 (uint32x4_t) + + * poly128_t vreinterpretq_p128_p8 (poly8x16_t) + + * poly128_t vreinterpretq_p128_p16 (poly16x8_t) + + * poly128_t vreinterpretq_p128_f32 (float32x4_t) + + * poly128_t vreinterpretq_p128_p64 (poly64x2_t) + + * poly128_t vreinterpretq_p128_s64 (int64x2_t) + + * poly128_t vreinterpretq_p128_u64 (uint64x2_t) + + * poly128_t vreinterpretq_p128_s8 (int8x16_t) + + * poly128_t vreinterpretq_p128_s16 (int16x8_t) + + * poly128_t vreinterpretq_p128_s32 (int32x4_t) + + * poly128_t vreinterpretq_p128_u8 (uint8x16_t) + + * poly128_t vreinterpretq_p128_u16 (uint16x8_t) + + * poly128_t vreinterpretq_p128_u32 (uint32x4_t) + + * int64x2_t vreinterpretq_s64_p8 (poly8x16_t) + + * int64x2_t vreinterpretq_s64_p16 (poly16x8_t) + + * int64x2_t vreinterpretq_s64_f32 (float32x4_t) + + * int64x2_t vreinterpretq_s64_p64 (poly64x2_t) + + * int64x2_t vreinterpretq_s64_p128 (poly128_t) + + * int64x2_t vreinterpretq_s64_u64 (uint64x2_t) + + * int64x2_t vreinterpretq_s64_s8 (int8x16_t) + + * int64x2_t vreinterpretq_s64_s16 (int16x8_t) + + * int64x2_t vreinterpretq_s64_s32 (int32x4_t) + + * int64x2_t vreinterpretq_s64_u8 (uint8x16_t) + + * int64x2_t vreinterpretq_s64_u16 (uint16x8_t) + + * int64x2_t vreinterpretq_s64_u32 (uint32x4_t) + + * uint64x2_t vreinterpretq_u64_p8 (poly8x16_t) + + * uint64x2_t vreinterpretq_u64_p16 (poly16x8_t) + + * uint64x2_t vreinterpretq_u64_f32 (float32x4_t) + + * uint64x2_t vreinterpretq_u64_p64 (poly64x2_t) + + * uint64x2_t vreinterpretq_u64_p128 (poly128_t) + + * uint64x2_t vreinterpretq_u64_s64 (int64x2_t) + + * uint64x2_t vreinterpretq_u64_s8 (int8x16_t) + + * uint64x2_t vreinterpretq_u64_s16 (int16x8_t) + + * uint64x2_t vreinterpretq_u64_s32 (int32x4_t) + + * uint64x2_t vreinterpretq_u64_u8 (uint8x16_t) + + * uint64x2_t vreinterpretq_u64_u16 (uint16x8_t) + + * uint64x2_t vreinterpretq_u64_u32 (uint32x4_t) + + * int8x16_t vreinterpretq_s8_p8 (poly8x16_t) + + * int8x16_t vreinterpretq_s8_p16 (poly16x8_t) + + * int8x16_t vreinterpretq_s8_f32 (float32x4_t) + + * int8x16_t vreinterpretq_s8_p64 (poly64x2_t) + + * int8x16_t vreinterpretq_s8_p128 (poly128_t) + + * int8x16_t vreinterpretq_s8_s64 (int64x2_t) + + * int8x16_t vreinterpretq_s8_u64 (uint64x2_t) + + * int8x16_t vreinterpretq_s8_s16 (int16x8_t) + + * int8x16_t vreinterpretq_s8_s32 (int32x4_t) + + * int8x16_t vreinterpretq_s8_u8 (uint8x16_t) + + * int8x16_t vreinterpretq_s8_u16 (uint16x8_t) + + * int8x16_t vreinterpretq_s8_u32 (uint32x4_t) + + * int16x8_t vreinterpretq_s16_p8 (poly8x16_t) + + * int16x8_t vreinterpretq_s16_p16 (poly16x8_t) + + * int16x8_t vreinterpretq_s16_f32 (float32x4_t) + + * int16x8_t vreinterpretq_s16_p64 (poly64x2_t) + + * int16x8_t vreinterpretq_s16_p128 (poly128_t) + + * int16x8_t vreinterpretq_s16_s64 (int64x2_t) + + * int16x8_t vreinterpretq_s16_u64 (uint64x2_t) + + * int16x8_t vreinterpretq_s16_s8 (int8x16_t) + + * int16x8_t vreinterpretq_s16_s32 (int32x4_t) + + * int16x8_t vreinterpretq_s16_u8 (uint8x16_t) + + * int16x8_t vreinterpretq_s16_u16 (uint16x8_t) + + * int16x8_t vreinterpretq_s16_u32 (uint32x4_t) + + * int32x4_t vreinterpretq_s32_p8 (poly8x16_t) + + * int32x4_t vreinterpretq_s32_p16 (poly16x8_t) + + * int32x4_t vreinterpretq_s32_f32 (float32x4_t) + + * int32x4_t vreinterpretq_s32_p64 (poly64x2_t) + + * int32x4_t vreinterpretq_s32_p128 (poly128_t) + + * int32x4_t vreinterpretq_s32_s64 (int64x2_t) + + * int32x4_t vreinterpretq_s32_u64 (uint64x2_t) + + * int32x4_t vreinterpretq_s32_s8 (int8x16_t) + + * int32x4_t vreinterpretq_s32_s16 (int16x8_t) + + * int32x4_t vreinterpretq_s32_u8 (uint8x16_t) + + * int32x4_t vreinterpretq_s32_u16 (uint16x8_t) + + * int32x4_t vreinterpretq_s32_u32 (uint32x4_t) + + * uint8x16_t vreinterpretq_u8_p8 (poly8x16_t) + + * uint8x16_t vreinterpretq_u8_p16 (poly16x8_t) + + * uint8x16_t vreinterpretq_u8_f32 (float32x4_t) + + * uint8x16_t vreinterpretq_u8_p64 (poly64x2_t) + + * uint8x16_t vreinterpretq_u8_p128 (poly128_t) + + * uint8x16_t vreinterpretq_u8_s64 (int64x2_t) + + * uint8x16_t vreinterpretq_u8_u64 (uint64x2_t) + + * uint8x16_t vreinterpretq_u8_s8 (int8x16_t) + + * uint8x16_t vreinterpretq_u8_s16 (int16x8_t) + + * uint8x16_t vreinterpretq_u8_s32 (int32x4_t) + + * uint8x16_t vreinterpretq_u8_u16 (uint16x8_t) + + * uint8x16_t vreinterpretq_u8_u32 (uint32x4_t) + + * uint16x8_t vreinterpretq_u16_p8 (poly8x16_t) + + * uint16x8_t vreinterpretq_u16_p16 (poly16x8_t) + + * uint16x8_t vreinterpretq_u16_f32 (float32x4_t) + + * uint16x8_t vreinterpretq_u16_p64 (poly64x2_t) + + * uint16x8_t vreinterpretq_u16_p128 (poly128_t) + + * uint16x8_t vreinterpretq_u16_s64 (int64x2_t) + + * uint16x8_t vreinterpretq_u16_u64 (uint64x2_t) + + * uint16x8_t vreinterpretq_u16_s8 (int8x16_t) + + * uint16x8_t vreinterpretq_u16_s16 (int16x8_t) + + * uint16x8_t vreinterpretq_u16_s32 (int32x4_t) + + * uint16x8_t vreinterpretq_u16_u8 (uint8x16_t) + + * uint16x8_t vreinterpretq_u16_u32 (uint32x4_t) + + * uint32x4_t vreinterpretq_u32_p8 (poly8x16_t) + + * uint32x4_t vreinterpretq_u32_p16 (poly16x8_t) + + * uint32x4_t vreinterpretq_u32_f32 (float32x4_t) + + * uint32x4_t vreinterpretq_u32_p64 (poly64x2_t) + + * uint32x4_t vreinterpretq_u32_p128 (poly128_t) + + * uint32x4_t vreinterpretq_u32_s64 (int64x2_t) + + * uint32x4_t vreinterpretq_u32_u64 (uint64x2_t) + + * uint32x4_t vreinterpretq_u32_s8 (int8x16_t) + + * uint32x4_t vreinterpretq_u32_s16 (int16x8_t) + + * uint32x4_t vreinterpretq_u32_s32 (int32x4_t) + + * uint32x4_t vreinterpretq_u32_u8 (uint8x16_t) + + * uint32x4_t vreinterpretq_u32_u16 (uint16x8_t) + + * poly128_t vldrq_p128(poly128_t const *) + + * void vstrq_p128(poly128_t *, poly128_t) + + * uint64x1_t vceq_p64 (poly64x1_t, poly64x1_t) + + * uint64x1_t vtst_p64 (poly64x1_t, poly64x1_t) + + * uint32_t vsha1h_u32 (uint32_t) + _Form of expected instruction(s):_ 'sha1h.32 Q0, Q1' + + * uint32x4_t vsha1cq_u32 (uint32x4_t, uint32_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha1c.32 Q0, Q1, Q2' + + * uint32x4_t vsha1pq_u32 (uint32x4_t, uint32_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha1p.32 Q0, Q1, Q2' + + * uint32x4_t vsha1mq_u32 (uint32x4_t, uint32_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha1m.32 Q0, Q1, Q2' + + * uint32x4_t vsha1su0q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha1su0.32 Q0, Q1, Q2' + + * uint32x4_t vsha1su1q_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha1su1.32 Q0, Q1, Q2' + + * uint32x4_t vsha256hq_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha256h.32 Q0, Q1, Q2' + + * uint32x4_t vsha256h2q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha256h2.32 Q0, Q1, Q2' + + * uint32x4_t vsha256su0q_u32 (uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha256su0.32 Q0, Q1' + + * uint32x4_t vsha256su1q_u32 (uint32x4_t, uint32x4_t, uint32x4_t) + _Form of expected instruction(s):_ 'sha256su1.32 Q0, Q1, Q2' + + * poly128_t vmull_p64 (poly64_t a, poly64_t b) + _Form of expected instruction(s):_ 'vmull.p64 Q0, D1, D2' + + * poly128_t vmull_high_p64 (poly64x2_t a, poly64x2_t b) + _Form of expected instruction(s):_ 'vmull.p64 Q0, D1, D2' + + +File: gcc.info, Node: ARM ACLE Intrinsics, Next: AVR Built-in Functions, Prev: ARM NEON Intrinsics, Up: Target Builtins + +6.57.7 ARM ACLE Intrinsics +-------------------------- + +These built-in intrinsics for the ARMv8-A CRC32 extension are available +when the '-march=armv8-a+crc' switch is used: + +6.57.7.1 CRC32 intrinsics +......................... + + * uint32_t __crc32b (uint32_t, uint8_t) + _Form of expected instruction(s):_ 'crc32b R0, R0, R0' + + * uint32_t __crc32h (uint32_t, uint16_t) + _Form of expected instruction(s):_ 'crc32h R0, R0, R0' + + * uint32_t __crc32w (uint32_t, uint32_t) + _Form of expected instruction(s):_ 'crc32w R0, R0, R0' + + * uint32_t __crc32d (uint32_t, uint64_t) + _Form of expected instruction(s):_ Two 'crc32w R0, R0, R0' + instructions for AArch32. One 'crc32w W0, W0, X0' instruction for + AArch64. + + * uint32_t __crc32cb (uint32_t, uint8_t) + _Form of expected instruction(s):_ 'crc32cb R0, R0, R0' + + * uint32_t __crc32ch (uint32_t, uint16_t) + _Form of expected instruction(s):_ 'crc32ch R0, R0, R0' + + * uint32_t __crc32cw (uint32_t, uint32_t) + _Form of expected instruction(s):_ 'crc32cw R0, R0, R0' + + * uint32_t __crc32cd (uint32_t, uint64_t) + _Form of expected instruction(s):_ Two 'crc32cw R0, R0, R0' + instructions for AArch32. One 'crc32cw W0, W0, X0' instruction for + AArch64. + + +File: gcc.info, Node: AVR Built-in Functions, Next: Blackfin Built-in Functions, Prev: ARM ACLE Intrinsics, Up: Target Builtins + +6.57.8 AVR Built-in Functions +----------------------------- + +For each built-in function for AVR, there is an equally named, uppercase +built-in macro defined. That way users can easily query if or if not a +specific built-in is implemented or not. For example, if +'__builtin_avr_nop' is available the macro '__BUILTIN_AVR_NOP' is +defined to '1' and undefined otherwise. + + The following built-in functions map to the respective machine +instruction, i.e. 'nop', 'sei', 'cli', 'sleep', 'wdr', 'swap', 'fmul', +'fmuls' resp. 'fmulsu'. The three 'fmul*' built-ins are implemented as +library call if no hardware multiplier is available. + + void __builtin_avr_nop (void) + void __builtin_avr_sei (void) + void __builtin_avr_cli (void) + void __builtin_avr_sleep (void) + void __builtin_avr_wdr (void) + unsigned char __builtin_avr_swap (unsigned char) + unsigned int __builtin_avr_fmul (unsigned char, unsigned char) + int __builtin_avr_fmuls (char, char) + int __builtin_avr_fmulsu (char, unsigned char) + + In order to delay execution for a specific number of cycles, GCC +implements + void __builtin_avr_delay_cycles (unsigned long ticks) + +'ticks' is the number of ticks to delay execution. Note that this +built-in does not take into account the effect of interrupts that might +increase delay time. 'ticks' must be a compile-time integer constant; +delays with a variable number of cycles are not supported. + + char __builtin_avr_flash_segment (const __memx void*) + +This built-in takes a byte address to the 24-bit *note address space: +AVR Named Address Spaces. '__memx' and returns the number of the flash +segment (the 64 KiB chunk) where the address points to. Counting starts +at '0'. If the address does not point to flash memory, return '-1'. + + unsigned char __builtin_avr_insert_bits (unsigned long map, unsigned char bits, unsigned char val) + +Insert bits from BITS into VAL and return the resulting value. The +nibbles of MAP determine how the insertion is performed: Let X be the +N-th nibble of MAP + 1. If X is '0xf', then the N-th bit of VAL is returned unaltered. + + 2. If X is in the range 0...7, then the N-th result bit is set to the + X-th bit of BITS + + 3. If X is in the range 8...'0xe', then the N-th result bit is + undefined. + +One typical use case for this built-in is adjusting input and output +values to non-contiguous port layouts. Some examples: + + // same as val, bits is unused + __builtin_avr_insert_bits (0xffffffff, bits, val) + + // same as bits, val is unused + __builtin_avr_insert_bits (0x76543210, bits, val) + + // same as rotating bits by 4 + __builtin_avr_insert_bits (0x32107654, bits, 0) + + // high nibble of result is the high nibble of val + // low nibble of result is the low nibble of bits + __builtin_avr_insert_bits (0xffff3210, bits, val) + + // reverse the bit order of bits + __builtin_avr_insert_bits (0x01234567, bits, 0) + + +File: gcc.info, Node: Blackfin Built-in Functions, Next: FR-V Built-in Functions, Prev: AVR Built-in Functions, Up: Target Builtins + +6.57.9 Blackfin Built-in Functions +---------------------------------- + +Currently, there are two Blackfin-specific built-in functions. These +are used for generating 'CSYNC' and 'SSYNC' machine insns without using +inline assembly; by using these built-in functions the compiler can +automatically add workarounds for hardware errata involving these +instructions. These functions are named as follows: + + void __builtin_bfin_csync (void) + void __builtin_bfin_ssync (void) + + +File: gcc.info, Node: FR-V Built-in Functions, Next: X86 Built-in Functions, Prev: Blackfin Built-in Functions, Up: Target Builtins + +6.57.10 FR-V Built-in Functions +------------------------------- + +GCC provides many FR-V-specific built-in functions. In general, these +functions are intended to be compatible with those described by 'FR-V +Family, Softune C/C++ Compiler Manual (V6), Fujitsu Semiconductor'. The +two exceptions are '__MDUNPACKH' and '__MBTOHE', the GCC forms of which +pass 128-bit values by pointer rather than by value. + + Most of the functions are named after specific FR-V instructions. Such +functions are said to be "directly mapped" and are summarized here in +tabular form. + +* Menu: + +* Argument Types:: +* Directly-mapped Integer Functions:: +* Directly-mapped Media Functions:: +* Raw read/write Functions:: +* Other Built-in Functions:: + + +File: gcc.info, Node: Argument Types, Next: Directly-mapped Integer Functions, Up: FR-V Built-in Functions + +6.57.10.1 Argument Types +........................ + +The arguments to the built-in functions can be divided into three +groups: register numbers, compile-time constants and run-time values. +In order to make this classification clear at a glance, the arguments +and return values are given the following pseudo types: + +Pseudo type Real C type Constant? Description +'uh' 'unsigned short' No an unsigned halfword +'uw1' 'unsigned int' No an unsigned word +'sw1' 'int' No a signed word +'uw2' 'unsigned long long' No an unsigned doubleword +'sw2' 'long long' No a signed doubleword +'const' 'int' Yes an integer constant +'acc' 'int' Yes an ACC register number +'iacc' 'int' Yes an IACC register number + + These pseudo types are not defined by GCC, they are simply a notational +convenience used in this manual. + + Arguments of type 'uh', 'uw1', 'sw1', 'uw2' and 'sw2' are evaluated at +run time. They correspond to register operands in the underlying FR-V +instructions. + + 'const' arguments represent immediate operands in the underlying FR-V +instructions. They must be compile-time constants. + + 'acc' arguments are evaluated at compile time and specify the number of +an accumulator register. For example, an 'acc' argument of 2 selects +the ACC2 register. + + 'iacc' arguments are similar to 'acc' arguments but specify the number +of an IACC register. See *note Other Built-in Functions:: for more +details. + + +File: gcc.info, Node: Directly-mapped Integer Functions, Next: Directly-mapped Media Functions, Prev: Argument Types, Up: FR-V Built-in Functions + +6.57.10.2 Directly-mapped Integer Functions +........................................... + +The functions listed below map directly to FR-V I-type instructions. + +Function prototype Example usage Assembly output +'sw1 __ADDSS (sw1, sw1)' 'C = __ADDSS (A, B)' 'ADDSS A,B,C' +'sw1 __SCAN (sw1, sw1)' 'C = __SCAN (A, B)' 'SCAN A,B,C' +'sw1 __SCUTSS (sw1)' 'B = __SCUTSS (A)' 'SCUTSS A,B' +'sw1 __SLASS (sw1, sw1)' 'C = __SLASS (A, B)' 'SLASS A,B,C' +'void __SMASS (sw1, sw1)' '__SMASS (A, B)' 'SMASS A,B' +'void __SMSSS (sw1, sw1)' '__SMSSS (A, B)' 'SMSSS A,B' +'void __SMU (sw1, sw1)' '__SMU (A, B)' 'SMU A,B' +'sw2 __SMUL (sw1, sw1)' 'C = __SMUL (A, B)' 'SMUL A,B,C' +'sw1 __SUBSS (sw1, sw1)' 'C = __SUBSS (A, B)' 'SUBSS A,B,C' +'uw2 __UMUL (uw1, uw1)' 'C = __UMUL (A, B)' 'UMUL A,B,C' + + +File: gcc.info, Node: Directly-mapped Media Functions, Next: Raw read/write Functions, Prev: Directly-mapped Integer Functions, Up: FR-V Built-in Functions + +6.57.10.3 Directly-mapped Media Functions +......................................... + +The functions listed below map directly to FR-V M-type instructions. + +Function prototype Example usage Assembly output +'uw1 __MABSHS (sw1)' 'B = __MABSHS (A)' 'MABSHS A,B' +'void __MADDACCS (acc, acc)' '__MADDACCS (B, A)' 'MADDACCS A,B' +'sw1 __MADDHSS (sw1, sw1)' 'C = __MADDHSS (A, 'MADDHSS A,B,C' + B)' +'uw1 __MADDHUS (uw1, uw1)' 'C = __MADDHUS (A, 'MADDHUS A,B,C' + B)' +'uw1 __MAND (uw1, uw1)' 'C = __MAND (A, B)' 'MAND A,B,C' +'void __MASACCS (acc, acc)' '__MASACCS (B, A)' 'MASACCS A,B' +'uw1 __MAVEH (uw1, uw1)' 'C = __MAVEH (A, B)' 'MAVEH A,B,C' +'uw2 __MBTOH (uw1)' 'B = __MBTOH (A)' 'MBTOH A,B' +'void __MBTOHE (uw1 *, uw1)' '__MBTOHE (&B, A)' 'MBTOHE A,B' +'void __MCLRACC (acc)' '__MCLRACC (A)' 'MCLRACC A' +'void __MCLRACCA (void)' '__MCLRACCA ()' 'MCLRACCA' +'uw1 __Mcop1 (uw1, uw1)' 'C = __Mcop1 (A, B)' 'Mcop1 A,B,C' +'uw1 __Mcop2 (uw1, uw1)' 'C = __Mcop2 (A, B)' 'Mcop2 A,B,C' +'uw1 __MCPLHI (uw2, const)' 'C = __MCPLHI (A, B)' 'MCPLHI A,#B,C' +'uw1 __MCPLI (uw2, const)' 'C = __MCPLI (A, B)' 'MCPLI A,#B,C' +'void __MCPXIS (acc, sw1, '__MCPXIS (C, A, B)' 'MCPXIS A,B,C' +sw1)' +'void __MCPXIU (acc, uw1, '__MCPXIU (C, A, B)' 'MCPXIU A,B,C' +uw1)' +'void __MCPXRS (acc, sw1, '__MCPXRS (C, A, B)' 'MCPXRS A,B,C' +sw1)' +'void __MCPXRU (acc, uw1, '__MCPXRU (C, A, B)' 'MCPXRU A,B,C' +uw1)' +'uw1 __MCUT (acc, uw1)' 'C = __MCUT (A, B)' 'MCUT A,B,C' +'uw1 __MCUTSS (acc, sw1)' 'C = __MCUTSS (A, B)' 'MCUTSS A,B,C' +'void __MDADDACCS (acc, acc)' '__MDADDACCS (B, A)' 'MDADDACCS A,B' +'void __MDASACCS (acc, acc)' '__MDASACCS (B, A)' 'MDASACCS A,B' +'uw2 __MDCUTSSI (acc, const)' 'C = __MDCUTSSI (A, 'MDCUTSSI + B)' A,#B,C' +'uw2 __MDPACKH (uw2, uw2)' 'C = __MDPACKH (A, 'MDPACKH A,B,C' + B)' +'uw2 __MDROTLI (uw2, const)' 'C = __MDROTLI (A, 'MDROTLI + B)' A,#B,C' +'void __MDSUBACCS (acc, acc)' '__MDSUBACCS (B, A)' 'MDSUBACCS A,B' +'void __MDUNPACKH (uw1 *, '__MDUNPACKH (&B, A)' 'MDUNPACKH A,B' +uw2)' +'uw2 __MEXPDHD (uw1, const)' 'C = __MEXPDHD (A, 'MEXPDHD + B)' A,#B,C' +'uw1 __MEXPDHW (uw1, const)' 'C = __MEXPDHW (A, 'MEXPDHW + B)' A,#B,C' +'uw1 __MHDSETH (uw1, const)' 'C = __MHDSETH (A, 'MHDSETH + B)' A,#B,C' +'sw1 __MHDSETS (const)' 'B = __MHDSETS (A)' 'MHDSETS #A,B' +'uw1 __MHSETHIH (uw1, const)' 'B = __MHSETHIH (B, 'MHSETHIH #A,B' + A)' +'sw1 __MHSETHIS (sw1, const)' 'B = __MHSETHIS (B, 'MHSETHIS #A,B' + A)' +'uw1 __MHSETLOH (uw1, const)' 'B = __MHSETLOH (B, 'MHSETLOH #A,B' + A)' +'sw1 __MHSETLOS (sw1, const)' 'B = __MHSETLOS (B, 'MHSETLOS #A,B' + A)' +'uw1 __MHTOB (uw2)' 'B = __MHTOB (A)' 'MHTOB A,B' +'void __MMACHS (acc, sw1, '__MMACHS (C, A, B)' 'MMACHS A,B,C' +sw1)' +'void __MMACHU (acc, uw1, '__MMACHU (C, A, B)' 'MMACHU A,B,C' +uw1)' +'void __MMRDHS (acc, sw1, '__MMRDHS (C, A, B)' 'MMRDHS A,B,C' +sw1)' +'void __MMRDHU (acc, uw1, '__MMRDHU (C, A, B)' 'MMRDHU A,B,C' +uw1)' +'void __MMULHS (acc, sw1, '__MMULHS (C, A, B)' 'MMULHS A,B,C' +sw1)' +'void __MMULHU (acc, uw1, '__MMULHU (C, A, B)' 'MMULHU A,B,C' +uw1)' +'void __MMULXHS (acc, sw1, '__MMULXHS (C, A, B)' 'MMULXHS A,B,C' +sw1)' +'void __MMULXHU (acc, uw1, '__MMULXHU (C, A, B)' 'MMULXHU A,B,C' +uw1)' +'uw1 __MNOT (uw1)' 'B = __MNOT (A)' 'MNOT A,B' +'uw1 __MOR (uw1, uw1)' 'C = __MOR (A, B)' 'MOR A,B,C' +'uw1 __MPACKH (uh, uh)' 'C = __MPACKH (A, B)' 'MPACKH A,B,C' +'sw2 __MQADDHSS (sw2, sw2)' 'C = __MQADDHSS (A, 'MQADDHSS + B)' A,B,C' +'uw2 __MQADDHUS (uw2, uw2)' 'C = __MQADDHUS (A, 'MQADDHUS + B)' A,B,C' +'void __MQCPXIS (acc, sw2, '__MQCPXIS (C, A, B)' 'MQCPXIS A,B,C' +sw2)' +'void __MQCPXIU (acc, uw2, '__MQCPXIU (C, A, B)' 'MQCPXIU A,B,C' +uw2)' +'void __MQCPXRS (acc, sw2, '__MQCPXRS (C, A, B)' 'MQCPXRS A,B,C' +sw2)' +'void __MQCPXRU (acc, uw2, '__MQCPXRU (C, A, B)' 'MQCPXRU A,B,C' +uw2)' +'sw2 __MQLCLRHS (sw2, sw2)' 'C = __MQLCLRHS (A, 'MQLCLRHS + B)' A,B,C' +'sw2 __MQLMTHS (sw2, sw2)' 'C = __MQLMTHS (A, 'MQLMTHS A,B,C' + B)' +'void __MQMACHS (acc, sw2, '__MQMACHS (C, A, B)' 'MQMACHS A,B,C' +sw2)' +'void __MQMACHU (acc, uw2, '__MQMACHU (C, A, B)' 'MQMACHU A,B,C' +uw2)' +'void __MQMACXHS (acc, sw2, '__MQMACXHS (C, A, 'MQMACXHS +sw2)' B)' A,B,C' +'void __MQMULHS (acc, sw2, '__MQMULHS (C, A, B)' 'MQMULHS A,B,C' +sw2)' +'void __MQMULHU (acc, uw2, '__MQMULHU (C, A, B)' 'MQMULHU A,B,C' +uw2)' +'void __MQMULXHS (acc, sw2, '__MQMULXHS (C, A, 'MQMULXHS +sw2)' B)' A,B,C' +'void __MQMULXHU (acc, uw2, '__MQMULXHU (C, A, 'MQMULXHU +uw2)' B)' A,B,C' +'sw2 __MQSATHS (sw2, sw2)' 'C = __MQSATHS (A, 'MQSATHS A,B,C' + B)' +'uw2 __MQSLLHI (uw2, int)' 'C = __MQSLLHI (A, 'MQSLLHI A,B,C' + B)' +'sw2 __MQSRAHI (sw2, int)' 'C = __MQSRAHI (A, 'MQSRAHI A,B,C' + B)' +'sw2 __MQSUBHSS (sw2, sw2)' 'C = __MQSUBHSS (A, 'MQSUBHSS + B)' A,B,C' +'uw2 __MQSUBHUS (uw2, uw2)' 'C = __MQSUBHUS (A, 'MQSUBHUS + B)' A,B,C' +'void __MQXMACHS (acc, sw2, '__MQXMACHS (C, A, 'MQXMACHS +sw2)' B)' A,B,C' +'void __MQXMACXHS (acc, sw2, '__MQXMACXHS (C, A, 'MQXMACXHS +sw2)' B)' A,B,C' +'uw1 __MRDACC (acc)' 'B = __MRDACC (A)' 'MRDACC A,B' +'uw1 __MRDACCG (acc)' 'B = __MRDACCG (A)' 'MRDACCG A,B' +'uw1 __MROTLI (uw1, const)' 'C = __MROTLI (A, B)' 'MROTLI A,#B,C' +'uw1 __MROTRI (uw1, const)' 'C = __MROTRI (A, B)' 'MROTRI A,#B,C' +'sw1 __MSATHS (sw1, sw1)' 'C = __MSATHS (A, B)' 'MSATHS A,B,C' +'uw1 __MSATHU (uw1, uw1)' 'C = __MSATHU (A, B)' 'MSATHU A,B,C' +'uw1 __MSLLHI (uw1, const)' 'C = __MSLLHI (A, B)' 'MSLLHI A,#B,C' +'sw1 __MSRAHI (sw1, const)' 'C = __MSRAHI (A, B)' 'MSRAHI A,#B,C' +'uw1 __MSRLHI (uw1, const)' 'C = __MSRLHI (A, B)' 'MSRLHI A,#B,C' +'void __MSUBACCS (acc, acc)' '__MSUBACCS (B, A)' 'MSUBACCS A,B' +'sw1 __MSUBHSS (sw1, sw1)' 'C = __MSUBHSS (A, 'MSUBHSS A,B,C' + B)' +'uw1 __MSUBHUS (uw1, uw1)' 'C = __MSUBHUS (A, 'MSUBHUS A,B,C' + B)' +'void __MTRAP (void)' '__MTRAP ()' 'MTRAP' +'uw2 __MUNPACKH (uw1)' 'B = __MUNPACKH (A)' 'MUNPACKH A,B' +'uw1 __MWCUT (uw2, uw1)' 'C = __MWCUT (A, B)' 'MWCUT A,B,C' +'void __MWTACC (acc, uw1)' '__MWTACC (B, A)' 'MWTACC A,B' +'void __MWTACCG (acc, uw1)' '__MWTACCG (B, A)' 'MWTACCG A,B' +'uw1 __MXOR (uw1, uw1)' 'C = __MXOR (A, B)' 'MXOR A,B,C' + + +File: gcc.info, Node: Raw read/write Functions, Next: Other Built-in Functions, Prev: Directly-mapped Media Functions, Up: FR-V Built-in Functions + +6.57.10.4 Raw read/write Functions +.................................. + +This sections describes built-in functions related to read and write +instructions to access memory. These functions generate 'membar' +instructions to flush the I/O load and stores where appropriate, as +described in Fujitsu's manual described above. + +'unsigned char __builtin_read8 (void *DATA)' +'unsigned short __builtin_read16 (void *DATA)' +'unsigned long __builtin_read32 (void *DATA)' +'unsigned long long __builtin_read64 (void *DATA)' + +'void __builtin_write8 (void *DATA, unsigned char DATUM)' +'void __builtin_write16 (void *DATA, unsigned short DATUM)' +'void __builtin_write32 (void *DATA, unsigned long DATUM)' +'void __builtin_write64 (void *DATA, unsigned long long DATUM)' + + +File: gcc.info, Node: Other Built-in Functions, Prev: Raw read/write Functions, Up: FR-V Built-in Functions + +6.57.10.5 Other Built-in Functions +.................................. + +This section describes built-in functions that are not named after a +specific FR-V instruction. + +'sw2 __IACCreadll (iacc REG)' + Return the full 64-bit value of IACC0. The REG argument is + reserved for future expansion and must be 0. + +'sw1 __IACCreadl (iacc REG)' + Return the value of IACC0H if REG is 0 and IACC0L if REG is 1. + Other values of REG are rejected as invalid. + +'void __IACCsetll (iacc REG, sw2 X)' + Set the full 64-bit value of IACC0 to X. The REG argument is + reserved for future expansion and must be 0. + +'void __IACCsetl (iacc REG, sw1 X)' + Set IACC0H to X if REG is 0 and IACC0L to X if REG is 1. Other + values of REG are rejected as invalid. + +'void __data_prefetch0 (const void *X)' + Use the 'dcpl' instruction to load the contents of address X into + the data cache. + +'void __data_prefetch (const void *X)' + Use the 'nldub' instruction to load the contents of address X into + the data cache. The instruction is issued in slot I1. + + +File: gcc.info, Node: X86 Built-in Functions, Next: X86 transactional memory intrinsics, Prev: FR-V Built-in Functions, Up: Target Builtins + +6.57.11 X86 Built-in Functions +------------------------------ + +These built-in functions are available for the i386 and x86-64 family of +computers, depending on the command-line switches used. + + If you specify command-line switches such as '-msse', the compiler +could use the extended instruction sets even if the built-ins are not +used explicitly in the program. For this reason, applications that +perform run-time CPU detection must compile separate files for each +supported architecture, using the appropriate flags. In particular, the +file containing the CPU detection code should be compiled without these +options. + + The following machine modes are available for use with MMX built-in +functions (*note Vector Extensions::): 'V2SI' for a vector of two 32-bit +integers, 'V4HI' for a vector of four 16-bit integers, and 'V8QI' for a +vector of eight 8-bit integers. Some of the built-in functions operate +on MMX registers as a whole 64-bit entity, these use 'V1DI' as their +mode. + + If 3DNow! extensions are enabled, 'V2SF' is used as a mode for a vector +of two 32-bit floating-point values. + + If SSE extensions are enabled, 'V4SF' is used for a vector of four +32-bit floating-point values. Some instructions use a vector of four +32-bit integers, these use 'V4SI'. Finally, some instructions operate +on an entire vector register, interpreting it as a 128-bit integer, +these use mode 'TI'. + + In 64-bit mode, the x86-64 family of processors uses additional +built-in functions for efficient use of 'TF' ('__float128') 128-bit +floating point and 'TC' 128-bit complex floating-point values. + + The following floating-point built-in functions are available in 64-bit +mode. 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 function is always available. + +'void __builtin_ia32_pause (void)' + Generates the 'pause' machine instruction with a compiler memory + barrier. + + The following floating-point built-in functions are made available in +the 64-bit mode. + +'__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'. + + The following built-in functions are always available and can be used +to check the target platform type. + + -- Built-in Function: void __builtin_cpu_init (void) + This function runs the CPU detection code to check the type of CPU + and the features supported. This built-in function needs to be + invoked along with the built-in functions to check CPU type and + features, '__builtin_cpu_is' and '__builtin_cpu_supports', only + when used in a function that is executed before any constructors + are called. The CPU detection code is automatically executed in a + very high priority constructor. + + For example, this function has to be used in 'ifunc' resolvers that + check for CPU type using the built-in functions '__builtin_cpu_is' + and '__builtin_cpu_supports', or in constructors on targets that + don't support constructor priority. + + static void (*resolve_memcpy (void)) (void) + { + // ifunc resolvers fire before constructors, explicitly call the init + // function. + __builtin_cpu_init (); + if (__builtin_cpu_supports ("ssse3")) + return ssse3_memcpy; // super fast memcpy with ssse3 instructions. + else + return default_memcpy; + } + + void *memcpy (void *, const void *, size_t) + __attribute__ ((ifunc ("resolve_memcpy"))); + + -- Built-in Function: int __builtin_cpu_is (const char *CPUNAME) + This function returns a positive integer if the run-time CPU is of + type CPUNAME and returns '0' otherwise. The following CPU names + can be detected: + + 'intel' + Intel CPU. + + 'atom' + Intel Atom CPU. + + 'core2' + Intel Core 2 CPU. + + 'corei7' + Intel Core i7 CPU. + + 'nehalem' + Intel Core i7 Nehalem CPU. + + 'westmere' + Intel Core i7 Westmere CPU. + + 'sandybridge' + Intel Core i7 Sandy Bridge CPU. + + 'amd' + AMD CPU. + + 'amdfam10h' + AMD Family 10h CPU. + + 'barcelona' + AMD Family 10h Barcelona CPU. + + 'shanghai' + AMD Family 10h Shanghai CPU. + + 'istanbul' + AMD Family 10h Istanbul CPU. + + 'btver1' + AMD Family 14h CPU. + + 'amdfam15h' + AMD Family 15h CPU. + + 'bdver1' + AMD Family 15h Bulldozer version 1. + + 'bdver2' + AMD Family 15h Bulldozer version 2. + + 'bdver3' + AMD Family 15h Bulldozer version 3. + + 'bdver4' + AMD Family 15h Bulldozer version 4. + + 'btver2' + AMD Family 16h CPU. + + Here is an example: + if (__builtin_cpu_is ("corei7")) + { + do_corei7 (); // Core i7 specific implementation. + } + else + { + do_generic (); // Generic implementation. + } + + -- Built-in Function: int __builtin_cpu_supports (const char *FEATURE) + This function returns a positive integer if the run-time CPU + supports FEATURE and returns '0' otherwise. The following features + can be detected: + + 'cmov' + CMOV instruction. + 'mmx' + MMX instructions. + 'popcnt' + POPCNT instruction. + 'sse' + SSE instructions. + 'sse2' + SSE2 instructions. + 'sse3' + SSE3 instructions. + 'ssse3' + SSSE3 instructions. + 'sse4.1' + SSE4.1 instructions. + 'sse4.2' + SSE4.2 instructions. + 'avx' + AVX instructions. + 'avx2' + AVX2 instructions. + + Here is an example: + if (__builtin_cpu_supports ("popcnt")) + { + asm("popcnt %1,%0" : "=r"(count) : "rm"(n) : "cc"); + } + else + { + count = generic_countbits (n); //generic implementation. + } + + The following built-in functions are made available by '-mmmx'. All of +them generate the machine instruction that is part of the name. + + v8qi __builtin_ia32_paddb (v8qi, v8qi) + v4hi __builtin_ia32_paddw (v4hi, v4hi) + v2si __builtin_ia32_paddd (v2si, v2si) + v8qi __builtin_ia32_psubb (v8qi, v8qi) + v4hi __builtin_ia32_psubw (v4hi, v4hi) + v2si __builtin_ia32_psubd (v2si, v2si) + v8qi __builtin_ia32_paddsb (v8qi, v8qi) + v4hi __builtin_ia32_paddsw (v4hi, v4hi) + v8qi __builtin_ia32_psubsb (v8qi, v8qi) + v4hi __builtin_ia32_psubsw (v4hi, v4hi) + v8qi __builtin_ia32_paddusb (v8qi, v8qi) + v4hi __builtin_ia32_paddusw (v4hi, v4hi) + v8qi __builtin_ia32_psubusb (v8qi, v8qi) + v4hi __builtin_ia32_psubusw (v4hi, v4hi) + v4hi __builtin_ia32_pmullw (v4hi, v4hi) + v4hi __builtin_ia32_pmulhw (v4hi, v4hi) + di __builtin_ia32_pand (di, di) + di __builtin_ia32_pandn (di,di) + di __builtin_ia32_por (di, di) + di __builtin_ia32_pxor (di, di) + v8qi __builtin_ia32_pcmpeqb (v8qi, v8qi) + v4hi __builtin_ia32_pcmpeqw (v4hi, v4hi) + v2si __builtin_ia32_pcmpeqd (v2si, v2si) + v8qi __builtin_ia32_pcmpgtb (v8qi, v8qi) + v4hi __builtin_ia32_pcmpgtw (v4hi, v4hi) + v2si __builtin_ia32_pcmpgtd (v2si, v2si) + v8qi __builtin_ia32_punpckhbw (v8qi, v8qi) + v4hi __builtin_ia32_punpckhwd (v4hi, v4hi) + v2si __builtin_ia32_punpckhdq (v2si, v2si) + v8qi __builtin_ia32_punpcklbw (v8qi, v8qi) + v4hi __builtin_ia32_punpcklwd (v4hi, v4hi) + v2si __builtin_ia32_punpckldq (v2si, v2si) + v8qi __builtin_ia32_packsswb (v4hi, v4hi) + v4hi __builtin_ia32_packssdw (v2si, v2si) + v8qi __builtin_ia32_packuswb (v4hi, v4hi) + + v4hi __builtin_ia32_psllw (v4hi, v4hi) + v2si __builtin_ia32_pslld (v2si, v2si) + v1di __builtin_ia32_psllq (v1di, v1di) + v4hi __builtin_ia32_psrlw (v4hi, v4hi) + v2si __builtin_ia32_psrld (v2si, v2si) + v1di __builtin_ia32_psrlq (v1di, v1di) + v4hi __builtin_ia32_psraw (v4hi, v4hi) + v2si __builtin_ia32_psrad (v2si, v2si) + v4hi __builtin_ia32_psllwi (v4hi, int) + v2si __builtin_ia32_pslldi (v2si, int) + v1di __builtin_ia32_psllqi (v1di, int) + v4hi __builtin_ia32_psrlwi (v4hi, int) + v2si __builtin_ia32_psrldi (v2si, int) + v1di __builtin_ia32_psrlqi (v1di, int) + v4hi __builtin_ia32_psrawi (v4hi, int) + v2si __builtin_ia32_psradi (v2si, int) + + The following built-in functions are made available either with +'-msse', or with a combination of '-m3dnow' and '-march=athlon'. All of +them generate the machine instruction that is part of the name. + + v4hi __builtin_ia32_pmulhuw (v4hi, v4hi) + v8qi __builtin_ia32_pavgb (v8qi, v8qi) + v4hi __builtin_ia32_pavgw (v4hi, v4hi) + v1di __builtin_ia32_psadbw (v8qi, v8qi) + v8qi __builtin_ia32_pmaxub (v8qi, v8qi) + v4hi __builtin_ia32_pmaxsw (v4hi, v4hi) + v8qi __builtin_ia32_pminub (v8qi, v8qi) + v4hi __builtin_ia32_pminsw (v4hi, v4hi) + int __builtin_ia32_pmovmskb (v8qi) + void __builtin_ia32_maskmovq (v8qi, v8qi, char *) + void __builtin_ia32_movntq (di *, di) + void __builtin_ia32_sfence (void) + + The following built-in functions are available when '-msse' is used. +All of them generate the machine instruction that is part of the name. + + int __builtin_ia32_comieq (v4sf, v4sf) + int __builtin_ia32_comineq (v4sf, v4sf) + int __builtin_ia32_comilt (v4sf, v4sf) + int __builtin_ia32_comile (v4sf, v4sf) + int __builtin_ia32_comigt (v4sf, v4sf) + int __builtin_ia32_comige (v4sf, v4sf) + int __builtin_ia32_ucomieq (v4sf, v4sf) + int __builtin_ia32_ucomineq (v4sf, v4sf) + int __builtin_ia32_ucomilt (v4sf, v4sf) + int __builtin_ia32_ucomile (v4sf, v4sf) + int __builtin_ia32_ucomigt (v4sf, v4sf) + int __builtin_ia32_ucomige (v4sf, v4sf) + v4sf __builtin_ia32_addps (v4sf, v4sf) + v4sf __builtin_ia32_subps (v4sf, v4sf) + v4sf __builtin_ia32_mulps (v4sf, v4sf) + v4sf __builtin_ia32_divps (v4sf, v4sf) + v4sf __builtin_ia32_addss (v4sf, v4sf) + v4sf __builtin_ia32_subss (v4sf, v4sf) + v4sf __builtin_ia32_mulss (v4sf, v4sf) + v4sf __builtin_ia32_divss (v4sf, v4sf) + v4sf __builtin_ia32_cmpeqps (v4sf, v4sf) + v4sf __builtin_ia32_cmpltps (v4sf, v4sf) + v4sf __builtin_ia32_cmpleps (v4sf, v4sf) + v4sf __builtin_ia32_cmpgtps (v4sf, v4sf) + v4sf __builtin_ia32_cmpgeps (v4sf, v4sf) + v4sf __builtin_ia32_cmpunordps (v4sf, v4sf) + v4sf __builtin_ia32_cmpneqps (v4sf, v4sf) + v4sf __builtin_ia32_cmpnltps (v4sf, v4sf) + v4sf __builtin_ia32_cmpnleps (v4sf, v4sf) + v4sf __builtin_ia32_cmpngtps (v4sf, v4sf) + v4sf __builtin_ia32_cmpngeps (v4sf, v4sf) + v4sf __builtin_ia32_cmpordps (v4sf, v4sf) + v4sf __builtin_ia32_cmpeqss (v4sf, v4sf) + v4sf __builtin_ia32_cmpltss (v4sf, v4sf) + v4sf __builtin_ia32_cmpless (v4sf, v4sf) + v4sf __builtin_ia32_cmpunordss (v4sf, v4sf) + v4sf __builtin_ia32_cmpneqss (v4sf, v4sf) + v4sf __builtin_ia32_cmpnltss (v4sf, v4sf) + v4sf __builtin_ia32_cmpnless (v4sf, v4sf) + v4sf __builtin_ia32_cmpordss (v4sf, v4sf) + v4sf __builtin_ia32_maxps (v4sf, v4sf) + v4sf __builtin_ia32_maxss (v4sf, v4sf) + v4sf __builtin_ia32_minps (v4sf, v4sf) + v4sf __builtin_ia32_minss (v4sf, v4sf) + v4sf __builtin_ia32_andps (v4sf, v4sf) + v4sf __builtin_ia32_andnps (v4sf, v4sf) + v4sf __builtin_ia32_orps (v4sf, v4sf) + v4sf __builtin_ia32_xorps (v4sf, v4sf) + v4sf __builtin_ia32_movss (v4sf, v4sf) + v4sf __builtin_ia32_movhlps (v4sf, v4sf) + v4sf __builtin_ia32_movlhps (v4sf, v4sf) + v4sf __builtin_ia32_unpckhps (v4sf, v4sf) + v4sf __builtin_ia32_unpcklps (v4sf, v4sf) + v4sf __builtin_ia32_cvtpi2ps (v4sf, v2si) + v4sf __builtin_ia32_cvtsi2ss (v4sf, int) + v2si __builtin_ia32_cvtps2pi (v4sf) + int __builtin_ia32_cvtss2si (v4sf) + v2si __builtin_ia32_cvttps2pi (v4sf) + int __builtin_ia32_cvttss2si (v4sf) + v4sf __builtin_ia32_rcpps (v4sf) + v4sf __builtin_ia32_rsqrtps (v4sf) + v4sf __builtin_ia32_sqrtps (v4sf) + v4sf __builtin_ia32_rcpss (v4sf) + v4sf __builtin_ia32_rsqrtss (v4sf) + v4sf __builtin_ia32_sqrtss (v4sf) + v4sf __builtin_ia32_shufps (v4sf, v4sf, int) + void __builtin_ia32_movntps (float *, v4sf) + int __builtin_ia32_movmskps (v4sf) + + The following built-in functions are available when '-msse' is used. + +'v4sf __builtin_ia32_loadups (float *)' + Generates the 'movups' machine instruction as a load from memory. +'void __builtin_ia32_storeups (float *, v4sf)' + Generates the 'movups' machine instruction as a store to memory. +'v4sf __builtin_ia32_loadss (float *)' + Generates the 'movss' machine instruction as a load from memory. +'v4sf __builtin_ia32_loadhps (v4sf, const v2sf *)' + Generates the 'movhps' machine instruction as a load from memory. +'v4sf __builtin_ia32_loadlps (v4sf, const v2sf *)' + Generates the 'movlps' machine instruction as a load from memory +'void __builtin_ia32_storehps (v2sf *, v4sf)' + Generates the 'movhps' machine instruction as a store to memory. +'void __builtin_ia32_storelps (v2sf *, v4sf)' + Generates the 'movlps' machine instruction as a store to memory. + + The following built-in functions are available when '-msse2' is used. +All of them generate the machine instruction that is part of the name. + + int __builtin_ia32_comisdeq (v2df, v2df) + int __builtin_ia32_comisdlt (v2df, v2df) + int __builtin_ia32_comisdle (v2df, v2df) + int __builtin_ia32_comisdgt (v2df, v2df) + int __builtin_ia32_comisdge (v2df, v2df) + int __builtin_ia32_comisdneq (v2df, v2df) + int __builtin_ia32_ucomisdeq (v2df, v2df) + int __builtin_ia32_ucomisdlt (v2df, v2df) + int __builtin_ia32_ucomisdle (v2df, v2df) + int __builtin_ia32_ucomisdgt (v2df, v2df) + int __builtin_ia32_ucomisdge (v2df, v2df) + int __builtin_ia32_ucomisdneq (v2df, v2df) + v2df __builtin_ia32_cmpeqpd (v2df, v2df) + v2df __builtin_ia32_cmpltpd (v2df, v2df) + v2df __builtin_ia32_cmplepd (v2df, v2df) + v2df __builtin_ia32_cmpgtpd (v2df, v2df) + v2df __builtin_ia32_cmpgepd (v2df, v2df) + v2df __builtin_ia32_cmpunordpd (v2df, v2df) + v2df __builtin_ia32_cmpneqpd (v2df, v2df) + v2df __builtin_ia32_cmpnltpd (v2df, v2df) + v2df __builtin_ia32_cmpnlepd (v2df, v2df) + v2df __builtin_ia32_cmpngtpd (v2df, v2df) + v2df __builtin_ia32_cmpngepd (v2df, v2df) + v2df __builtin_ia32_cmpordpd (v2df, v2df) + v2df __builtin_ia32_cmpeqsd (v2df, v2df) + v2df __builtin_ia32_cmpltsd (v2df, v2df) + v2df __builtin_ia32_cmplesd (v2df, v2df) + v2df __builtin_ia32_cmpunordsd (v2df, v2df) + v2df __builtin_ia32_cmpneqsd (v2df, v2df) + v2df __builtin_ia32_cmpnltsd (v2df, v2df) + v2df __builtin_ia32_cmpnlesd (v2df, v2df) + v2df __builtin_ia32_cmpordsd (v2df, v2df) + v2di __builtin_ia32_paddq (v2di, v2di) + v2di __builtin_ia32_psubq (v2di, v2di) + v2df __builtin_ia32_addpd (v2df, v2df) + v2df __builtin_ia32_subpd (v2df, v2df) + v2df __builtin_ia32_mulpd (v2df, v2df) + v2df __builtin_ia32_divpd (v2df, v2df) + v2df __builtin_ia32_addsd (v2df, v2df) + v2df __builtin_ia32_subsd (v2df, v2df) + v2df __builtin_ia32_mulsd (v2df, v2df) + v2df __builtin_ia32_divsd (v2df, v2df) + v2df __builtin_ia32_minpd (v2df, v2df) + v2df __builtin_ia32_maxpd (v2df, v2df) + v2df __builtin_ia32_minsd (v2df, v2df) + v2df __builtin_ia32_maxsd (v2df, v2df) + v2df __builtin_ia32_andpd (v2df, v2df) + v2df __builtin_ia32_andnpd (v2df, v2df) + v2df __builtin_ia32_orpd (v2df, v2df) + v2df __builtin_ia32_xorpd (v2df, v2df) + v2df __builtin_ia32_movsd (v2df, v2df) + v2df __builtin_ia32_unpckhpd (v2df, v2df) + v2df __builtin_ia32_unpcklpd (v2df, v2df) + v16qi __builtin_ia32_paddb128 (v16qi, v16qi) + v8hi __builtin_ia32_paddw128 (v8hi, v8hi) + v4si __builtin_ia32_paddd128 (v4si, v4si) + v2di __builtin_ia32_paddq128 (v2di, v2di) + v16qi __builtin_ia32_psubb128 (v16qi, v16qi) + v8hi __builtin_ia32_psubw128 (v8hi, v8hi) + v4si __builtin_ia32_psubd128 (v4si, v4si) + v2di __builtin_ia32_psubq128 (v2di, v2di) + v8hi __builtin_ia32_pmullw128 (v8hi, v8hi) + v8hi __builtin_ia32_pmulhw128 (v8hi, v8hi) + v2di __builtin_ia32_pand128 (v2di, v2di) + v2di __builtin_ia32_pandn128 (v2di, v2di) + v2di __builtin_ia32_por128 (v2di, v2di) + v2di __builtin_ia32_pxor128 (v2di, v2di) + v16qi __builtin_ia32_pavgb128 (v16qi, v16qi) + v8hi __builtin_ia32_pavgw128 (v8hi, v8hi) + v16qi __builtin_ia32_pcmpeqb128 (v16qi, v16qi) + v8hi __builtin_ia32_pcmpeqw128 (v8hi, v8hi) + v4si __builtin_ia32_pcmpeqd128 (v4si, v4si) + v16qi __builtin_ia32_pcmpgtb128 (v16qi, v16qi) + v8hi __builtin_ia32_pcmpgtw128 (v8hi, v8hi) + v4si __builtin_ia32_pcmpgtd128 (v4si, v4si) + v16qi __builtin_ia32_pmaxub128 (v16qi, v16qi) + v8hi __builtin_ia32_pmaxsw128 (v8hi, v8hi) + v16qi __builtin_ia32_pminub128 (v16qi, v16qi) + v8hi __builtin_ia32_pminsw128 (v8hi, v8hi) + v16qi __builtin_ia32_punpckhbw128 (v16qi, v16qi) + v8hi __builtin_ia32_punpckhwd128 (v8hi, v8hi) + v4si __builtin_ia32_punpckhdq128 (v4si, v4si) + v2di __builtin_ia32_punpckhqdq128 (v2di, v2di) + v16qi __builtin_ia32_punpcklbw128 (v16qi, v16qi) + v8hi __builtin_ia32_punpcklwd128 (v8hi, v8hi) + v4si __builtin_ia32_punpckldq128 (v4si, v4si) + v2di __builtin_ia32_punpcklqdq128 (v2di, v2di) + v16qi __builtin_ia32_packsswb128 (v8hi, v8hi) + v8hi __builtin_ia32_packssdw128 (v4si, v4si) + v16qi __builtin_ia32_packuswb128 (v8hi, v8hi) + v8hi __builtin_ia32_pmulhuw128 (v8hi, v8hi) + void __builtin_ia32_maskmovdqu (v16qi, v16qi) + v2df __builtin_ia32_loadupd (double *) + void __builtin_ia32_storeupd (double *, v2df) + v2df __builtin_ia32_loadhpd (v2df, double const *) + v2df __builtin_ia32_loadlpd (v2df, double const *) + int __builtin_ia32_movmskpd (v2df) + int __builtin_ia32_pmovmskb128 (v16qi) + void __builtin_ia32_movnti (int *, int) + void __builtin_ia32_movnti64 (long long int *, long long int) + void __builtin_ia32_movntpd (double *, v2df) + void __builtin_ia32_movntdq (v2df *, v2df) + v4si __builtin_ia32_pshufd (v4si, int) + v8hi __builtin_ia32_pshuflw (v8hi, int) + v8hi __builtin_ia32_pshufhw (v8hi, int) + v2di __builtin_ia32_psadbw128 (v16qi, v16qi) + v2df __builtin_ia32_sqrtpd (v2df) + v2df __builtin_ia32_sqrtsd (v2df) + v2df __builtin_ia32_shufpd (v2df, v2df, int) + v2df __builtin_ia32_cvtdq2pd (v4si) + v4sf __builtin_ia32_cvtdq2ps (v4si) + v4si __builtin_ia32_cvtpd2dq (v2df) + v2si __builtin_ia32_cvtpd2pi (v2df) + v4sf __builtin_ia32_cvtpd2ps (v2df) + v4si __builtin_ia32_cvttpd2dq (v2df) + v2si __builtin_ia32_cvttpd2pi (v2df) + v2df __builtin_ia32_cvtpi2pd (v2si) + int __builtin_ia32_cvtsd2si (v2df) + int __builtin_ia32_cvttsd2si (v2df) + long long __builtin_ia32_cvtsd2si64 (v2df) + long long __builtin_ia32_cvttsd2si64 (v2df) + v4si __builtin_ia32_cvtps2dq (v4sf) + v2df __builtin_ia32_cvtps2pd (v4sf) + v4si __builtin_ia32_cvttps2dq (v4sf) + v2df __builtin_ia32_cvtsi2sd (v2df, int) + v2df __builtin_ia32_cvtsi642sd (v2df, long long) + v4sf __builtin_ia32_cvtsd2ss (v4sf, v2df) + v2df __builtin_ia32_cvtss2sd (v2df, v4sf) + void __builtin_ia32_clflush (const void *) + void __builtin_ia32_lfence (void) + void __builtin_ia32_mfence (void) + v16qi __builtin_ia32_loaddqu (const char *) + void __builtin_ia32_storedqu (char *, v16qi) + v1di __builtin_ia32_pmuludq (v2si, v2si) + v2di __builtin_ia32_pmuludq128 (v4si, v4si) + v8hi __builtin_ia32_psllw128 (v8hi, v8hi) + v4si __builtin_ia32_pslld128 (v4si, v4si) + v2di __builtin_ia32_psllq128 (v2di, v2di) + v8hi __builtin_ia32_psrlw128 (v8hi, v8hi) + v4si __builtin_ia32_psrld128 (v4si, v4si) + v2di __builtin_ia32_psrlq128 (v2di, v2di) + v8hi __builtin_ia32_psraw128 (v8hi, v8hi) + v4si __builtin_ia32_psrad128 (v4si, v4si) + v2di __builtin_ia32_pslldqi128 (v2di, int) + v8hi __builtin_ia32_psllwi128 (v8hi, int) + v4si __builtin_ia32_pslldi128 (v4si, int) + v2di __builtin_ia32_psllqi128 (v2di, int) + v2di __builtin_ia32_psrldqi128 (v2di, int) + v8hi __builtin_ia32_psrlwi128 (v8hi, int) + v4si __builtin_ia32_psrldi128 (v4si, int) + v2di __builtin_ia32_psrlqi128 (v2di, int) + v8hi __builtin_ia32_psrawi128 (v8hi, int) + v4si __builtin_ia32_psradi128 (v4si, int) + v4si __builtin_ia32_pmaddwd128 (v8hi, v8hi) + v2di __builtin_ia32_movq128 (v2di) + + The following built-in functions are available when '-msse3' is used. +All of them generate the machine instruction that is part of the name. + + v2df __builtin_ia32_addsubpd (v2df, v2df) + v4sf __builtin_ia32_addsubps (v4sf, v4sf) + v2df __builtin_ia32_haddpd (v2df, v2df) + v4sf __builtin_ia32_haddps (v4sf, v4sf) + v2df __builtin_ia32_hsubpd (v2df, v2df) + v4sf __builtin_ia32_hsubps (v4sf, v4sf) + v16qi __builtin_ia32_lddqu (char const *) + void __builtin_ia32_monitor (void *, unsigned int, unsigned int) + v4sf __builtin_ia32_movshdup (v4sf) + v4sf __builtin_ia32_movsldup (v4sf) + void __builtin_ia32_mwait (unsigned int, unsigned int) + + The following built-in functions are available when '-mssse3' is used. +All of them generate the machine instruction that is part of the name. + + v2si __builtin_ia32_phaddd (v2si, v2si) + v4hi __builtin_ia32_phaddw (v4hi, v4hi) + v4hi __builtin_ia32_phaddsw (v4hi, v4hi) + v2si __builtin_ia32_phsubd (v2si, v2si) + v4hi __builtin_ia32_phsubw (v4hi, v4hi) + v4hi __builtin_ia32_phsubsw (v4hi, v4hi) + v4hi __builtin_ia32_pmaddubsw (v8qi, v8qi) + v4hi __builtin_ia32_pmulhrsw (v4hi, v4hi) + v8qi __builtin_ia32_pshufb (v8qi, v8qi) + v8qi __builtin_ia32_psignb (v8qi, v8qi) + v2si __builtin_ia32_psignd (v2si, v2si) + v4hi __builtin_ia32_psignw (v4hi, v4hi) + v1di __builtin_ia32_palignr (v1di, v1di, int) + v8qi __builtin_ia32_pabsb (v8qi) + v2si __builtin_ia32_pabsd (v2si) + v4hi __builtin_ia32_pabsw (v4hi) + + The following built-in functions are available when '-mssse3' is used. +All of them generate the machine instruction that is part of the name. + + v4si __builtin_ia32_phaddd128 (v4si, v4si) + v8hi __builtin_ia32_phaddw128 (v8hi, v8hi) + v8hi __builtin_ia32_phaddsw128 (v8hi, v8hi) + v4si __builtin_ia32_phsubd128 (v4si, v4si) + v8hi __builtin_ia32_phsubw128 (v8hi, v8hi) + v8hi __builtin_ia32_phsubsw128 (v8hi, v8hi) + v8hi __builtin_ia32_pmaddubsw128 (v16qi, v16qi) + v8hi __builtin_ia32_pmulhrsw128 (v8hi, v8hi) + v16qi __builtin_ia32_pshufb128 (v16qi, v16qi) + v16qi __builtin_ia32_psignb128 (v16qi, v16qi) + v4si __builtin_ia32_psignd128 (v4si, v4si) + v8hi __builtin_ia32_psignw128 (v8hi, v8hi) + v2di __builtin_ia32_palignr128 (v2di, v2di, int) + v16qi __builtin_ia32_pabsb128 (v16qi) + v4si __builtin_ia32_pabsd128 (v4si) + v8hi __builtin_ia32_pabsw128 (v8hi) + + The following built-in functions are available when '-msse4.1' is used. +All of them generate the machine instruction that is part of the name. + + v2df __builtin_ia32_blendpd (v2df, v2df, const int) + v4sf __builtin_ia32_blendps (v4sf, v4sf, const int) + v2df __builtin_ia32_blendvpd (v2df, v2df, v2df) + v4sf __builtin_ia32_blendvps (v4sf, v4sf, v4sf) + v2df __builtin_ia32_dppd (v2df, v2df, const int) + v4sf __builtin_ia32_dpps (v4sf, v4sf, const int) + v4sf __builtin_ia32_insertps128 (v4sf, v4sf, const int) + v2di __builtin_ia32_movntdqa (v2di *); + v16qi __builtin_ia32_mpsadbw128 (v16qi, v16qi, const int) + v8hi __builtin_ia32_packusdw128 (v4si, v4si) + v16qi __builtin_ia32_pblendvb128 (v16qi, v16qi, v16qi) + v8hi __builtin_ia32_pblendw128 (v8hi, v8hi, const int) + v2di __builtin_ia32_pcmpeqq (v2di, v2di) + v8hi __builtin_ia32_phminposuw128 (v8hi) + v16qi __builtin_ia32_pmaxsb128 (v16qi, v16qi) + v4si __builtin_ia32_pmaxsd128 (v4si, v4si) + v4si __builtin_ia32_pmaxud128 (v4si, v4si) + v8hi __builtin_ia32_pmaxuw128 (v8hi, v8hi) + v16qi __builtin_ia32_pminsb128 (v16qi, v16qi) + v4si __builtin_ia32_pminsd128 (v4si, v4si) + v4si __builtin_ia32_pminud128 (v4si, v4si) + v8hi __builtin_ia32_pminuw128 (v8hi, v8hi) + v4si __builtin_ia32_pmovsxbd128 (v16qi) + v2di __builtin_ia32_pmovsxbq128 (v16qi) + v8hi __builtin_ia32_pmovsxbw128 (v16qi) + v2di __builtin_ia32_pmovsxdq128 (v4si) + v4si __builtin_ia32_pmovsxwd128 (v8hi) + v2di __builtin_ia32_pmovsxwq128 (v8hi) + v4si __builtin_ia32_pmovzxbd128 (v16qi) + v2di __builtin_ia32_pmovzxbq128 (v16qi) + v8hi __builtin_ia32_pmovzxbw128 (v16qi) + v2di __builtin_ia32_pmovzxdq128 (v4si) + v4si __builtin_ia32_pmovzxwd128 (v8hi) + v2di __builtin_ia32_pmovzxwq128 (v8hi) + v2di __builtin_ia32_pmuldq128 (v4si, v4si) + v4si __builtin_ia32_pmulld128 (v4si, v4si) + int __builtin_ia32_ptestc128 (v2di, v2di) + int __builtin_ia32_ptestnzc128 (v2di, v2di) + int __builtin_ia32_ptestz128 (v2di, v2di) + v2df __builtin_ia32_roundpd (v2df, const int) + v4sf __builtin_ia32_roundps (v4sf, const int) + v2df __builtin_ia32_roundsd (v2df, v2df, const int) + v4sf __builtin_ia32_roundss (v4sf, v4sf, const int) + + The following built-in functions are available when '-msse4.1' is used. + +'v4sf __builtin_ia32_vec_set_v4sf (v4sf, float, const int)' + Generates the 'insertps' machine instruction. +'int __builtin_ia32_vec_ext_v16qi (v16qi, const int)' + Generates the 'pextrb' machine instruction. +'v16qi __builtin_ia32_vec_set_v16qi (v16qi, int, const int)' + Generates the 'pinsrb' machine instruction. +'v4si __builtin_ia32_vec_set_v4si (v4si, int, const int)' + Generates the 'pinsrd' machine instruction. +'v2di __builtin_ia32_vec_set_v2di (v2di, long long, const int)' + Generates the 'pinsrq' machine instruction in 64bit mode. + + The following built-in functions are changed to generate new SSE4.1 +instructions when '-msse4.1' is used. + +'float __builtin_ia32_vec_ext_v4sf (v4sf, const int)' + Generates the 'extractps' machine instruction. +'int __builtin_ia32_vec_ext_v4si (v4si, const int)' + Generates the 'pextrd' machine instruction. +'long long __builtin_ia32_vec_ext_v2di (v2di, const int)' + Generates the 'pextrq' machine instruction in 64bit mode. + + The following built-in functions are available when '-msse4.2' is used. +All of them generate the machine instruction that is part of the name. + + v16qi __builtin_ia32_pcmpestrm128 (v16qi, int, v16qi, int, const int) + int __builtin_ia32_pcmpestri128 (v16qi, int, v16qi, int, const int) + int __builtin_ia32_pcmpestria128 (v16qi, int, v16qi, int, const int) + int __builtin_ia32_pcmpestric128 (v16qi, int, v16qi, int, const int) + int __builtin_ia32_pcmpestrio128 (v16qi, int, v16qi, int, const int) + int __builtin_ia32_pcmpestris128 (v16qi, int, v16qi, int, const int) + int __builtin_ia32_pcmpestriz128 (v16qi, int, v16qi, int, const int) + v16qi __builtin_ia32_pcmpistrm128 (v16qi, v16qi, const int) + int __builtin_ia32_pcmpistri128 (v16qi, v16qi, const int) + int __builtin_ia32_pcmpistria128 (v16qi, v16qi, const int) + int __builtin_ia32_pcmpistric128 (v16qi, v16qi, const int) + int __builtin_ia32_pcmpistrio128 (v16qi, v16qi, const int) + int __builtin_ia32_pcmpistris128 (v16qi, v16qi, const int) + int __builtin_ia32_pcmpistriz128 (v16qi, v16qi, const int) + v2di __builtin_ia32_pcmpgtq (v2di, v2di) + + The following built-in functions are available when '-msse4.2' is used. + +'unsigned int __builtin_ia32_crc32qi (unsigned int, unsigned char)' + Generates the 'crc32b' machine instruction. +'unsigned int __builtin_ia32_crc32hi (unsigned int, unsigned short)' + Generates the 'crc32w' machine instruction. +'unsigned int __builtin_ia32_crc32si (unsigned int, unsigned int)' + Generates the 'crc32l' machine instruction. +'unsigned long long __builtin_ia32_crc32di (unsigned long long, unsigned long long)' + Generates the 'crc32q' machine instruction. + + The following built-in functions are changed to generate new SSE4.2 +instructions when '-msse4.2' is used. + +'int __builtin_popcount (unsigned int)' + Generates the 'popcntl' machine instruction. +'int __builtin_popcountl (unsigned long)' + Generates the 'popcntl' or 'popcntq' machine instruction, depending + on the size of 'unsigned long'. +'int __builtin_popcountll (unsigned long long)' + Generates the 'popcntq' machine instruction. + + The following built-in functions are available when '-mavx' is used. +All of them generate the machine instruction that is part of the name. + + v4df __builtin_ia32_addpd256 (v4df,v4df) + v8sf __builtin_ia32_addps256 (v8sf,v8sf) + v4df __builtin_ia32_addsubpd256 (v4df,v4df) + v8sf __builtin_ia32_addsubps256 (v8sf,v8sf) + v4df __builtin_ia32_andnpd256 (v4df,v4df) + v8sf __builtin_ia32_andnps256 (v8sf,v8sf) + v4df __builtin_ia32_andpd256 (v4df,v4df) + v8sf __builtin_ia32_andps256 (v8sf,v8sf) + v4df __builtin_ia32_blendpd256 (v4df,v4df,int) + v8sf __builtin_ia32_blendps256 (v8sf,v8sf,int) + v4df __builtin_ia32_blendvpd256 (v4df,v4df,v4df) + v8sf __builtin_ia32_blendvps256 (v8sf,v8sf,v8sf) + v2df __builtin_ia32_cmppd (v2df,v2df,int) + v4df __builtin_ia32_cmppd256 (v4df,v4df,int) + v4sf __builtin_ia32_cmpps (v4sf,v4sf,int) + v8sf __builtin_ia32_cmpps256 (v8sf,v8sf,int) + v2df __builtin_ia32_cmpsd (v2df,v2df,int) + v4sf __builtin_ia32_cmpss (v4sf,v4sf,int) + v4df __builtin_ia32_cvtdq2pd256 (v4si) + v8sf __builtin_ia32_cvtdq2ps256 (v8si) + v4si __builtin_ia32_cvtpd2dq256 (v4df) + v4sf __builtin_ia32_cvtpd2ps256 (v4df) + v8si __builtin_ia32_cvtps2dq256 (v8sf) + v4df __builtin_ia32_cvtps2pd256 (v4sf) + v4si __builtin_ia32_cvttpd2dq256 (v4df) + v8si __builtin_ia32_cvttps2dq256 (v8sf) + v4df __builtin_ia32_divpd256 (v4df,v4df) + v8sf __builtin_ia32_divps256 (v8sf,v8sf) + v8sf __builtin_ia32_dpps256 (v8sf,v8sf,int) + v4df __builtin_ia32_haddpd256 (v4df,v4df) + v8sf __builtin_ia32_haddps256 (v8sf,v8sf) + v4df __builtin_ia32_hsubpd256 (v4df,v4df) + v8sf __builtin_ia32_hsubps256 (v8sf,v8sf) + v32qi __builtin_ia32_lddqu256 (pcchar) + v32qi __builtin_ia32_loaddqu256 (pcchar) + v4df __builtin_ia32_loadupd256 (pcdouble) + v8sf __builtin_ia32_loadups256 (pcfloat) + v2df __builtin_ia32_maskloadpd (pcv2df,v2df) + v4df __builtin_ia32_maskloadpd256 (pcv4df,v4df) + v4sf __builtin_ia32_maskloadps (pcv4sf,v4sf) + v8sf __builtin_ia32_maskloadps256 (pcv8sf,v8sf) + void __builtin_ia32_maskstorepd (pv2df,v2df,v2df) + void __builtin_ia32_maskstorepd256 (pv4df,v4df,v4df) + void __builtin_ia32_maskstoreps (pv4sf,v4sf,v4sf) + void __builtin_ia32_maskstoreps256 (pv8sf,v8sf,v8sf) + v4df __builtin_ia32_maxpd256 (v4df,v4df) + v8sf __builtin_ia32_maxps256 (v8sf,v8sf) + v4df __builtin_ia32_minpd256 (v4df,v4df) + v8sf __builtin_ia32_minps256 (v8sf,v8sf) + v4df __builtin_ia32_movddup256 (v4df) + int __builtin_ia32_movmskpd256 (v4df) + int __builtin_ia32_movmskps256 (v8sf) + v8sf __builtin_ia32_movshdup256 (v8sf) + v8sf __builtin_ia32_movsldup256 (v8sf) + v4df __builtin_ia32_mulpd256 (v4df,v4df) + v8sf __builtin_ia32_mulps256 (v8sf,v8sf) + v4df __builtin_ia32_orpd256 (v4df,v4df) + v8sf __builtin_ia32_orps256 (v8sf,v8sf) + v2df __builtin_ia32_pd_pd256 (v4df) + v4df __builtin_ia32_pd256_pd (v2df) + v4sf __builtin_ia32_ps_ps256 (v8sf) + v8sf __builtin_ia32_ps256_ps (v4sf) + int __builtin_ia32_ptestc256 (v4di,v4di,ptest) + int __builtin_ia32_ptestnzc256 (v4di,v4di,ptest) + int __builtin_ia32_ptestz256 (v4di,v4di,ptest) + v8sf __builtin_ia32_rcpps256 (v8sf) + v4df __builtin_ia32_roundpd256 (v4df,int) + v8sf __builtin_ia32_roundps256 (v8sf,int) + v8sf __builtin_ia32_rsqrtps_nr256 (v8sf) + v8sf __builtin_ia32_rsqrtps256 (v8sf) + v4df __builtin_ia32_shufpd256 (v4df,v4df,int) + v8sf __builtin_ia32_shufps256 (v8sf,v8sf,int) + v4si __builtin_ia32_si_si256 (v8si) + v8si __builtin_ia32_si256_si (v4si) + v4df __builtin_ia32_sqrtpd256 (v4df) + v8sf __builtin_ia32_sqrtps_nr256 (v8sf) + v8sf __builtin_ia32_sqrtps256 (v8sf) + void __builtin_ia32_storedqu256 (pchar,v32qi) + void __builtin_ia32_storeupd256 (pdouble,v4df) + void __builtin_ia32_storeups256 (pfloat,v8sf) + v4df __builtin_ia32_subpd256 (v4df,v4df) + v8sf __builtin_ia32_subps256 (v8sf,v8sf) + v4df __builtin_ia32_unpckhpd256 (v4df,v4df) + v8sf __builtin_ia32_unpckhps256 (v8sf,v8sf) + v4df __builtin_ia32_unpcklpd256 (v4df,v4df) + v8sf __builtin_ia32_unpcklps256 (v8sf,v8sf) + v4df __builtin_ia32_vbroadcastf128_pd256 (pcv2df) + v8sf __builtin_ia32_vbroadcastf128_ps256 (pcv4sf) + v4df __builtin_ia32_vbroadcastsd256 (pcdouble) + v4sf __builtin_ia32_vbroadcastss (pcfloat) + v8sf __builtin_ia32_vbroadcastss256 (pcfloat) + v2df __builtin_ia32_vextractf128_pd256 (v4df,int) + v4sf __builtin_ia32_vextractf128_ps256 (v8sf,int) + v4si __builtin_ia32_vextractf128_si256 (v8si,int) + v4df __builtin_ia32_vinsertf128_pd256 (v4df,v2df,int) + v8sf __builtin_ia32_vinsertf128_ps256 (v8sf,v4sf,int) + v8si __builtin_ia32_vinsertf128_si256 (v8si,v4si,int) + v4df __builtin_ia32_vperm2f128_pd256 (v4df,v4df,int) + v8sf __builtin_ia32_vperm2f128_ps256 (v8sf,v8sf,int) + v8si __builtin_ia32_vperm2f128_si256 (v8si,v8si,int) + v2df __builtin_ia32_vpermil2pd (v2df,v2df,v2di,int) + v4df __builtin_ia32_vpermil2pd256 (v4df,v4df,v4di,int) + v4sf __builtin_ia32_vpermil2ps (v4sf,v4sf,v4si,int) + v8sf __builtin_ia32_vpermil2ps256 (v8sf,v8sf,v8si,int) + v2df __builtin_ia32_vpermilpd (v2df,int) + v4df __builtin_ia32_vpermilpd256 (v4df,int) + v4sf __builtin_ia32_vpermilps (v4sf,int) + v8sf __builtin_ia32_vpermilps256 (v8sf,int) + v2df __builtin_ia32_vpermilvarpd (v2df,v2di) + v4df __builtin_ia32_vpermilvarpd256 (v4df,v4di) + v4sf __builtin_ia32_vpermilvarps (v4sf,v4si) + v8sf __builtin_ia32_vpermilvarps256 (v8sf,v8si) + int __builtin_ia32_vtestcpd (v2df,v2df,ptest) + int __builtin_ia32_vtestcpd256 (v4df,v4df,ptest) + int __builtin_ia32_vtestcps (v4sf,v4sf,ptest) + int __builtin_ia32_vtestcps256 (v8sf,v8sf,ptest) + int __builtin_ia32_vtestnzcpd (v2df,v2df,ptest) + int __builtin_ia32_vtestnzcpd256 (v4df,v4df,ptest) + int __builtin_ia32_vtestnzcps (v4sf,v4sf,ptest) + int __builtin_ia32_vtestnzcps256 (v8sf,v8sf,ptest) + int __builtin_ia32_vtestzpd (v2df,v2df,ptest) + int __builtin_ia32_vtestzpd256 (v4df,v4df,ptest) + int __builtin_ia32_vtestzps (v4sf,v4sf,ptest) + int __builtin_ia32_vtestzps256 (v8sf,v8sf,ptest) + void __builtin_ia32_vzeroall (void) + void __builtin_ia32_vzeroupper (void) + v4df __builtin_ia32_xorpd256 (v4df,v4df) + v8sf __builtin_ia32_xorps256 (v8sf,v8sf) + + The following built-in functions are available when '-mavx2' is used. +All of them generate the machine instruction that is part of the name. + + v32qi __builtin_ia32_mpsadbw256 (v32qi,v32qi,v32qi,int) + v32qi __builtin_ia32_pabsb256 (v32qi) + v16hi __builtin_ia32_pabsw256 (v16hi) + v8si __builtin_ia32_pabsd256 (v8si) + v16hi __builtin_ia32_packssdw256 (v8si,v8si) + v32qi __builtin_ia32_packsswb256 (v16hi,v16hi) + v16hi __builtin_ia32_packusdw256 (v8si,v8si) + v32qi __builtin_ia32_packuswb256 (v16hi,v16hi) + v32qi __builtin_ia32_paddb256 (v32qi,v32qi) + v16hi __builtin_ia32_paddw256 (v16hi,v16hi) + v8si __builtin_ia32_paddd256 (v8si,v8si) + v4di __builtin_ia32_paddq256 (v4di,v4di) + v32qi __builtin_ia32_paddsb256 (v32qi,v32qi) + v16hi __builtin_ia32_paddsw256 (v16hi,v16hi) + v32qi __builtin_ia32_paddusb256 (v32qi,v32qi) + v16hi __builtin_ia32_paddusw256 (v16hi,v16hi) + v4di __builtin_ia32_palignr256 (v4di,v4di,int) + v4di __builtin_ia32_andsi256 (v4di,v4di) + v4di __builtin_ia32_andnotsi256 (v4di,v4di) + v32qi __builtin_ia32_pavgb256 (v32qi,v32qi) + v16hi __builtin_ia32_pavgw256 (v16hi,v16hi) + v32qi __builtin_ia32_pblendvb256 (v32qi,v32qi,v32qi) + v16hi __builtin_ia32_pblendw256 (v16hi,v16hi,int) + v32qi __builtin_ia32_pcmpeqb256 (v32qi,v32qi) + v16hi __builtin_ia32_pcmpeqw256 (v16hi,v16hi) + v8si __builtin_ia32_pcmpeqd256 (c8si,v8si) + v4di __builtin_ia32_pcmpeqq256 (v4di,v4di) + v32qi __builtin_ia32_pcmpgtb256 (v32qi,v32qi) + v16hi __builtin_ia32_pcmpgtw256 (16hi,v16hi) + v8si __builtin_ia32_pcmpgtd256 (v8si,v8si) + v4di __builtin_ia32_pcmpgtq256 (v4di,v4di) + v16hi __builtin_ia32_phaddw256 (v16hi,v16hi) + v8si __builtin_ia32_phaddd256 (v8si,v8si) + v16hi __builtin_ia32_phaddsw256 (v16hi,v16hi) + v16hi __builtin_ia32_phsubw256 (v16hi,v16hi) + v8si __builtin_ia32_phsubd256 (v8si,v8si) + v16hi __builtin_ia32_phsubsw256 (v16hi,v16hi) + v32qi __builtin_ia32_pmaddubsw256 (v32qi,v32qi) + v16hi __builtin_ia32_pmaddwd256 (v16hi,v16hi) + v32qi __builtin_ia32_pmaxsb256 (v32qi,v32qi) + v16hi __builtin_ia32_pmaxsw256 (v16hi,v16hi) + v8si __builtin_ia32_pmaxsd256 (v8si,v8si) + v32qi __builtin_ia32_pmaxub256 (v32qi,v32qi) + v16hi __builtin_ia32_pmaxuw256 (v16hi,v16hi) + v8si __builtin_ia32_pmaxud256 (v8si,v8si) + v32qi __builtin_ia32_pminsb256 (v32qi,v32qi) + v16hi __builtin_ia32_pminsw256 (v16hi,v16hi) + v8si __builtin_ia32_pminsd256 (v8si,v8si) + v32qi __builtin_ia32_pminub256 (v32qi,v32qi) + v16hi __builtin_ia32_pminuw256 (v16hi,v16hi) + v8si __builtin_ia32_pminud256 (v8si,v8si) + int __builtin_ia32_pmovmskb256 (v32qi) + v16hi __builtin_ia32_pmovsxbw256 (v16qi) + v8si __builtin_ia32_pmovsxbd256 (v16qi) + v4di __builtin_ia32_pmovsxbq256 (v16qi) + v8si __builtin_ia32_pmovsxwd256 (v8hi) + v4di __builtin_ia32_pmovsxwq256 (v8hi) + v4di __builtin_ia32_pmovsxdq256 (v4si) + v16hi __builtin_ia32_pmovzxbw256 (v16qi) + v8si __builtin_ia32_pmovzxbd256 (v16qi) + v4di __builtin_ia32_pmovzxbq256 (v16qi) + v8si __builtin_ia32_pmovzxwd256 (v8hi) + v4di __builtin_ia32_pmovzxwq256 (v8hi) + v4di __builtin_ia32_pmovzxdq256 (v4si) + v4di __builtin_ia32_pmuldq256 (v8si,v8si) + v16hi __builtin_ia32_pmulhrsw256 (v16hi, v16hi) + v16hi __builtin_ia32_pmulhuw256 (v16hi,v16hi) + v16hi __builtin_ia32_pmulhw256 (v16hi,v16hi) + v16hi __builtin_ia32_pmullw256 (v16hi,v16hi) + v8si __builtin_ia32_pmulld256 (v8si,v8si) + v4di __builtin_ia32_pmuludq256 (v8si,v8si) + v4di __builtin_ia32_por256 (v4di,v4di) + v16hi __builtin_ia32_psadbw256 (v32qi,v32qi) + v32qi __builtin_ia32_pshufb256 (v32qi,v32qi) + v8si __builtin_ia32_pshufd256 (v8si,int) + v16hi __builtin_ia32_pshufhw256 (v16hi,int) + v16hi __builtin_ia32_pshuflw256 (v16hi,int) + v32qi __builtin_ia32_psignb256 (v32qi,v32qi) + v16hi __builtin_ia32_psignw256 (v16hi,v16hi) + v8si __builtin_ia32_psignd256 (v8si,v8si) + v4di __builtin_ia32_pslldqi256 (v4di,int) + v16hi __builtin_ia32_psllwi256 (16hi,int) + v16hi __builtin_ia32_psllw256(v16hi,v8hi) + v8si __builtin_ia32_pslldi256 (v8si,int) + v8si __builtin_ia32_pslld256(v8si,v4si) + v4di __builtin_ia32_psllqi256 (v4di,int) + v4di __builtin_ia32_psllq256(v4di,v2di) + v16hi __builtin_ia32_psrawi256 (v16hi,int) + v16hi __builtin_ia32_psraw256 (v16hi,v8hi) + v8si __builtin_ia32_psradi256 (v8si,int) + v8si __builtin_ia32_psrad256 (v8si,v4si) + v4di __builtin_ia32_psrldqi256 (v4di, int) + v16hi __builtin_ia32_psrlwi256 (v16hi,int) + v16hi __builtin_ia32_psrlw256 (v16hi,v8hi) + v8si __builtin_ia32_psrldi256 (v8si,int) + v8si __builtin_ia32_psrld256 (v8si,v4si) + v4di __builtin_ia32_psrlqi256 (v4di,int) + v4di __builtin_ia32_psrlq256(v4di,v2di) + v32qi __builtin_ia32_psubb256 (v32qi,v32qi) + v32hi __builtin_ia32_psubw256 (v16hi,v16hi) + v8si __builtin_ia32_psubd256 (v8si,v8si) + v4di __builtin_ia32_psubq256 (v4di,v4di) + v32qi __builtin_ia32_psubsb256 (v32qi,v32qi) + v16hi __builtin_ia32_psubsw256 (v16hi,v16hi) + v32qi __builtin_ia32_psubusb256 (v32qi,v32qi) + v16hi __builtin_ia32_psubusw256 (v16hi,v16hi) + v32qi __builtin_ia32_punpckhbw256 (v32qi,v32qi) + v16hi __builtin_ia32_punpckhwd256 (v16hi,v16hi) + v8si __builtin_ia32_punpckhdq256 (v8si,v8si) + v4di __builtin_ia32_punpckhqdq256 (v4di,v4di) + v32qi __builtin_ia32_punpcklbw256 (v32qi,v32qi) + v16hi __builtin_ia32_punpcklwd256 (v16hi,v16hi) + v8si __builtin_ia32_punpckldq256 (v8si,v8si) + v4di __builtin_ia32_punpcklqdq256 (v4di,v4di) + v4di __builtin_ia32_pxor256 (v4di,v4di) + v4di __builtin_ia32_movntdqa256 (pv4di) + v4sf __builtin_ia32_vbroadcastss_ps (v4sf) + v8sf __builtin_ia32_vbroadcastss_ps256 (v4sf) + v4df __builtin_ia32_vbroadcastsd_pd256 (v2df) + v4di __builtin_ia32_vbroadcastsi256 (v2di) + v4si __builtin_ia32_pblendd128 (v4si,v4si) + v8si __builtin_ia32_pblendd256 (v8si,v8si) + v32qi __builtin_ia32_pbroadcastb256 (v16qi) + v16hi __builtin_ia32_pbroadcastw256 (v8hi) + v8si __builtin_ia32_pbroadcastd256 (v4si) + v4di __builtin_ia32_pbroadcastq256 (v2di) + v16qi __builtin_ia32_pbroadcastb128 (v16qi) + v8hi __builtin_ia32_pbroadcastw128 (v8hi) + v4si __builtin_ia32_pbroadcastd128 (v4si) + v2di __builtin_ia32_pbroadcastq128 (v2di) + v8si __builtin_ia32_permvarsi256 (v8si,v8si) + v4df __builtin_ia32_permdf256 (v4df,int) + v8sf __builtin_ia32_permvarsf256 (v8sf,v8sf) + v4di __builtin_ia32_permdi256 (v4di,int) + v4di __builtin_ia32_permti256 (v4di,v4di,int) + v4di __builtin_ia32_extract128i256 (v4di,int) + v4di __builtin_ia32_insert128i256 (v4di,v2di,int) + v8si __builtin_ia32_maskloadd256 (pcv8si,v8si) + v4di __builtin_ia32_maskloadq256 (pcv4di,v4di) + v4si __builtin_ia32_maskloadd (pcv4si,v4si) + v2di __builtin_ia32_maskloadq (pcv2di,v2di) + void __builtin_ia32_maskstored256 (pv8si,v8si,v8si) + void __builtin_ia32_maskstoreq256 (pv4di,v4di,v4di) + void __builtin_ia32_maskstored (pv4si,v4si,v4si) + void __builtin_ia32_maskstoreq (pv2di,v2di,v2di) + v8si __builtin_ia32_psllv8si (v8si,v8si) + v4si __builtin_ia32_psllv4si (v4si,v4si) + v4di __builtin_ia32_psllv4di (v4di,v4di) + v2di __builtin_ia32_psllv2di (v2di,v2di) + v8si __builtin_ia32_psrav8si (v8si,v8si) + v4si __builtin_ia32_psrav4si (v4si,v4si) + v8si __builtin_ia32_psrlv8si (v8si,v8si) + v4si __builtin_ia32_psrlv4si (v4si,v4si) + v4di __builtin_ia32_psrlv4di (v4di,v4di) + v2di __builtin_ia32_psrlv2di (v2di,v2di) + v2df __builtin_ia32_gathersiv2df (v2df, pcdouble,v4si,v2df,int) + v4df __builtin_ia32_gathersiv4df (v4df, pcdouble,v4si,v4df,int) + v2df __builtin_ia32_gatherdiv2df (v2df, pcdouble,v2di,v2df,int) + v4df __builtin_ia32_gatherdiv4df (v4df, pcdouble,v4di,v4df,int) + v4sf __builtin_ia32_gathersiv4sf (v4sf, pcfloat,v4si,v4sf,int) + v8sf __builtin_ia32_gathersiv8sf (v8sf, pcfloat,v8si,v8sf,int) + v4sf __builtin_ia32_gatherdiv4sf (v4sf, pcfloat,v2di,v4sf,int) + v4sf __builtin_ia32_gatherdiv4sf256 (v4sf, pcfloat,v4di,v4sf,int) + v2di __builtin_ia32_gathersiv2di (v2di, pcint64,v4si,v2di,int) + v4di __builtin_ia32_gathersiv4di (v4di, pcint64,v4si,v4di,int) + v2di __builtin_ia32_gatherdiv2di (v2di, pcint64,v2di,v2di,int) + v4di __builtin_ia32_gatherdiv4di (v4di, pcint64,v4di,v4di,int) + v4si __builtin_ia32_gathersiv4si (v4si, pcint,v4si,v4si,int) + v8si __builtin_ia32_gathersiv8si (v8si, pcint,v8si,v8si,int) + v4si __builtin_ia32_gatherdiv4si (v4si, pcint,v2di,v4si,int) + v4si __builtin_ia32_gatherdiv4si256 (v4si, pcint,v4di,v4si,int) + + The following built-in functions are available when '-maes' is used. +All of them generate the machine instruction that is part of the name. + + v2di __builtin_ia32_aesenc128 (v2di, v2di) + v2di __builtin_ia32_aesenclast128 (v2di, v2di) + v2di __builtin_ia32_aesdec128 (v2di, v2di) + v2di __builtin_ia32_aesdeclast128 (v2di, v2di) + v2di __builtin_ia32_aeskeygenassist128 (v2di, const int) + v2di __builtin_ia32_aesimc128 (v2di) + + The following built-in function is available when '-mpclmul' is used. + +'v2di __builtin_ia32_pclmulqdq128 (v2di, v2di, const int)' + Generates the 'pclmulqdq' machine instruction. + + The following built-in function is available when '-mfsgsbase' is used. +All of them generate the machine instruction that is part of the name. + + unsigned int __builtin_ia32_rdfsbase32 (void) + unsigned long long __builtin_ia32_rdfsbase64 (void) + unsigned int __builtin_ia32_rdgsbase32 (void) + unsigned long long __builtin_ia32_rdgsbase64 (void) + void _writefsbase_u32 (unsigned int) + void _writefsbase_u64 (unsigned long long) + void _writegsbase_u32 (unsigned int) + void _writegsbase_u64 (unsigned long long) + + The following built-in function is available when '-mrdrnd' is used. +All of them generate the machine instruction that is part of the name. + + unsigned int __builtin_ia32_rdrand16_step (unsigned short *) + unsigned int __builtin_ia32_rdrand32_step (unsigned int *) + unsigned int __builtin_ia32_rdrand64_step (unsigned long long *) + + The following built-in functions are available when '-msse4a' is used. +All of them generate the machine instruction that is part of the name. + + void __builtin_ia32_movntsd (double *, v2df) + void __builtin_ia32_movntss (float *, v4sf) + v2di __builtin_ia32_extrq (v2di, v16qi) + v2di __builtin_ia32_extrqi (v2di, const unsigned int, const unsigned int) + v2di __builtin_ia32_insertq (v2di, v2di) + v2di __builtin_ia32_insertqi (v2di, v2di, const unsigned int, const unsigned int) + + The following built-in functions are available when '-mxop' is used. + 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) + + The following built-in functions are available when '-mfma4' is used. +All of them generate the machine instruction that is part of the name. + + v2df __builtin_ia32_vfmaddpd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfmaddps (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfmaddsd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfmaddss (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfmsubpd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfmsubps (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfmsubsd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfmsubss (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfnmaddpd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfnmaddps (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfnmaddsd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfnmaddss (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfnmsubpd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfnmsubps (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfnmsubsd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfnmsubss (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfmaddsubpd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfmaddsubps (v4sf, v4sf, v4sf) + v2df __builtin_ia32_vfmsubaddpd (v2df, v2df, v2df) + v4sf __builtin_ia32_vfmsubaddps (v4sf, v4sf, v4sf) + v4df __builtin_ia32_vfmaddpd256 (v4df, v4df, v4df) + v8sf __builtin_ia32_vfmaddps256 (v8sf, v8sf, v8sf) + v4df __builtin_ia32_vfmsubpd256 (v4df, v4df, v4df) + v8sf __builtin_ia32_vfmsubps256 (v8sf, v8sf, v8sf) + v4df __builtin_ia32_vfnmaddpd256 (v4df, v4df, v4df) + v8sf __builtin_ia32_vfnmaddps256 (v8sf, v8sf, v8sf) + v4df __builtin_ia32_vfnmsubpd256 (v4df, v4df, v4df) + v8sf __builtin_ia32_vfnmsubps256 (v8sf, v8sf, v8sf) + v4df __builtin_ia32_vfmaddsubpd256 (v4df, v4df, v4df) + v8sf __builtin_ia32_vfmaddsubps256 (v8sf, v8sf, v8sf) + v4df __builtin_ia32_vfmsubaddpd256 (v4df, v4df, v4df) + v8sf __builtin_ia32_vfmsubaddps256 (v8sf, v8sf, v8sf) + + The following built-in functions are available when '-mlwp' is used. + + 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) + + The following built-in functions are available when '-mbmi' is used. +All of them generate the machine instruction that is part of the name. + unsigned int __builtin_ia32_bextr_u32(unsigned int, unsigned int); + unsigned long long __builtin_ia32_bextr_u64 (unsigned long long, unsigned long long); + + The following built-in functions are available when '-mbmi2' is used. +All of them generate the machine instruction that is part of the name. + unsigned int _bzhi_u32 (unsigned int, unsigned int) + unsigned int _pdep_u32 (unsigned int, unsigned int) + unsigned int _pext_u32 (unsigned int, unsigned int) + unsigned long long _bzhi_u64 (unsigned long long, unsigned long long) + unsigned long long _pdep_u64 (unsigned long long, unsigned long long) + unsigned long long _pext_u64 (unsigned long long, unsigned long long) + + The following built-in functions are available when '-mlzcnt' is used. +All of them generate the machine instruction that is part of the name. + unsigned short __builtin_ia32_lzcnt_16(unsigned short); + unsigned int __builtin_ia32_lzcnt_u32(unsigned int); + unsigned long long __builtin_ia32_lzcnt_u64 (unsigned long long); + + The following built-in functions are available when '-mfxsr' is used. +All of them generate the machine instruction that is part of the name. + void __builtin_ia32_fxsave (void *) + void __builtin_ia32_fxrstor (void *) + void __builtin_ia32_fxsave64 (void *) + void __builtin_ia32_fxrstor64 (void *) + + The following built-in functions are available when '-mxsave' is used. +All of them generate the machine instruction that is part of the name. + void __builtin_ia32_xsave (void *, long long) + void __builtin_ia32_xrstor (void *, long long) + void __builtin_ia32_xsave64 (void *, long long) + void __builtin_ia32_xrstor64 (void *, long long) + + The following built-in functions are available when '-mxsaveopt' is +used. All of them generate the machine instruction that is part of the +name. + void __builtin_ia32_xsaveopt (void *, long long) + void __builtin_ia32_xsaveopt64 (void *, long long) + + The following built-in functions are available when '-mtbm' is used. +Both of them generate the immediate form of the bextr machine +instruction. + unsigned int __builtin_ia32_bextri_u32 (unsigned int, const unsigned int); + unsigned long long __builtin_ia32_bextri_u64 (unsigned long long, const unsigned long long); + + The following built-in functions are available when '-m3dnow' is used. +All of them generate the machine instruction that is part of the name. + + void __builtin_ia32_femms (void) + v8qi __builtin_ia32_pavgusb (v8qi, v8qi) + v2si __builtin_ia32_pf2id (v2sf) + v2sf __builtin_ia32_pfacc (v2sf, v2sf) + v2sf __builtin_ia32_pfadd (v2sf, v2sf) + v2si __builtin_ia32_pfcmpeq (v2sf, v2sf) + v2si __builtin_ia32_pfcmpge (v2sf, v2sf) + v2si __builtin_ia32_pfcmpgt (v2sf, v2sf) + v2sf __builtin_ia32_pfmax (v2sf, v2sf) + v2sf __builtin_ia32_pfmin (v2sf, v2sf) + v2sf __builtin_ia32_pfmul (v2sf, v2sf) + v2sf __builtin_ia32_pfrcp (v2sf) + v2sf __builtin_ia32_pfrcpit1 (v2sf, v2sf) + v2sf __builtin_ia32_pfrcpit2 (v2sf, v2sf) + v2sf __builtin_ia32_pfrsqrt (v2sf) + v2sf __builtin_ia32_pfsub (v2sf, v2sf) + v2sf __builtin_ia32_pfsubr (v2sf, v2sf) + v2sf __builtin_ia32_pi2fd (v2si) + v4hi __builtin_ia32_pmulhrw (v4hi, v4hi) + + The following built-in functions are available when both '-m3dnow' and +'-march=athlon' are used. All of them generate the machine instruction +that is part of the name. + + v2si __builtin_ia32_pf2iw (v2sf) + v2sf __builtin_ia32_pfnacc (v2sf, v2sf) + v2sf __builtin_ia32_pfpnacc (v2sf, v2sf) + v2sf __builtin_ia32_pi2fw (v2si) + v2sf __builtin_ia32_pswapdsf (v2sf) + v2si __builtin_ia32_pswapdsi (v2si) + + The following built-in functions are available when '-mrtm' is used +They are used for restricted transactional memory. These are the +internal low level functions. Normally the functions in *note X86 +transactional memory intrinsics:: should be used instead. + + int __builtin_ia32_xbegin () + void __builtin_ia32_xend () + void __builtin_ia32_xabort (status) + int __builtin_ia32_xtest () + + +File: gcc.info, Node: X86 transactional memory intrinsics, Next: MIPS DSP Built-in Functions, Prev: X86 Built-in Functions, Up: Target Builtins + +6.57.12 X86 transaction memory intrinsics +----------------------------------------- + +Hardware transactional memory intrinsics for i386. These allow to use +memory transactions with RTM (Restricted Transactional Memory). For +using HLE (Hardware Lock Elision) see *note x86 specific memory model +extensions for transactional memory:: instead. This support is enabled +with the '-mrtm' option. + + A memory transaction commits all changes to memory in an atomic way, as +visible to other threads. If the transaction fails it is rolled back +and all side effects discarded. + + Generally there is no guarantee that a memory transaction ever succeeds +and suitable fallback code always needs to be supplied. + + -- RTM Function: unsigned _xbegin () + Start a RTM (Restricted Transactional Memory) transaction. Returns + _XBEGIN_STARTED when the transaction started successfully (note + this is not 0, so the constant has to be explicitely tested). When + the transaction aborts all side effects are undone and an abort + code is returned. There is no guarantee any transaction ever + succeeds, so there always needs to be a valid tested fallback path. + + #include <immintrin.h> + + if ((status = _xbegin ()) == _XBEGIN_STARTED) { + ... transaction code... + _xend (); + } else { + ... non transactional fallback path... + } + + Valid abort status bits (when the value is not '_XBEGIN_STARTED') are: + +'_XABORT_EXPLICIT' + Transaction explicitely aborted with '_xabort'. The parameter + passed to '_xabort' is available with '_XABORT_CODE(status)' +'_XABORT_RETRY' + Transaction retry is possible. +'_XABORT_CONFLICT' + Transaction abort due to a memory conflict with another thread +'_XABORT_CAPACITY' + Transaction abort due to the transaction using too much memory +'_XABORT_DEBUG' + Transaction abort due to a debug trap +'_XABORT_NESTED' + Transaction abort in a inner nested transaction + + -- RTM Function: void _xend () + Commit the current transaction. When no transaction is active this + will fault. All memory side effects of the transactions will + become visible to other threads in an atomic matter. + + -- RTM Function: int _xtest () + Return a value not zero when a transaction is currently active, + otherwise 0. + + -- RTM Function: void _xabort (status) + Abort the current transaction. When no transaction is active this + is a no-op. status must be a 8bit constant, that is included in + the status code returned by '_xbegin' + + +File: gcc.info, Node: MIPS DSP Built-in Functions, Next: MIPS Paired-Single Support, Prev: X86 transactional memory intrinsics, Up: Target Builtins + +6.57.13 MIPS DSP Built-in Functions +----------------------------------- + +The MIPS DSP Application-Specific Extension (ASE) includes new +instructions that are designed to improve the performance of DSP and +media applications. It provides instructions that operate on packed +8-bit/16-bit integer data, Q7, Q15 and Q31 fractional data. + + GCC supports MIPS DSP operations using both the generic vector +extensions (*note Vector Extensions::) and a collection of MIPS-specific +built-in functions. Both kinds of support are enabled by the '-mdsp' +command-line option. + + Revision 2 of the ASE was introduced in the second half of 2006. This +revision adds extra instructions to the original ASE, but is otherwise +backwards-compatible with it. You can select revision 2 using the +command-line option '-mdspr2'; this option implies '-mdsp'. + + The SCOUNT and POS bits of the DSP control register are global. The +WRDSP, EXTPDP, EXTPDPV and MTHLIP instructions modify the SCOUNT and POS +bits. During optimization, the compiler does not delete these +instructions and it does not delete calls to functions containing these +instructions. + + At present, GCC only provides support for operations on 32-bit vectors. +The vector type associated with 8-bit integer data is usually called +'v4i8', the vector type associated with Q7 is usually called 'v4q7', the +vector type associated with 16-bit integer data is usually called +'v2i16', and the vector type associated with Q15 is usually called +'v2q15'. They can be defined in C as follows: + + typedef signed char v4i8 __attribute__ ((vector_size(4))); + typedef signed char v4q7 __attribute__ ((vector_size(4))); + typedef short v2i16 __attribute__ ((vector_size(4))); + typedef short v2q15 __attribute__ ((vector_size(4))); + + 'v4i8', 'v4q7', 'v2i16' and 'v2q15' values are initialized in the same +way as aggregates. For example: + + v4i8 a = {1, 2, 3, 4}; + v4i8 b; + b = (v4i8) {5, 6, 7, 8}; + + v2q15 c = {0x0fcb, 0x3a75}; + v2q15 d; + d = (v2q15) {0.1234 * 0x1.0p15, 0.4567 * 0x1.0p15}; + + _Note:_ The CPU's endianness determines the order in which values are +packed. On little-endian targets, the first value is the least +significant and the last value is the most significant. The opposite +order applies to big-endian targets. For example, the code above sets +the lowest byte of 'a' to '1' on little-endian targets and '4' on +big-endian targets. + + _Note:_ Q7, Q15 and Q31 values must be initialized with their integer +representation. As shown in this example, the integer representation of +a Q7 value can be obtained by multiplying the fractional value by +'0x1.0p7'. The equivalent for Q15 values is to multiply by '0x1.0p15'. +The equivalent for Q31 values is to multiply by '0x1.0p31'. + + The table below lists the 'v4i8' and 'v2q15' operations for which +hardware support exists. 'a' and 'b' are 'v4i8' values, and 'c' and 'd' +are 'v2q15' values. + +C code MIPS instruction +'a + b' 'addu.qb' +'c + d' 'addq.ph' +'a - b' 'subu.qb' +'c - d' 'subq.ph' + + The table below lists the 'v2i16' operation for which hardware support +exists for the DSP ASE REV 2. 'e' and 'f' are 'v2i16' values. + +C code MIPS instruction +'e * f' 'mul.ph' + + It is easier to describe the DSP built-in functions if we first define +the following types: + + typedef int q31; + typedef int i32; + typedef unsigned int ui32; + typedef long long a64; + + 'q31' and 'i32' are actually the same as 'int', but we use 'q31' to +indicate a Q31 fractional value and 'i32' to indicate a 32-bit integer +value. Similarly, 'a64' is the same as 'long long', but we use 'a64' to +indicate values that are placed in one of the four DSP accumulators +('$ac0', '$ac1', '$ac2' or '$ac3'). + + Also, some built-in functions prefer or require immediate numbers as +parameters, because the corresponding DSP instructions accept both +immediate numbers and register operands, or accept immediate numbers +only. The immediate parameters are listed as follows. + + imm0_3: 0 to 3. + imm0_7: 0 to 7. + imm0_15: 0 to 15. + imm0_31: 0 to 31. + imm0_63: 0 to 63. + imm0_255: 0 to 255. + imm_n32_31: -32 to 31. + imm_n512_511: -512 to 511. + + The following built-in functions map directly to a particular MIPS DSP +instruction. Please refer to the architecture specification for details +on what each instruction does. + + v2q15 __builtin_mips_addq_ph (v2q15, v2q15) + v2q15 __builtin_mips_addq_s_ph (v2q15, v2q15) + q31 __builtin_mips_addq_s_w (q31, q31) + v4i8 __builtin_mips_addu_qb (v4i8, v4i8) + v4i8 __builtin_mips_addu_s_qb (v4i8, v4i8) + v2q15 __builtin_mips_subq_ph (v2q15, v2q15) + v2q15 __builtin_mips_subq_s_ph (v2q15, v2q15) + q31 __builtin_mips_subq_s_w (q31, q31) + v4i8 __builtin_mips_subu_qb (v4i8, v4i8) + v4i8 __builtin_mips_subu_s_qb (v4i8, v4i8) + i32 __builtin_mips_addsc (i32, i32) + i32 __builtin_mips_addwc (i32, i32) + i32 __builtin_mips_modsub (i32, i32) + i32 __builtin_mips_raddu_w_qb (v4i8) + v2q15 __builtin_mips_absq_s_ph (v2q15) + q31 __builtin_mips_absq_s_w (q31) + v4i8 __builtin_mips_precrq_qb_ph (v2q15, v2q15) + v2q15 __builtin_mips_precrq_ph_w (q31, q31) + v2q15 __builtin_mips_precrq_rs_ph_w (q31, q31) + v4i8 __builtin_mips_precrqu_s_qb_ph (v2q15, v2q15) + q31 __builtin_mips_preceq_w_phl (v2q15) + q31 __builtin_mips_preceq_w_phr (v2q15) + v2q15 __builtin_mips_precequ_ph_qbl (v4i8) + v2q15 __builtin_mips_precequ_ph_qbr (v4i8) + v2q15 __builtin_mips_precequ_ph_qbla (v4i8) + v2q15 __builtin_mips_precequ_ph_qbra (v4i8) + v2q15 __builtin_mips_preceu_ph_qbl (v4i8) + v2q15 __builtin_mips_preceu_ph_qbr (v4i8) + v2q15 __builtin_mips_preceu_ph_qbla (v4i8) + v2q15 __builtin_mips_preceu_ph_qbra (v4i8) + v4i8 __builtin_mips_shll_qb (v4i8, imm0_7) + v4i8 __builtin_mips_shll_qb (v4i8, i32) + v2q15 __builtin_mips_shll_ph (v2q15, imm0_15) + v2q15 __builtin_mips_shll_ph (v2q15, i32) + v2q15 __builtin_mips_shll_s_ph (v2q15, imm0_15) + v2q15 __builtin_mips_shll_s_ph (v2q15, i32) + q31 __builtin_mips_shll_s_w (q31, imm0_31) + q31 __builtin_mips_shll_s_w (q31, i32) + v4i8 __builtin_mips_shrl_qb (v4i8, imm0_7) + v4i8 __builtin_mips_shrl_qb (v4i8, i32) + v2q15 __builtin_mips_shra_ph (v2q15, imm0_15) + v2q15 __builtin_mips_shra_ph (v2q15, i32) + v2q15 __builtin_mips_shra_r_ph (v2q15, imm0_15) + v2q15 __builtin_mips_shra_r_ph (v2q15, i32) + q31 __builtin_mips_shra_r_w (q31, imm0_31) + q31 __builtin_mips_shra_r_w (q31, i32) + v2q15 __builtin_mips_muleu_s_ph_qbl (v4i8, v2q15) + v2q15 __builtin_mips_muleu_s_ph_qbr (v4i8, v2q15) + v2q15 __builtin_mips_mulq_rs_ph (v2q15, v2q15) + q31 __builtin_mips_muleq_s_w_phl (v2q15, v2q15) + q31 __builtin_mips_muleq_s_w_phr (v2q15, v2q15) + a64 __builtin_mips_dpau_h_qbl (a64, v4i8, v4i8) + a64 __builtin_mips_dpau_h_qbr (a64, v4i8, v4i8) + a64 __builtin_mips_dpsu_h_qbl (a64, v4i8, v4i8) + a64 __builtin_mips_dpsu_h_qbr (a64, v4i8, v4i8) + a64 __builtin_mips_dpaq_s_w_ph (a64, v2q15, v2q15) + a64 __builtin_mips_dpaq_sa_l_w (a64, q31, q31) + a64 __builtin_mips_dpsq_s_w_ph (a64, v2q15, v2q15) + a64 __builtin_mips_dpsq_sa_l_w (a64, q31, q31) + a64 __builtin_mips_mulsaq_s_w_ph (a64, v2q15, v2q15) + a64 __builtin_mips_maq_s_w_phl (a64, v2q15, v2q15) + a64 __builtin_mips_maq_s_w_phr (a64, v2q15, v2q15) + a64 __builtin_mips_maq_sa_w_phl (a64, v2q15, v2q15) + a64 __builtin_mips_maq_sa_w_phr (a64, v2q15, v2q15) + i32 __builtin_mips_bitrev (i32) + i32 __builtin_mips_insv (i32, i32) + v4i8 __builtin_mips_repl_qb (imm0_255) + v4i8 __builtin_mips_repl_qb (i32) + v2q15 __builtin_mips_repl_ph (imm_n512_511) + v2q15 __builtin_mips_repl_ph (i32) + void __builtin_mips_cmpu_eq_qb (v4i8, v4i8) + void __builtin_mips_cmpu_lt_qb (v4i8, v4i8) + void __builtin_mips_cmpu_le_qb (v4i8, v4i8) + i32 __builtin_mips_cmpgu_eq_qb (v4i8, v4i8) + i32 __builtin_mips_cmpgu_lt_qb (v4i8, v4i8) + i32 __builtin_mips_cmpgu_le_qb (v4i8, v4i8) + void __builtin_mips_cmp_eq_ph (v2q15, v2q15) + void __builtin_mips_cmp_lt_ph (v2q15, v2q15) + void __builtin_mips_cmp_le_ph (v2q15, v2q15) + v4i8 __builtin_mips_pick_qb (v4i8, v4i8) + v2q15 __builtin_mips_pick_ph (v2q15, v2q15) + v2q15 __builtin_mips_packrl_ph (v2q15, v2q15) + i32 __builtin_mips_extr_w (a64, imm0_31) + i32 __builtin_mips_extr_w (a64, i32) + i32 __builtin_mips_extr_r_w (a64, imm0_31) + i32 __builtin_mips_extr_s_h (a64, i32) + i32 __builtin_mips_extr_rs_w (a64, imm0_31) + i32 __builtin_mips_extr_rs_w (a64, i32) + i32 __builtin_mips_extr_s_h (a64, imm0_31) + i32 __builtin_mips_extr_r_w (a64, i32) + i32 __builtin_mips_extp (a64, imm0_31) + i32 __builtin_mips_extp (a64, i32) + i32 __builtin_mips_extpdp (a64, imm0_31) + i32 __builtin_mips_extpdp (a64, i32) + a64 __builtin_mips_shilo (a64, imm_n32_31) + a64 __builtin_mips_shilo (a64, i32) + a64 __builtin_mips_mthlip (a64, i32) + void __builtin_mips_wrdsp (i32, imm0_63) + i32 __builtin_mips_rddsp (imm0_63) + i32 __builtin_mips_lbux (void *, i32) + i32 __builtin_mips_lhx (void *, i32) + i32 __builtin_mips_lwx (void *, i32) + a64 __builtin_mips_ldx (void *, i32) [MIPS64 only] + i32 __builtin_mips_bposge32 (void) + a64 __builtin_mips_madd (a64, i32, i32); + a64 __builtin_mips_maddu (a64, ui32, ui32); + a64 __builtin_mips_msub (a64, i32, i32); + a64 __builtin_mips_msubu (a64, ui32, ui32); + a64 __builtin_mips_mult (i32, i32); + a64 __builtin_mips_multu (ui32, ui32); + + The following built-in functions map directly to a particular MIPS DSP +REV 2 instruction. Please refer to the architecture specification for +details on what each instruction does. + + v4q7 __builtin_mips_absq_s_qb (v4q7); + v2i16 __builtin_mips_addu_ph (v2i16, v2i16); + v2i16 __builtin_mips_addu_s_ph (v2i16, v2i16); + v4i8 __builtin_mips_adduh_qb (v4i8, v4i8); + v4i8 __builtin_mips_adduh_r_qb (v4i8, v4i8); + i32 __builtin_mips_append (i32, i32, imm0_31); + i32 __builtin_mips_balign (i32, i32, imm0_3); + i32 __builtin_mips_cmpgdu_eq_qb (v4i8, v4i8); + i32 __builtin_mips_cmpgdu_lt_qb (v4i8, v4i8); + i32 __builtin_mips_cmpgdu_le_qb (v4i8, v4i8); + a64 __builtin_mips_dpa_w_ph (a64, v2i16, v2i16); + a64 __builtin_mips_dps_w_ph (a64, v2i16, v2i16); + v2i16 __builtin_mips_mul_ph (v2i16, v2i16); + v2i16 __builtin_mips_mul_s_ph (v2i16, v2i16); + q31 __builtin_mips_mulq_rs_w (q31, q31); + v2q15 __builtin_mips_mulq_s_ph (v2q15, v2q15); + q31 __builtin_mips_mulq_s_w (q31, q31); + a64 __builtin_mips_mulsa_w_ph (a64, v2i16, v2i16); + v4i8 __builtin_mips_precr_qb_ph (v2i16, v2i16); + v2i16 __builtin_mips_precr_sra_ph_w (i32, i32, imm0_31); + v2i16 __builtin_mips_precr_sra_r_ph_w (i32, i32, imm0_31); + i32 __builtin_mips_prepend (i32, i32, imm0_31); + v4i8 __builtin_mips_shra_qb (v4i8, imm0_7); + v4i8 __builtin_mips_shra_r_qb (v4i8, imm0_7); + v4i8 __builtin_mips_shra_qb (v4i8, i32); + v4i8 __builtin_mips_shra_r_qb (v4i8, i32); + v2i16 __builtin_mips_shrl_ph (v2i16, imm0_15); + v2i16 __builtin_mips_shrl_ph (v2i16, i32); + v2i16 __builtin_mips_subu_ph (v2i16, v2i16); + v2i16 __builtin_mips_subu_s_ph (v2i16, v2i16); + v4i8 __builtin_mips_subuh_qb (v4i8, v4i8); + v4i8 __builtin_mips_subuh_r_qb (v4i8, v4i8); + v2q15 __builtin_mips_addqh_ph (v2q15, v2q15); + v2q15 __builtin_mips_addqh_r_ph (v2q15, v2q15); + q31 __builtin_mips_addqh_w (q31, q31); + q31 __builtin_mips_addqh_r_w (q31, q31); + v2q15 __builtin_mips_subqh_ph (v2q15, v2q15); + v2q15 __builtin_mips_subqh_r_ph (v2q15, v2q15); + q31 __builtin_mips_subqh_w (q31, q31); + q31 __builtin_mips_subqh_r_w (q31, q31); + a64 __builtin_mips_dpax_w_ph (a64, v2i16, v2i16); + a64 __builtin_mips_dpsx_w_ph (a64, v2i16, v2i16); + a64 __builtin_mips_dpaqx_s_w_ph (a64, v2q15, v2q15); + a64 __builtin_mips_dpaqx_sa_w_ph (a64, v2q15, v2q15); + a64 __builtin_mips_dpsqx_s_w_ph (a64, v2q15, v2q15); + a64 __builtin_mips_dpsqx_sa_w_ph (a64, v2q15, v2q15); + + +File: gcc.info, Node: MIPS Paired-Single Support, Next: MIPS Loongson Built-in Functions, Prev: MIPS DSP Built-in Functions, Up: Target Builtins + +6.57.14 MIPS Paired-Single Support +---------------------------------- + +The MIPS64 architecture includes a number of instructions that operate +on pairs of single-precision floating-point values. Each pair is packed +into a 64-bit floating-point register, with one element being designated +the "upper half" and the other being designated the "lower half". + + GCC supports paired-single operations using both the generic vector +extensions (*note Vector Extensions::) and a collection of MIPS-specific +built-in functions. Both kinds of support are enabled by the +'-mpaired-single' command-line option. + + The vector type associated with paired-single values is usually called +'v2sf'. It can be defined in C as follows: + + typedef float v2sf __attribute__ ((vector_size (8))); + + 'v2sf' values are initialized in the same way as aggregates. For +example: + + v2sf a = {1.5, 9.1}; + v2sf b; + float e, f; + b = (v2sf) {e, f}; + + _Note:_ The CPU's endianness determines which value is stored in the +upper half of a register and which value is stored in the lower half. +On little-endian targets, the first value is the lower one and the +second value is the upper one. The opposite order applies to big-endian +targets. For example, the code above sets the lower half of 'a' to +'1.5' on little-endian targets and '9.1' on big-endian targets. + + +File: gcc.info, Node: MIPS Loongson Built-in Functions, Next: Other MIPS Built-in Functions, Prev: MIPS Paired-Single Support, Up: Target Builtins + +6.57.15 MIPS Loongson Built-in Functions +---------------------------------------- + +GCC provides intrinsics to access the SIMD instructions provided by the +ST Microelectronics Loongson-2E and -2F processors. These intrinsics, +available after inclusion of the 'loongson.h' header file, operate on +the following 64-bit vector types: + + * 'uint8x8_t', a vector of eight unsigned 8-bit integers; + * 'uint16x4_t', a vector of four unsigned 16-bit integers; + * 'uint32x2_t', a vector of two unsigned 32-bit integers; + * 'int8x8_t', a vector of eight signed 8-bit integers; + * 'int16x4_t', a vector of four signed 16-bit integers; + * 'int32x2_t', a vector of two signed 32-bit integers. + + The intrinsics provided are listed below; each is named after the +machine instruction to which it corresponds, with suffixes added as +appropriate to distinguish intrinsics that expand to the same machine +instruction yet have different argument types. Refer to the +architecture documentation for a description of the functionality of +each instruction. + + int16x4_t packsswh (int32x2_t s, int32x2_t t); + int8x8_t packsshb (int16x4_t s, int16x4_t t); + uint8x8_t packushb (uint16x4_t s, uint16x4_t t); + uint32x2_t paddw_u (uint32x2_t s, uint32x2_t t); + uint16x4_t paddh_u (uint16x4_t s, uint16x4_t t); + uint8x8_t paddb_u (uint8x8_t s, uint8x8_t t); + int32x2_t paddw_s (int32x2_t s, int32x2_t t); + int16x4_t paddh_s (int16x4_t s, int16x4_t t); + int8x8_t paddb_s (int8x8_t s, int8x8_t t); + uint64_t paddd_u (uint64_t s, uint64_t t); + int64_t paddd_s (int64_t s, int64_t t); + int16x4_t paddsh (int16x4_t s, int16x4_t t); + int8x8_t paddsb (int8x8_t s, int8x8_t t); + uint16x4_t paddush (uint16x4_t s, uint16x4_t t); + uint8x8_t paddusb (uint8x8_t s, uint8x8_t t); + uint64_t pandn_ud (uint64_t s, uint64_t t); + uint32x2_t pandn_uw (uint32x2_t s, uint32x2_t t); + uint16x4_t pandn_uh (uint16x4_t s, uint16x4_t t); + uint8x8_t pandn_ub (uint8x8_t s, uint8x8_t t); + int64_t pandn_sd (int64_t s, int64_t t); + int32x2_t pandn_sw (int32x2_t s, int32x2_t t); + int16x4_t pandn_sh (int16x4_t s, int16x4_t t); + int8x8_t pandn_sb (int8x8_t s, int8x8_t t); + uint16x4_t pavgh (uint16x4_t s, uint16x4_t t); + uint8x8_t pavgb (uint8x8_t s, uint8x8_t t); + uint32x2_t pcmpeqw_u (uint32x2_t s, uint32x2_t t); + uint16x4_t pcmpeqh_u (uint16x4_t s, uint16x4_t t); + uint8x8_t pcmpeqb_u (uint8x8_t s, uint8x8_t t); + int32x2_t pcmpeqw_s (int32x2_t s, int32x2_t t); + int16x4_t pcmpeqh_s (int16x4_t s, int16x4_t t); + int8x8_t pcmpeqb_s (int8x8_t s, int8x8_t t); + uint32x2_t pcmpgtw_u (uint32x2_t s, uint32x2_t t); + uint16x4_t pcmpgth_u (uint16x4_t s, uint16x4_t t); + uint8x8_t pcmpgtb_u (uint8x8_t s, uint8x8_t t); + int32x2_t pcmpgtw_s (int32x2_t s, int32x2_t t); + int16x4_t pcmpgth_s (int16x4_t s, int16x4_t t); + int8x8_t pcmpgtb_s (int8x8_t s, int8x8_t t); + uint16x4_t pextrh_u (uint16x4_t s, int field); + int16x4_t pextrh_s (int16x4_t s, int field); + uint16x4_t pinsrh_0_u (uint16x4_t s, uint16x4_t t); + uint16x4_t pinsrh_1_u (uint16x4_t s, uint16x4_t t); + uint16x4_t pinsrh_2_u (uint16x4_t s, uint16x4_t t); + uint16x4_t pinsrh_3_u (uint16x4_t s, uint16x4_t t); + int16x4_t pinsrh_0_s (int16x4_t s, int16x4_t t); + int16x4_t pinsrh_1_s (int16x4_t s, int16x4_t t); + int16x4_t pinsrh_2_s (int16x4_t s, int16x4_t t); + int16x4_t pinsrh_3_s (int16x4_t s, int16x4_t t); + int32x2_t pmaddhw (int16x4_t s, int16x4_t t); + int16x4_t pmaxsh (int16x4_t s, int16x4_t t); + uint8x8_t pmaxub (uint8x8_t s, uint8x8_t t); + int16x4_t pminsh (int16x4_t s, int16x4_t t); + uint8x8_t pminub (uint8x8_t s, uint8x8_t t); + uint8x8_t pmovmskb_u (uint8x8_t s); + int8x8_t pmovmskb_s (int8x8_t s); + uint16x4_t pmulhuh (uint16x4_t s, uint16x4_t t); + int16x4_t pmulhh (int16x4_t s, int16x4_t t); + int16x4_t pmullh (int16x4_t s, int16x4_t t); + int64_t pmuluw (uint32x2_t s, uint32x2_t t); + uint8x8_t pasubub (uint8x8_t s, uint8x8_t t); + uint16x4_t biadd (uint8x8_t s); + uint16x4_t psadbh (uint8x8_t s, uint8x8_t t); + uint16x4_t pshufh_u (uint16x4_t dest, uint16x4_t s, uint8_t order); + int16x4_t pshufh_s (int16x4_t dest, int16x4_t s, uint8_t order); + uint16x4_t psllh_u (uint16x4_t s, uint8_t amount); + int16x4_t psllh_s (int16x4_t s, uint8_t amount); + uint32x2_t psllw_u (uint32x2_t s, uint8_t amount); + int32x2_t psllw_s (int32x2_t s, uint8_t amount); + uint16x4_t psrlh_u (uint16x4_t s, uint8_t amount); + int16x4_t psrlh_s (int16x4_t s, uint8_t amount); + uint32x2_t psrlw_u (uint32x2_t s, uint8_t amount); + int32x2_t psrlw_s (int32x2_t s, uint8_t amount); + uint16x4_t psrah_u (uint16x4_t s, uint8_t amount); + int16x4_t psrah_s (int16x4_t s, uint8_t amount); + uint32x2_t psraw_u (uint32x2_t s, uint8_t amount); + int32x2_t psraw_s (int32x2_t s, uint8_t amount); + uint32x2_t psubw_u (uint32x2_t s, uint32x2_t t); + uint16x4_t psubh_u (uint16x4_t s, uint16x4_t t); + uint8x8_t psubb_u (uint8x8_t s, uint8x8_t t); + int32x2_t psubw_s (int32x2_t s, int32x2_t t); + int16x4_t psubh_s (int16x4_t s, int16x4_t t); + int8x8_t psubb_s (int8x8_t s, int8x8_t t); + uint64_t psubd_u (uint64_t s, uint64_t t); + int64_t psubd_s (int64_t s, int64_t t); + int16x4_t psubsh (int16x4_t s, int16x4_t t); + int8x8_t psubsb (int8x8_t s, int8x8_t t); + uint16x4_t psubush (uint16x4_t s, uint16x4_t t); + uint8x8_t psubusb (uint8x8_t s, uint8x8_t t); + uint32x2_t punpckhwd_u (uint32x2_t s, uint32x2_t t); + uint16x4_t punpckhhw_u (uint16x4_t s, uint16x4_t t); + uint8x8_t punpckhbh_u (uint8x8_t s, uint8x8_t t); + int32x2_t punpckhwd_s (int32x2_t s, int32x2_t t); + int16x4_t punpckhhw_s (int16x4_t s, int16x4_t t); + int8x8_t punpckhbh_s (int8x8_t s, int8x8_t t); + uint32x2_t punpcklwd_u (uint32x2_t s, uint32x2_t t); + uint16x4_t punpcklhw_u (uint16x4_t s, uint16x4_t t); + uint8x8_t punpcklbh_u (uint8x8_t s, uint8x8_t t); + int32x2_t punpcklwd_s (int32x2_t s, int32x2_t t); + int16x4_t punpcklhw_s (int16x4_t s, int16x4_t t); + int8x8_t punpcklbh_s (int8x8_t s, int8x8_t t); + +* Menu: + +* Paired-Single Arithmetic:: +* Paired-Single Built-in Functions:: +* MIPS-3D Built-in Functions:: + + +File: gcc.info, Node: Paired-Single Arithmetic, Next: Paired-Single Built-in Functions, Up: MIPS Loongson Built-in Functions + +6.57.15.1 Paired-Single Arithmetic +.................................. + +The table below lists the 'v2sf' operations for which hardware support +exists. 'a', 'b' and 'c' are 'v2sf' values and 'x' is an integral +value. + +C code MIPS instruction +'a + b' 'add.ps' +'a - b' 'sub.ps' +'-a' 'neg.ps' +'a * b' 'mul.ps' +'a * b + c' 'madd.ps' +'a * b - c' 'msub.ps' +'-(a * b + c)' 'nmadd.ps' +'-(a * b - c)' 'nmsub.ps' +'x ? a : b' 'movn.ps'/'movz.ps' + + Note that the multiply-accumulate instructions can be disabled using +the command-line option '-mno-fused-madd'. + + +File: gcc.info, Node: Paired-Single Built-in Functions, Next: MIPS-3D Built-in Functions, Prev: Paired-Single Arithmetic, Up: MIPS Loongson Built-in Functions + +6.57.15.2 Paired-Single Built-in Functions +.......................................... + +The following paired-single functions map directly to a particular MIPS +instruction. Please refer to the architecture specification for details +on what each instruction does. + +'v2sf __builtin_mips_pll_ps (v2sf, v2sf)' + Pair lower lower ('pll.ps'). + +'v2sf __builtin_mips_pul_ps (v2sf, v2sf)' + Pair upper lower ('pul.ps'). + +'v2sf __builtin_mips_plu_ps (v2sf, v2sf)' + Pair lower upper ('plu.ps'). + +'v2sf __builtin_mips_puu_ps (v2sf, v2sf)' + Pair upper upper ('puu.ps'). + +'v2sf __builtin_mips_cvt_ps_s (float, float)' + Convert pair to paired single ('cvt.ps.s'). + +'float __builtin_mips_cvt_s_pl (v2sf)' + Convert pair lower to single ('cvt.s.pl'). + +'float __builtin_mips_cvt_s_pu (v2sf)' + Convert pair upper to single ('cvt.s.pu'). + +'v2sf __builtin_mips_abs_ps (v2sf)' + Absolute value ('abs.ps'). + +'v2sf __builtin_mips_alnv_ps (v2sf, v2sf, int)' + Align variable ('alnv.ps'). + + _Note:_ The value of the third parameter must be 0 or 4 modulo 8, + otherwise the result is unpredictable. Please read the instruction + description for details. + + The following multi-instruction functions are also available. In each +case, COND can be any of the 16 floating-point conditions: 'f', 'un', +'eq', 'ueq', 'olt', 'ult', 'ole', 'ule', 'sf', 'ngle', 'seq', 'ngl', +'lt', 'nge', 'le' or 'ngt'. + +'v2sf __builtin_mips_movt_c_COND_ps (v2sf A, v2sf B, v2sf C, v2sf D)' +'v2sf __builtin_mips_movf_c_COND_ps (v2sf A, v2sf B, v2sf C, v2sf D)' + Conditional move based on floating-point comparison ('c.COND.ps', + 'movt.ps'/'movf.ps'). + + The 'movt' functions return the value X computed by: + + c.COND.ps CC,A,B + mov.ps X,C + movt.ps X,D,CC + + The 'movf' functions are similar but use 'movf.ps' instead of + 'movt.ps'. + +'int __builtin_mips_upper_c_COND_ps (v2sf A, v2sf B)' +'int __builtin_mips_lower_c_COND_ps (v2sf A, v2sf B)' + Comparison of two paired-single values ('c.COND.ps', + 'bc1t'/'bc1f'). + + These functions compare A and B using 'c.COND.ps' and return either + the upper or lower half of the result. For example: + + v2sf a, b; + if (__builtin_mips_upper_c_eq_ps (a, b)) + upper_halves_are_equal (); + else + upper_halves_are_unequal (); + + if (__builtin_mips_lower_c_eq_ps (a, b)) + lower_halves_are_equal (); + else + lower_halves_are_unequal (); + + +File: gcc.info, Node: MIPS-3D Built-in Functions, Prev: Paired-Single Built-in Functions, Up: MIPS Loongson Built-in Functions + +6.57.15.3 MIPS-3D Built-in Functions +.................................... + +The MIPS-3D Application-Specific Extension (ASE) includes additional +paired-single instructions that are designed to improve the performance +of 3D graphics operations. Support for these instructions is controlled +by the '-mips3d' command-line option. + + The functions listed below map directly to a particular MIPS-3D +instruction. Please refer to the architecture specification for more +details on what each instruction does. + +'v2sf __builtin_mips_addr_ps (v2sf, v2sf)' + Reduction add ('addr.ps'). + +'v2sf __builtin_mips_mulr_ps (v2sf, v2sf)' + Reduction multiply ('mulr.ps'). + +'v2sf __builtin_mips_cvt_pw_ps (v2sf)' + Convert paired single to paired word ('cvt.pw.ps'). + +'v2sf __builtin_mips_cvt_ps_pw (v2sf)' + Convert paired word to paired single ('cvt.ps.pw'). + +'float __builtin_mips_recip1_s (float)' +'double __builtin_mips_recip1_d (double)' +'v2sf __builtin_mips_recip1_ps (v2sf)' + Reduced-precision reciprocal (sequence step 1) ('recip1.FMT'). + +'float __builtin_mips_recip2_s (float, float)' +'double __builtin_mips_recip2_d (double, double)' +'v2sf __builtin_mips_recip2_ps (v2sf, v2sf)' + Reduced-precision reciprocal (sequence step 2) ('recip2.FMT'). + +'float __builtin_mips_rsqrt1_s (float)' +'double __builtin_mips_rsqrt1_d (double)' +'v2sf __builtin_mips_rsqrt1_ps (v2sf)' + Reduced-precision reciprocal square root (sequence step 1) + ('rsqrt1.FMT'). + +'float __builtin_mips_rsqrt2_s (float, float)' +'double __builtin_mips_rsqrt2_d (double, double)' +'v2sf __builtin_mips_rsqrt2_ps (v2sf, v2sf)' + Reduced-precision reciprocal square root (sequence step 2) + ('rsqrt2.FMT'). + + The following multi-instruction functions are also available. In each +case, COND can be any of the 16 floating-point conditions: 'f', 'un', +'eq', 'ueq', 'olt', 'ult', 'ole', 'ule', 'sf', 'ngle', 'seq', 'ngl', +'lt', 'nge', 'le' or 'ngt'. + +'int __builtin_mips_cabs_COND_s (float A, float B)' +'int __builtin_mips_cabs_COND_d (double A, double B)' + Absolute comparison of two scalar values ('cabs.COND.FMT', + 'bc1t'/'bc1f'). + + These functions compare A and B using 'cabs.COND.s' or + 'cabs.COND.d' and return the result as a boolean value. For + example: + + float a, b; + if (__builtin_mips_cabs_eq_s (a, b)) + true (); + else + false (); + +'int __builtin_mips_upper_cabs_COND_ps (v2sf A, v2sf B)' +'int __builtin_mips_lower_cabs_COND_ps (v2sf A, v2sf B)' + Absolute comparison of two paired-single values ('cabs.COND.ps', + 'bc1t'/'bc1f'). + + These functions compare A and B using 'cabs.COND.ps' and return + either the upper or lower half of the result. For example: + + v2sf a, b; + if (__builtin_mips_upper_cabs_eq_ps (a, b)) + upper_halves_are_equal (); + else + upper_halves_are_unequal (); + + if (__builtin_mips_lower_cabs_eq_ps (a, b)) + lower_halves_are_equal (); + else + lower_halves_are_unequal (); + +'v2sf __builtin_mips_movt_cabs_COND_ps (v2sf A, v2sf B, v2sf C, v2sf D)' +'v2sf __builtin_mips_movf_cabs_COND_ps (v2sf A, v2sf B, v2sf C, v2sf D)' + Conditional move based on absolute comparison ('cabs.COND.ps', + 'movt.ps'/'movf.ps'). + + The 'movt' functions return the value X computed by: + + cabs.COND.ps CC,A,B + mov.ps X,C + movt.ps X,D,CC + + The 'movf' functions are similar but use 'movf.ps' instead of + 'movt.ps'. + +'int __builtin_mips_any_c_COND_ps (v2sf A, v2sf B)' +'int __builtin_mips_all_c_COND_ps (v2sf A, v2sf B)' +'int __builtin_mips_any_cabs_COND_ps (v2sf A, v2sf B)' +'int __builtin_mips_all_cabs_COND_ps (v2sf A, v2sf B)' + Comparison of two paired-single values ('c.COND.ps'/'cabs.COND.ps', + 'bc1any2t'/'bc1any2f'). + + These functions compare A and B using 'c.COND.ps' or + 'cabs.COND.ps'. The 'any' forms return true if either result is + true and the 'all' forms return true if both results are true. For + example: + + v2sf a, b; + if (__builtin_mips_any_c_eq_ps (a, b)) + one_is_true (); + else + both_are_false (); + + if (__builtin_mips_all_c_eq_ps (a, b)) + both_are_true (); + else + one_is_false (); + +'int __builtin_mips_any_c_COND_4s (v2sf A, v2sf B, v2sf C, v2sf D)' +'int __builtin_mips_all_c_COND_4s (v2sf A, v2sf B, v2sf C, v2sf D)' +'int __builtin_mips_any_cabs_COND_4s (v2sf A, v2sf B, v2sf C, v2sf D)' +'int __builtin_mips_all_cabs_COND_4s (v2sf A, v2sf B, v2sf C, v2sf D)' + Comparison of four paired-single values + ('c.COND.ps'/'cabs.COND.ps', 'bc1any4t'/'bc1any4f'). + + These functions use 'c.COND.ps' or 'cabs.COND.ps' to compare A with + B and to compare C with D. The 'any' forms return true if any of + the four results are true and the 'all' forms return true if all + four results are true. For example: + + v2sf a, b, c, d; + if (__builtin_mips_any_c_eq_4s (a, b, c, d)) + some_are_true (); + else + all_are_false (); + + if (__builtin_mips_all_c_eq_4s (a, b, c, d)) + all_are_true (); + else + some_are_false (); + + +File: gcc.info, Node: Other MIPS Built-in Functions, Next: MSP430 Built-in Functions, Prev: MIPS Loongson Built-in Functions, Up: Target Builtins + +6.57.16 Other MIPS Built-in Functions +------------------------------------- + +GCC provides other MIPS-specific built-in functions: + +'void __builtin_mips_cache (int OP, const volatile void *ADDR)' + Insert a 'cache' instruction with operands OP and ADDR. GCC + defines the preprocessor macro '___GCC_HAVE_BUILTIN_MIPS_CACHE' + when this function is available. + +'unsigned int __builtin_mips_get_fcsr (void)' +'void __builtin_mips_set_fcsr (unsigned int VALUE)' + Get and set the contents of the floating-point control and status + register (FPU control register 31). These functions are only + available in hard-float code but can be called in both MIPS16 and + non-MIPS16 contexts. + + '__builtin_mips_set_fcsr' can be used to change any bit of the + register except the condition codes, which GCC assumes are + preserved. + + +File: gcc.info, Node: MSP430 Built-in Functions, Next: NDS32 Built-in Functions, Prev: Other MIPS Built-in Functions, Up: Target Builtins + +6.57.17 MSP430 Built-in Functions +--------------------------------- + +GCC provides a couple of special builtin functions to aid in the writing +of interrupt handlers in C. + +'__bic_SR_register_on_exit (int MASK)' + This clears the indicated bits in the saved copy of the status + register currently residing on the stack. This only works inside + interrupt handlers and the changes to the status register will only + take affect once the handler returns. + +'__bis_SR_register_on_exit (int MASK)' + This sets the indicated bits in the saved copy of the status + register currently residing on the stack. This only works inside + interrupt handlers and the changes to the status register will only + take affect once the handler returns. + + +File: gcc.info, Node: NDS32 Built-in Functions, Next: picoChip Built-in Functions, Prev: MSP430 Built-in Functions, Up: Target Builtins + +6.57.18 NDS32 Built-in Functions +-------------------------------- + +These built-in functions are available for the NDS32 target: + + -- Built-in Function: void __builtin_nds32_isync (int *ADDR) + Insert an ISYNC instruction into the instruction stream where ADDR + is an instruction address for serialization. + + -- Built-in Function: void __builtin_nds32_isb (void) + Insert an ISB instruction into the instruction stream. + + -- Built-in Function: int __builtin_nds32_mfsr (int SR) + Return the content of a system register which is mapped by SR. + + -- Built-in Function: int __builtin_nds32_mfusr (int USR) + Return the content of a user space register which is mapped by USR. + + -- Built-in Function: void __builtin_nds32_mtsr (int VALUE, int SR) + Move the VALUE to a system register which is mapped by SR. + + -- Built-in Function: void __builtin_nds32_mtusr (int VALUE, int USR) + Move the VALUE to a user space register which is mapped by USR. + + -- Built-in Function: void __builtin_nds32_setgie_en (void) + Enable global interrupt. + + -- Built-in Function: void __builtin_nds32_setgie_dis (void) + Disable global interrupt. + + +File: gcc.info, Node: picoChip Built-in Functions, Next: PowerPC Built-in Functions, Prev: NDS32 Built-in Functions, Up: Target Builtins + +6.57.19 picoChip Built-in Functions +----------------------------------- + +GCC provides an interface to selected machine instructions from the +picoChip instruction set. + +'int __builtin_sbc (int VALUE)' + Sign bit count. Return the number of consecutive bits in VALUE + that have the same value as the sign bit. The result is the number + of leading sign bits minus one, giving the number of redundant sign + bits in VALUE. + +'int __builtin_byteswap (int VALUE)' + Byte swap. Return the result of swapping the upper and lower bytes + of VALUE. + +'int __builtin_brev (int VALUE)' + Bit reversal. Return the result of reversing the bits in VALUE. + Bit 15 is swapped with bit 0, bit 14 is swapped with bit 1, and so + on. + +'int __builtin_adds (int X, int Y)' + Saturating addition. Return the result of adding X and Y, storing + the value 32767 if the result overflows. + +'int __builtin_subs (int X, int Y)' + Saturating subtraction. Return the result of subtracting Y from X, + storing the value -32768 if the result overflows. + +'void __builtin_halt (void)' + Halt. The processor stops execution. This built-in is useful for + implementing assertions. + + +File: gcc.info, Node: PowerPC Built-in Functions, Next: PowerPC AltiVec/VSX Built-in Functions, Prev: picoChip Built-in Functions, Up: Target Builtins + +6.57.20 PowerPC Built-in Functions +---------------------------------- + +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); + long __builtin_bpermd (long, long); + uint64_t __builtin_ppc_get_timebase (); + unsigned long __builtin_ppc_mftb (); + + 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. + + +File: gcc.info, Node: PowerPC AltiVec/VSX Built-in Functions, Next: PowerPC Hardware Transactional Memory Built-in Functions, Prev: PowerPC Built-in Functions, Up: Target Builtins + +6.57.21 PowerPC AltiVec Built-in Functions +------------------------------------------ + +GCC provides an interface for the PowerPC family of processors to access +the AltiVec operations described in Motorola's AltiVec Programming +Interface Manual. The interface is made available by including +'<altivec.h>' and using '-maltivec' and '-mabi=altivec'. The interface +supports the following vector types. + + vector unsigned char + vector signed char + vector bool char + + vector unsigned short + vector signed short + vector bool short + vector pixel + + vector unsigned int + vector signed int + vector bool int + vector float + + If '-mvsx' is used the following additional vector types are +implemented. + + vector unsigned long + vector signed long + vector double + + 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. + + * A vector constant is a list of constant expressions within curly + braces. + + * A vector initializer requires no cast if the vector constant is of + the same type as the variable it is initializing. + + * If 'signed' or 'unsigned' is omitted, the signedness of the vector + type is the default signedness of the base type. The default + varies depending on the operating system, so a portable program + should always specify the signedness. + + * Compiling with '-maltivec' adds keywords '__vector', 'vector', + '__pixel', 'pixel', '__bool' and 'bool'. When compiling ISO C, the + context-sensitive substitution of the keywords 'vector', 'pixel' + and 'bool' is disabled. To use them, you must include + '<altivec.h>' instead. + + * GCC allows using a 'typedef' name as the type specifier for a + vector type. + + * For C, overloaded functions are implemented with macros so the + following does not work: + + vec_add ((vector signed int){1, 2, 3, 4}, foo); + + Since 'vec_add' is a macro, the vector constant in the example is + treated as four separate arguments. Wrap the entire argument in + parentheses for this to work. + + _Note:_ Only the '<altivec.h>' interface is supported. Internally, GCC +uses built-in functions to achieve the functionality in the +aforementioned header file, but they are not supported and are subject +to change without notice. + + The following interfaces are supported for the generic and specific +AltiVec operations and the AltiVec predicates. In cases where there is +a direct mapping between generic and specific operations, only the +generic names are shown here, although the specific operations can also +be used. + + Arguments that are documented as 'const int' require literal integral +values within the range required for that operation. + + vector signed char vec_abs (vector signed char); + vector signed short vec_abs (vector signed short); + vector signed int vec_abs (vector signed int); + vector float vec_abs (vector float); + + vector signed char vec_abss (vector signed char); + vector signed short vec_abss (vector signed short); + vector signed int vec_abss (vector signed int); + + vector signed char vec_add (vector bool char, vector signed char); + vector signed char vec_add (vector signed char, vector bool char); + vector signed char vec_add (vector signed char, vector signed char); + vector unsigned char vec_add (vector bool char, vector unsigned char); + vector unsigned char vec_add (vector unsigned char, vector bool char); + vector unsigned char vec_add (vector unsigned char, + vector unsigned char); + vector signed short vec_add (vector bool short, vector signed short); + vector signed short vec_add (vector signed short, vector bool short); + vector signed short vec_add (vector signed short, vector signed short); + vector unsigned short vec_add (vector bool short, + vector unsigned short); + vector unsigned short vec_add (vector unsigned short, + vector bool short); + vector unsigned short vec_add (vector unsigned short, + vector unsigned short); + vector signed int vec_add (vector bool int, vector signed int); + vector signed int vec_add (vector signed int, vector bool int); + vector signed int vec_add (vector signed int, vector signed int); + vector unsigned int vec_add (vector bool int, vector unsigned int); + vector unsigned int vec_add (vector unsigned int, vector bool int); + vector unsigned int vec_add (vector unsigned int, vector unsigned int); + vector float vec_add (vector float, vector float); + + vector float vec_vaddfp (vector float, vector float); + + vector signed int vec_vadduwm (vector bool int, vector signed int); + vector signed int vec_vadduwm (vector signed int, vector bool int); + vector signed int vec_vadduwm (vector signed int, vector signed int); + vector unsigned int vec_vadduwm (vector bool int, vector unsigned int); + vector unsigned int vec_vadduwm (vector unsigned int, vector bool int); + vector unsigned int vec_vadduwm (vector unsigned int, + vector unsigned int); + + vector signed short vec_vadduhm (vector bool short, + vector signed short); + vector signed short vec_vadduhm (vector signed short, + vector bool short); + vector signed short vec_vadduhm (vector signed short, + vector signed short); + vector unsigned short vec_vadduhm (vector bool short, + vector unsigned short); + vector unsigned short vec_vadduhm (vector unsigned short, + vector bool short); + vector unsigned short vec_vadduhm (vector unsigned short, + vector unsigned short); + + vector signed char vec_vaddubm (vector bool char, vector signed char); + vector signed char vec_vaddubm (vector signed char, vector bool char); + vector signed char vec_vaddubm (vector signed char, vector signed char); + vector unsigned char vec_vaddubm (vector bool char, + vector unsigned char); + vector unsigned char vec_vaddubm (vector unsigned char, + vector bool char); + vector unsigned char vec_vaddubm (vector unsigned char, + vector unsigned char); + + vector unsigned int vec_addc (vector unsigned int, vector unsigned int); + + vector unsigned char vec_adds (vector bool char, vector unsigned char); + vector unsigned char vec_adds (vector unsigned char, vector bool char); + vector unsigned char vec_adds (vector unsigned char, + vector unsigned char); + vector signed char vec_adds (vector bool char, vector signed char); + vector signed char vec_adds (vector signed char, vector bool char); + vector signed char vec_adds (vector signed char, vector signed char); + vector unsigned short vec_adds (vector bool short, + vector unsigned short); + vector unsigned short vec_adds (vector unsigned short, + vector bool short); + vector unsigned short vec_adds (vector unsigned short, + vector unsigned short); + vector signed short vec_adds (vector bool short, vector signed short); + vector signed short vec_adds (vector signed short, vector bool short); + vector signed short vec_adds (vector signed short, vector signed short); + vector unsigned int vec_adds (vector bool int, vector unsigned int); + vector unsigned int vec_adds (vector unsigned int, vector bool int); + vector unsigned int vec_adds (vector unsigned int, vector unsigned int); + vector signed int vec_adds (vector bool int, vector signed int); + vector signed int vec_adds (vector signed int, vector bool int); + vector signed int vec_adds (vector signed int, vector signed int); + + vector signed int vec_vaddsws (vector bool int, vector signed int); + vector signed int vec_vaddsws (vector signed int, vector bool int); + vector signed int vec_vaddsws (vector signed int, vector signed int); + + vector unsigned int vec_vadduws (vector bool int, vector unsigned int); + vector unsigned int vec_vadduws (vector unsigned int, vector bool int); + vector unsigned int vec_vadduws (vector unsigned int, + vector unsigned int); + + vector signed short vec_vaddshs (vector bool short, + vector signed short); + vector signed short vec_vaddshs (vector signed short, + vector bool short); + vector signed short vec_vaddshs (vector signed short, + vector signed short); + + vector unsigned short vec_vadduhs (vector bool short, + vector unsigned short); + vector unsigned short vec_vadduhs (vector unsigned short, + vector bool short); + vector unsigned short vec_vadduhs (vector unsigned short, + vector unsigned short); + + vector signed char vec_vaddsbs (vector bool char, vector signed char); + vector signed char vec_vaddsbs (vector signed char, vector bool char); + vector signed char vec_vaddsbs (vector signed char, vector signed char); + + vector unsigned char vec_vaddubs (vector bool char, + vector unsigned char); + vector unsigned char vec_vaddubs (vector unsigned char, + vector bool char); + vector unsigned char vec_vaddubs (vector unsigned char, + vector unsigned char); + + vector float vec_and (vector float, vector float); + vector float vec_and (vector float, vector bool int); + vector float vec_and (vector bool int, vector float); + vector bool int vec_and (vector bool int, vector bool int); + vector signed int vec_and (vector bool int, vector signed int); + vector signed int vec_and (vector signed int, vector bool int); + vector signed int vec_and (vector signed int, vector signed int); + vector unsigned int vec_and (vector bool int, vector unsigned int); + vector unsigned int vec_and (vector unsigned int, vector bool int); + vector unsigned int vec_and (vector unsigned int, vector unsigned int); + vector bool short vec_and (vector bool short, vector bool short); + vector signed short vec_and (vector bool short, vector signed short); + vector signed short vec_and (vector signed short, vector bool short); + vector signed short vec_and (vector signed short, vector signed short); + vector unsigned short vec_and (vector bool short, + vector unsigned short); + vector unsigned short vec_and (vector unsigned short, + vector bool short); + vector unsigned short vec_and (vector unsigned short, + vector unsigned short); + vector signed char vec_and (vector bool char, vector signed char); + vector bool char vec_and (vector bool char, vector bool char); + vector signed char vec_and (vector signed char, vector bool char); + vector signed char vec_and (vector signed char, vector signed char); + vector unsigned char vec_and (vector bool char, vector unsigned char); + vector unsigned char vec_and (vector unsigned char, vector bool char); + vector unsigned char vec_and (vector unsigned char, + vector unsigned char); + + vector float vec_andc (vector float, vector float); + vector float vec_andc (vector float, vector bool int); + vector float vec_andc (vector bool int, vector float); + vector bool int vec_andc (vector bool int, vector bool int); + vector signed int vec_andc (vector bool int, vector signed int); + vector signed int vec_andc (vector signed int, vector bool int); + vector signed int vec_andc (vector signed int, vector signed int); + vector unsigned int vec_andc (vector bool int, vector unsigned int); + vector unsigned int vec_andc (vector unsigned int, vector bool int); + vector unsigned int vec_andc (vector unsigned int, vector unsigned int); + vector bool short vec_andc (vector bool short, vector bool short); + vector signed short vec_andc (vector bool short, vector signed short); + vector signed short vec_andc (vector signed short, vector bool short); + vector signed short vec_andc (vector signed short, vector signed short); + vector unsigned short vec_andc (vector bool short, + vector unsigned short); + vector unsigned short vec_andc (vector unsigned short, + vector bool short); + vector unsigned short vec_andc (vector unsigned short, + vector unsigned short); + vector signed char vec_andc (vector bool char, vector signed char); + vector bool char vec_andc (vector bool char, vector bool char); + vector signed char vec_andc (vector signed char, vector bool char); + vector signed char vec_andc (vector signed char, vector signed char); + vector unsigned char vec_andc (vector bool char, vector unsigned char); + vector unsigned char vec_andc (vector unsigned char, vector bool char); + vector unsigned char vec_andc (vector unsigned char, + vector unsigned char); + + vector unsigned char vec_avg (vector unsigned char, + vector unsigned char); + vector signed char vec_avg (vector signed char, vector signed char); + vector unsigned short vec_avg (vector unsigned short, + vector unsigned short); + vector signed short vec_avg (vector signed short, vector signed short); + vector unsigned int vec_avg (vector unsigned int, vector unsigned int); + vector signed int vec_avg (vector signed int, vector signed int); + + vector signed int vec_vavgsw (vector signed int, vector signed int); + + vector unsigned int vec_vavguw (vector unsigned int, + vector unsigned int); + + vector signed short vec_vavgsh (vector signed short, + vector signed short); + + vector unsigned short vec_vavguh (vector unsigned short, + vector unsigned short); + + 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); + + vector bool char vec_cmpeq (vector signed char, vector signed char); + vector bool char vec_cmpeq (vector unsigned char, vector unsigned char); + vector bool short vec_cmpeq (vector signed short, vector signed short); + vector bool short vec_cmpeq (vector unsigned short, + vector unsigned short); + vector bool int vec_cmpeq (vector signed int, vector signed int); + vector bool int vec_cmpeq (vector unsigned int, vector unsigned int); + vector bool int vec_cmpeq (vector float, vector float); + + vector bool int vec_vcmpeqfp (vector float, vector float); + + vector bool int vec_vcmpequw (vector signed int, vector signed int); + vector bool int vec_vcmpequw (vector unsigned int, vector unsigned int); + + vector bool short vec_vcmpequh (vector signed short, + vector signed short); + vector bool short vec_vcmpequh (vector unsigned short, + vector unsigned short); + + vector bool char vec_vcmpequb (vector signed char, vector signed char); + vector bool char vec_vcmpequb (vector unsigned char, + vector unsigned char); + + vector bool int vec_cmpge (vector float, vector float); + + vector bool char vec_cmpgt (vector unsigned char, vector unsigned char); + vector bool char vec_cmpgt (vector signed char, vector signed char); + vector bool short vec_cmpgt (vector unsigned short, + vector unsigned short); + vector bool short vec_cmpgt (vector signed short, vector signed short); + vector bool int vec_cmpgt (vector unsigned int, vector unsigned int); + vector bool int vec_cmpgt (vector signed int, vector signed int); + vector bool int vec_cmpgt (vector float, vector float); + + vector bool int vec_vcmpgtfp (vector float, vector float); + + vector bool int vec_vcmpgtsw (vector signed int, vector signed int); + + vector bool int vec_vcmpgtuw (vector unsigned int, vector unsigned int); + + vector bool short vec_vcmpgtsh (vector signed short, + vector signed short); + + vector bool short vec_vcmpgtuh (vector unsigned short, + vector unsigned short); + + vector bool char vec_vcmpgtsb (vector signed char, vector signed char); + + vector bool char vec_vcmpgtub (vector unsigned char, + vector unsigned char); + + vector bool int vec_cmple (vector float, vector float); + + vector bool char vec_cmplt (vector unsigned char, vector unsigned char); + vector bool char vec_cmplt (vector signed char, vector signed char); + vector bool short vec_cmplt (vector unsigned short, + vector unsigned short); + vector bool short vec_cmplt (vector signed short, vector signed short); + vector bool int vec_cmplt (vector unsigned int, vector unsigned int); + vector bool int vec_cmplt (vector signed int, vector signed int); + vector bool int vec_cmplt (vector float, vector float); + + vector float vec_ctf (vector unsigned int, const int); + vector float vec_ctf (vector signed int, const int); + + vector float vec_vcfsx (vector signed int, const int); + + vector float vec_vcfux (vector unsigned int, const int); + + vector signed int vec_cts (vector float, const int); + + vector unsigned int vec_ctu (vector float, const int); + + void vec_dss (const int); + + void vec_dssall (void); + + void vec_dst (const vector unsigned char *, int, const int); + void vec_dst (const vector signed char *, int, const int); + void vec_dst (const vector bool char *, int, const int); + void vec_dst (const vector unsigned short *, int, const int); + void vec_dst (const vector signed short *, int, const int); + void vec_dst (const vector bool short *, int, const int); + void vec_dst (const vector pixel *, int, const int); + void vec_dst (const vector unsigned int *, int, const int); + void vec_dst (const vector signed int *, int, const int); + void vec_dst (const vector bool int *, int, const int); + void vec_dst (const vector float *, int, const int); + void vec_dst (const unsigned char *, int, const int); + void vec_dst (const signed char *, int, const int); + void vec_dst (const unsigned short *, int, const int); + void vec_dst (const short *, int, const int); + void vec_dst (const unsigned int *, int, const int); + void vec_dst (const int *, int, const int); + void vec_dst (const unsigned long *, int, const int); + void vec_dst (const long *, int, const int); + void vec_dst (const float *, int, const int); + + void vec_dstst (const vector unsigned char *, int, const int); + void vec_dstst (const vector signed char *, int, const int); + void vec_dstst (const vector bool char *, int, const int); + void vec_dstst (const vector unsigned short *, int, const int); + void vec_dstst (const vector signed short *, int, const int); + void vec_dstst (const vector bool short *, int, const int); + void vec_dstst (const vector pixel *, int, const int); + void vec_dstst (const vector unsigned int *, int, const int); + void vec_dstst (const vector signed int *, int, const int); + void vec_dstst (const vector bool int *, int, const int); + void vec_dstst (const vector float *, int, const int); + void vec_dstst (const unsigned char *, int, const int); + void vec_dstst (const signed char *, int, const int); + void vec_dstst (const unsigned short *, int, const int); + void vec_dstst (const short *, int, const int); + void vec_dstst (const unsigned int *, int, const int); + void vec_dstst (const int *, int, const int); + void vec_dstst (const unsigned long *, int, const int); + void vec_dstst (const long *, int, const int); + void vec_dstst (const float *, int, const int); + + void vec_dststt (const vector unsigned char *, int, const int); + void vec_dststt (const vector signed char *, int, const int); + void vec_dststt (const vector bool char *, int, const int); + void vec_dststt (const vector unsigned short *, int, const int); + void vec_dststt (const vector signed short *, int, const int); + void vec_dststt (const vector bool short *, int, const int); + void vec_dststt (const vector pixel *, int, const int); + void vec_dststt (const vector unsigned int *, int, const int); + void vec_dststt (const vector signed int *, int, const int); + void vec_dststt (const vector bool int *, int, const int); + void vec_dststt (const vector float *, int, const int); + void vec_dststt (const unsigned char *, int, const int); + void vec_dststt (const signed char *, int, const int); + void vec_dststt (const unsigned short *, int, const int); + void vec_dststt (const short *, int, const int); + void vec_dststt (const unsigned int *, int, const int); + void vec_dststt (const int *, int, const int); + void vec_dststt (const unsigned long *, int, const int); + void vec_dststt (const long *, int, const int); + void vec_dststt (const float *, int, const int); + + void vec_dstt (const vector unsigned char *, int, const int); + void vec_dstt (const vector signed char *, int, const int); + void vec_dstt (const vector bool char *, int, const int); + void vec_dstt (const vector unsigned short *, int, const int); + void vec_dstt (const vector signed short *, int, const int); + void vec_dstt (const vector bool short *, int, const int); + void vec_dstt (const vector pixel *, int, const int); + void vec_dstt (const vector unsigned int *, int, const int); + void vec_dstt (const vector signed int *, int, const int); + void vec_dstt (const vector bool int *, int, const int); + void vec_dstt (const vector float *, int, const int); + void vec_dstt (const unsigned char *, int, const int); + void vec_dstt (const signed char *, int, const int); + void vec_dstt (const unsigned short *, int, const int); + void vec_dstt (const short *, int, const int); + void vec_dstt (const unsigned int *, int, const int); + void vec_dstt (const int *, int, const int); + void vec_dstt (const unsigned long *, int, const int); + void vec_dstt (const long *, int, const int); + void vec_dstt (const float *, int, const int); + + vector float vec_expte (vector float); + + vector float vec_floor (vector float); + + vector float vec_ld (int, const vector float *); + vector float vec_ld (int, const float *); + vector bool int vec_ld (int, const vector bool int *); + vector signed int vec_ld (int, const vector signed int *); + vector signed int vec_ld (int, const int *); + vector signed int vec_ld (int, const long *); + vector unsigned int vec_ld (int, const vector unsigned int *); + vector unsigned int vec_ld (int, const unsigned int *); + vector unsigned int vec_ld (int, const unsigned long *); + vector bool short vec_ld (int, const vector bool short *); + vector pixel vec_ld (int, const vector pixel *); + vector signed short vec_ld (int, const vector signed short *); + vector signed short vec_ld (int, const short *); + vector unsigned short vec_ld (int, const vector unsigned short *); + vector unsigned short vec_ld (int, const unsigned short *); + vector bool char vec_ld (int, const vector bool char *); + vector signed char vec_ld (int, const vector signed char *); + vector signed char vec_ld (int, const signed char *); + vector unsigned char vec_ld (int, const vector unsigned char *); + vector unsigned char vec_ld (int, const unsigned char *); + + vector signed char vec_lde (int, const signed char *); + vector unsigned char vec_lde (int, const unsigned char *); + vector signed short vec_lde (int, const short *); + vector unsigned short vec_lde (int, const unsigned short *); + vector float vec_lde (int, const float *); + vector signed int vec_lde (int, const int *); + vector unsigned int vec_lde (int, const unsigned int *); + vector signed int vec_lde (int, const long *); + vector unsigned int vec_lde (int, const unsigned long *); + + vector float vec_lvewx (int, float *); + vector signed int vec_lvewx (int, int *); + vector unsigned int vec_lvewx (int, unsigned int *); + vector signed int vec_lvewx (int, long *); + vector unsigned int vec_lvewx (int, unsigned long *); + + vector signed short vec_lvehx (int, short *); + vector unsigned short vec_lvehx (int, unsigned short *); + + vector signed char vec_lvebx (int, char *); + vector unsigned char vec_lvebx (int, unsigned char *); + + vector float vec_ldl (int, const vector float *); + vector float vec_ldl (int, const float *); + vector bool int vec_ldl (int, const vector bool int *); + vector signed int vec_ldl (int, const vector signed int *); + vector signed int vec_ldl (int, const int *); + vector signed int vec_ldl (int, const long *); + vector unsigned int vec_ldl (int, const vector unsigned int *); + vector unsigned int vec_ldl (int, const unsigned int *); + vector unsigned int vec_ldl (int, const unsigned long *); + vector bool short vec_ldl (int, const vector bool short *); + vector pixel vec_ldl (int, const vector pixel *); + vector signed short vec_ldl (int, const vector signed short *); + vector signed short vec_ldl (int, const short *); + vector unsigned short vec_ldl (int, const vector unsigned short *); + vector unsigned short vec_ldl (int, const unsigned short *); + vector bool char vec_ldl (int, const vector bool char *); + vector signed char vec_ldl (int, const vector signed char *); + vector signed char vec_ldl (int, const signed char *); + vector unsigned char vec_ldl (int, const vector unsigned char *); + vector unsigned char vec_ldl (int, const unsigned char *); + + vector float vec_loge (vector float); + + vector unsigned char vec_lvsl (int, const volatile unsigned char *); + vector unsigned char vec_lvsl (int, const volatile signed char *); + vector unsigned char vec_lvsl (int, const volatile unsigned short *); + vector unsigned char vec_lvsl (int, const volatile short *); + vector unsigned char vec_lvsl (int, const volatile unsigned int *); + vector unsigned char vec_lvsl (int, const volatile int *); + vector unsigned char vec_lvsl (int, const volatile unsigned long *); + vector unsigned char vec_lvsl (int, const volatile long *); + vector unsigned char vec_lvsl (int, const volatile float *); + + vector unsigned char vec_lvsr (int, const volatile unsigned char *); + vector unsigned char vec_lvsr (int, const volatile signed char *); + vector unsigned char vec_lvsr (int, const volatile unsigned short *); + vector unsigned char vec_lvsr (int, const volatile short *); + vector unsigned char vec_lvsr (int, const volatile unsigned int *); + vector unsigned char vec_lvsr (int, const volatile int *); + vector unsigned char vec_lvsr (int, const volatile unsigned long *); + vector unsigned char vec_lvsr (int, const volatile long *); + vector unsigned char vec_lvsr (int, const volatile float *); + + vector float vec_madd (vector float, vector float, vector float); + + vector signed short vec_madds (vector signed short, + vector signed short, + vector signed short); + + vector unsigned char vec_max (vector bool char, vector unsigned char); + vector unsigned char vec_max (vector unsigned char, vector bool char); + vector unsigned char vec_max (vector unsigned char, + vector unsigned char); + vector signed char vec_max (vector bool char, vector signed char); + vector signed char vec_max (vector signed char, vector bool char); + vector signed char vec_max (vector signed char, vector signed char); + vector unsigned short vec_max (vector bool short, + vector unsigned short); + vector unsigned short vec_max (vector unsigned short, + vector bool short); + vector unsigned short vec_max (vector unsigned short, + vector unsigned short); + vector signed short vec_max (vector bool short, vector signed short); + vector signed short vec_max (vector signed short, vector bool short); + vector signed short vec_max (vector signed short, vector signed short); + vector unsigned int vec_max (vector bool int, vector unsigned int); + vector unsigned int vec_max (vector unsigned int, vector bool int); + vector unsigned int vec_max (vector unsigned int, vector unsigned int); + vector signed int vec_max (vector bool int, vector signed int); + vector signed int vec_max (vector signed int, vector bool int); + vector signed int vec_max (vector signed int, vector signed int); + vector float vec_max (vector float, vector float); + + vector float vec_vmaxfp (vector float, vector float); + + vector signed int vec_vmaxsw (vector bool int, vector signed int); + vector signed int vec_vmaxsw (vector signed int, vector bool int); + vector signed int vec_vmaxsw (vector signed int, vector signed int); + + vector unsigned int vec_vmaxuw (vector bool int, vector unsigned int); + vector unsigned int vec_vmaxuw (vector unsigned int, vector bool int); + vector unsigned int vec_vmaxuw (vector unsigned int, + vector unsigned int); + + vector signed short vec_vmaxsh (vector bool short, vector signed short); + vector signed short vec_vmaxsh (vector signed short, vector bool short); + vector signed short vec_vmaxsh (vector signed short, + vector signed short); + + vector unsigned short vec_vmaxuh (vector bool short, + vector unsigned short); + vector unsigned short vec_vmaxuh (vector unsigned short, + vector bool short); + vector unsigned short vec_vmaxuh (vector unsigned short, + vector unsigned short); + + vector signed char vec_vmaxsb (vector bool char, vector signed char); + vector signed char vec_vmaxsb (vector signed char, vector bool char); + vector signed char vec_vmaxsb (vector signed char, vector signed char); + + vector unsigned char vec_vmaxub (vector bool char, + vector unsigned char); + vector unsigned char vec_vmaxub (vector unsigned char, + vector bool char); + vector unsigned char vec_vmaxub (vector unsigned char, + vector unsigned char); + + vector bool char vec_mergeh (vector bool char, vector bool char); + vector signed char vec_mergeh (vector signed char, vector signed char); + vector unsigned char vec_mergeh (vector unsigned char, + vector unsigned char); + vector bool short vec_mergeh (vector bool short, vector bool short); + vector pixel vec_mergeh (vector pixel, vector pixel); + vector signed short vec_mergeh (vector signed short, + vector signed short); + vector unsigned short vec_mergeh (vector unsigned short, + vector unsigned short); + vector float vec_mergeh (vector float, vector float); + vector bool int vec_mergeh (vector bool int, vector bool int); + vector signed int vec_mergeh (vector signed int, vector signed int); + vector unsigned int vec_mergeh (vector unsigned int, + vector unsigned int); + + vector float vec_vmrghw (vector float, vector float); + vector bool int vec_vmrghw (vector bool int, vector bool int); + vector signed int vec_vmrghw (vector signed int, vector signed int); + vector unsigned int vec_vmrghw (vector unsigned int, + vector unsigned int); + + vector bool short vec_vmrghh (vector bool short, vector bool short); + vector signed short vec_vmrghh (vector signed short, + vector signed short); + vector unsigned short vec_vmrghh (vector unsigned short, + vector unsigned short); + vector pixel vec_vmrghh (vector pixel, vector pixel); + + vector bool char vec_vmrghb (vector bool char, vector bool char); + vector signed char vec_vmrghb (vector signed char, vector signed char); + vector unsigned char vec_vmrghb (vector unsigned char, + vector unsigned char); + + vector bool char vec_mergel (vector bool char, vector bool char); + vector signed char vec_mergel (vector signed char, vector signed char); + vector unsigned char vec_mergel (vector unsigned char, + vector unsigned char); + vector bool short vec_mergel (vector bool short, vector bool short); + vector pixel vec_mergel (vector pixel, vector pixel); + vector signed short vec_mergel (vector signed short, + vector signed short); + vector unsigned short vec_mergel (vector unsigned short, + vector unsigned short); + vector float vec_mergel (vector float, vector float); + vector bool int vec_mergel (vector bool int, vector bool int); + vector signed int vec_mergel (vector signed int, vector signed int); + vector unsigned int vec_mergel (vector unsigned int, + vector unsigned int); + + vector float vec_vmrglw (vector float, vector float); + vector signed int vec_vmrglw (vector signed int, vector signed int); + vector unsigned int vec_vmrglw (vector unsigned int, + vector unsigned int); + vector bool int vec_vmrglw (vector bool int, vector bool int); + + vector bool short vec_vmrglh (vector bool short, vector bool short); + vector signed short vec_vmrglh (vector signed short, + vector signed short); + vector unsigned short vec_vmrglh (vector unsigned short, + vector unsigned short); + vector pixel vec_vmrglh (vector pixel, vector pixel); + + vector bool char vec_vmrglb (vector bool char, vector bool char); + vector signed char vec_vmrglb (vector signed char, vector signed char); + vector unsigned char vec_vmrglb (vector unsigned char, + vector unsigned char); + + vector unsigned short vec_mfvscr (void); + + vector unsigned char vec_min (vector bool char, vector unsigned char); + vector unsigned char vec_min (vector unsigned char, vector bool char); + vector unsigned char vec_min (vector unsigned char, + vector unsigned char); + vector signed char vec_min (vector bool char, vector signed char); + vector signed char vec_min (vector signed char, vector bool char); + vector signed char vec_min (vector signed char, vector signed char); + vector unsigned short vec_min (vector bool short, + vector unsigned short); + vector unsigned short vec_min (vector unsigned short, + vector bool short); + vector unsigned short vec_min (vector unsigned short, + vector unsigned short); + vector signed short vec_min (vector bool short, vector signed short); + vector signed short vec_min (vector signed short, vector bool short); + vector signed short vec_min (vector signed short, vector signed short); + vector unsigned int vec_min (vector bool int, vector unsigned int); + vector unsigned int vec_min (vector unsigned int, vector bool int); + vector unsigned int vec_min (vector unsigned int, vector unsigned int); + vector signed int vec_min (vector bool int, vector signed int); + vector signed int vec_min (vector signed int, vector bool int); + vector signed int vec_min (vector signed int, vector signed int); + vector float vec_min (vector float, vector float); + + vector float vec_vminfp (vector float, vector float); + + vector signed int vec_vminsw (vector bool int, vector signed int); + vector signed int vec_vminsw (vector signed int, vector bool int); + vector signed int vec_vminsw (vector signed int, vector signed int); + + vector unsigned int vec_vminuw (vector bool int, vector unsigned int); + vector unsigned int vec_vminuw (vector unsigned int, vector bool int); + vector unsigned int vec_vminuw (vector unsigned int, + vector unsigned int); + + vector signed short vec_vminsh (vector bool short, vector signed short); + vector signed short vec_vminsh (vector signed short, vector bool short); + vector signed short vec_vminsh (vector signed short, + vector signed short); + + vector unsigned short vec_vminuh (vector bool short, + vector unsigned short); + vector unsigned short vec_vminuh (vector unsigned short, + vector bool short); + vector unsigned short vec_vminuh (vector unsigned short, + vector unsigned short); + + vector signed char vec_vminsb (vector bool char, vector signed char); + vector signed char vec_vminsb (vector signed char, vector bool char); + vector signed char vec_vminsb (vector signed char, vector signed char); + + vector unsigned char vec_vminub (vector bool char, + vector unsigned char); + vector unsigned char vec_vminub (vector unsigned char, + vector bool char); + vector unsigned char vec_vminub (vector unsigned char, + vector unsigned char); + + vector signed short vec_mladd (vector signed short, + vector signed short, + vector signed short); + vector signed short vec_mladd (vector signed short, + vector unsigned short, + vector unsigned short); + vector signed short vec_mladd (vector unsigned short, + vector signed short, + vector signed short); + vector unsigned short vec_mladd (vector unsigned short, + vector unsigned short, + vector unsigned short); + + vector signed short vec_mradds (vector signed short, + vector signed short, + vector signed short); + + vector unsigned int vec_msum (vector unsigned char, + vector unsigned char, + vector unsigned int); + vector signed int vec_msum (vector signed char, + vector unsigned char, + vector signed int); + vector unsigned int vec_msum (vector unsigned short, + vector unsigned short, + vector unsigned int); + vector signed int vec_msum (vector signed short, + vector signed short, + vector signed int); + + vector signed int vec_vmsumshm (vector signed short, + vector signed short, + vector signed int); + + vector unsigned int vec_vmsumuhm (vector unsigned short, + vector unsigned short, + vector unsigned int); + + vector signed int vec_vmsummbm (vector signed char, + vector unsigned char, + vector signed int); + + vector unsigned int vec_vmsumubm (vector unsigned char, + vector unsigned char, + vector unsigned int); + + vector unsigned int vec_msums (vector unsigned short, + vector unsigned short, + vector unsigned int); + vector signed int vec_msums (vector signed short, + vector signed short, + vector signed int); + + vector signed int vec_vmsumshs (vector signed short, + vector signed short, + vector signed int); + + vector unsigned int vec_vmsumuhs (vector unsigned short, + vector unsigned short, + vector unsigned int); + + void vec_mtvscr (vector signed int); + void vec_mtvscr (vector unsigned int); + void vec_mtvscr (vector bool int); + void vec_mtvscr (vector signed short); + void vec_mtvscr (vector unsigned short); + void vec_mtvscr (vector bool short); + void vec_mtvscr (vector pixel); + void vec_mtvscr (vector signed char); + void vec_mtvscr (vector unsigned char); + void vec_mtvscr (vector bool char); + + vector unsigned short vec_mule (vector unsigned char, + vector unsigned char); + vector signed short vec_mule (vector signed char, + vector signed char); + vector unsigned int vec_mule (vector unsigned short, + vector unsigned short); + vector signed int vec_mule (vector signed short, vector signed short); + + vector signed int vec_vmulesh (vector signed short, + vector signed short); + + vector unsigned int vec_vmuleuh (vector unsigned short, + vector unsigned short); + + vector signed short vec_vmulesb (vector signed char, + vector signed char); + + vector unsigned short vec_vmuleub (vector unsigned char, + vector unsigned char); + + vector unsigned short vec_mulo (vector unsigned char, + vector unsigned char); + vector signed short vec_mulo (vector signed char, vector signed char); + vector unsigned int vec_mulo (vector unsigned short, + vector unsigned short); + vector signed int vec_mulo (vector signed short, vector signed short); + + vector signed int vec_vmulosh (vector signed short, + vector signed short); + + vector unsigned int vec_vmulouh (vector unsigned short, + vector unsigned short); + + vector signed short vec_vmulosb (vector signed char, + vector signed char); + + vector unsigned short vec_vmuloub (vector unsigned char, + vector unsigned char); + + vector float vec_nmsub (vector float, vector float, vector float); + + vector float vec_nor (vector float, vector float); + vector signed int vec_nor (vector signed int, vector signed int); + vector unsigned int vec_nor (vector unsigned int, vector unsigned int); + vector bool int vec_nor (vector bool int, vector bool int); + vector signed short vec_nor (vector signed short, vector signed short); + vector unsigned short vec_nor (vector unsigned short, + vector unsigned short); + vector bool short vec_nor (vector bool short, vector bool short); + vector signed char vec_nor (vector signed char, vector signed char); + vector unsigned char vec_nor (vector unsigned char, + vector unsigned char); + vector bool char vec_nor (vector bool char, vector bool char); + + vector float vec_or (vector float, vector float); + vector float vec_or (vector float, vector bool int); + vector float vec_or (vector bool int, vector float); + vector bool int vec_or (vector bool int, vector bool int); + vector signed int vec_or (vector bool int, vector signed int); + vector signed int vec_or (vector signed int, vector bool int); + vector signed int vec_or (vector signed int, vector signed int); + vector unsigned int vec_or (vector bool int, vector unsigned int); + vector unsigned int vec_or (vector unsigned int, vector bool int); + vector unsigned int vec_or (vector unsigned int, vector unsigned int); + vector bool short vec_or (vector bool short, vector bool short); + vector signed short vec_or (vector bool short, vector signed short); + vector signed short vec_or (vector signed short, vector bool short); + vector signed short vec_or (vector signed short, vector signed short); + vector unsigned short vec_or (vector bool short, vector unsigned short); + vector unsigned short vec_or (vector unsigned short, vector bool short); + vector unsigned short vec_or (vector unsigned short, + vector unsigned short); + vector signed char vec_or (vector bool char, vector signed char); + vector bool char vec_or (vector bool char, vector bool char); + vector signed char vec_or (vector signed char, vector bool char); + vector signed char vec_or (vector signed char, vector signed char); + vector unsigned char vec_or (vector bool char, vector unsigned char); + vector unsigned char vec_or (vector unsigned char, vector bool char); + vector unsigned char vec_or (vector unsigned char, + vector unsigned char); + + vector signed char vec_pack (vector signed short, vector signed short); + vector unsigned char vec_pack (vector unsigned short, + vector unsigned short); + vector bool char vec_pack (vector bool short, vector bool short); + vector signed short vec_pack (vector signed int, vector signed int); + vector unsigned short vec_pack (vector unsigned int, + vector unsigned int); + vector bool short vec_pack (vector bool int, vector bool int); + + vector bool short vec_vpkuwum (vector bool int, vector bool int); + vector signed short vec_vpkuwum (vector signed int, vector signed int); + vector unsigned short vec_vpkuwum (vector unsigned int, + vector unsigned int); + + vector bool char vec_vpkuhum (vector bool short, vector bool short); + vector signed char vec_vpkuhum (vector signed short, + vector signed short); + vector unsigned char vec_vpkuhum (vector unsigned short, + vector unsigned short); + + vector pixel vec_packpx (vector unsigned int, vector unsigned int); + + vector unsigned char vec_packs (vector unsigned short, + vector unsigned short); + vector signed char vec_packs (vector signed short, vector signed short); + vector unsigned short vec_packs (vector unsigned int, + vector unsigned int); + vector signed short vec_packs (vector signed int, vector signed int); + + vector signed short vec_vpkswss (vector signed int, vector signed int); + + vector unsigned short vec_vpkuwus (vector unsigned int, + vector unsigned int); + + vector signed char vec_vpkshss (vector signed short, + vector signed short); + + vector unsigned char vec_vpkuhus (vector unsigned short, + vector unsigned short); + + vector unsigned char vec_packsu (vector unsigned short, + vector unsigned short); + vector unsigned char vec_packsu (vector signed short, + vector signed short); + vector unsigned short vec_packsu (vector unsigned int, + vector unsigned int); + vector unsigned short vec_packsu (vector signed int, vector signed int); + + vector unsigned short vec_vpkswus (vector signed int, + vector signed int); + + vector unsigned char vec_vpkshus (vector signed short, + vector signed short); + + vector float vec_perm (vector float, + vector float, + vector unsigned char); + vector signed int vec_perm (vector signed int, + vector signed int, + vector unsigned char); + vector unsigned int vec_perm (vector unsigned int, + vector unsigned int, + vector unsigned char); + vector bool int vec_perm (vector bool int, + vector bool int, + vector unsigned char); + vector signed short vec_perm (vector signed short, + vector signed short, + vector unsigned char); + vector unsigned short vec_perm (vector unsigned short, + vector unsigned short, + vector unsigned char); + vector bool short vec_perm (vector bool short, + vector bool short, + vector unsigned char); + vector pixel vec_perm (vector pixel, + vector pixel, + vector unsigned char); + vector signed char vec_perm (vector signed char, + vector signed char, + vector unsigned char); + vector unsigned char vec_perm (vector unsigned char, + vector unsigned char, + vector unsigned char); + vector bool char vec_perm (vector bool char, + vector bool char, + vector unsigned char); + + vector float vec_re (vector float); + + vector signed char vec_rl (vector signed char, + vector unsigned char); + vector unsigned char vec_rl (vector unsigned char, + vector unsigned char); + vector signed short vec_rl (vector signed short, vector unsigned short); + vector unsigned short vec_rl (vector unsigned short, + vector unsigned short); + vector signed int vec_rl (vector signed int, vector unsigned int); + vector unsigned int vec_rl (vector unsigned int, vector unsigned int); + + vector signed int vec_vrlw (vector signed int, vector unsigned int); + vector unsigned int vec_vrlw (vector unsigned int, vector unsigned int); + + vector signed short vec_vrlh (vector signed short, + vector unsigned short); + vector unsigned short vec_vrlh (vector unsigned short, + vector unsigned short); + + vector signed char vec_vrlb (vector signed char, vector unsigned char); + vector unsigned char vec_vrlb (vector unsigned char, + vector unsigned char); + + vector float vec_round (vector float); + + vector float vec_recip (vector float, vector float); + + vector float vec_rsqrt (vector float); + + vector float vec_rsqrte (vector float); + + vector float vec_sel (vector float, vector float, vector bool int); + vector float vec_sel (vector float, vector float, vector unsigned int); + vector signed int vec_sel (vector signed int, + vector signed int, + vector bool int); + vector signed int vec_sel (vector signed int, + vector signed int, + vector unsigned int); + vector unsigned int vec_sel (vector unsigned int, + vector unsigned int, + vector bool int); + vector unsigned int vec_sel (vector unsigned int, + vector unsigned int, + vector unsigned int); + vector bool int vec_sel (vector bool int, + vector bool int, + vector bool int); + vector bool int vec_sel (vector bool int, + vector bool int, + vector unsigned int); + vector signed short vec_sel (vector signed short, + vector signed short, + vector bool short); + vector signed short vec_sel (vector signed short, + vector signed short, + vector unsigned short); + vector unsigned short vec_sel (vector unsigned short, + vector unsigned short, + vector bool short); + vector unsigned short vec_sel (vector unsigned short, + vector unsigned short, + vector unsigned short); + vector bool short vec_sel (vector bool short, + vector bool short, + vector bool short); + vector bool short vec_sel (vector bool short, + vector bool short, + vector unsigned short); + vector signed char vec_sel (vector signed char, + vector signed char, + vector bool char); + vector signed char vec_sel (vector signed char, + vector signed char, + vector unsigned char); + vector unsigned char vec_sel (vector unsigned char, + vector unsigned char, + vector bool char); + vector unsigned char vec_sel (vector unsigned char, + vector unsigned char, + vector unsigned char); + vector bool char vec_sel (vector bool char, + vector bool char, + vector bool char); + vector bool char vec_sel (vector bool char, + vector bool char, + vector unsigned char); + + vector signed char vec_sl (vector signed char, + vector unsigned char); + vector unsigned char vec_sl (vector unsigned char, + vector unsigned char); + vector signed short vec_sl (vector signed short, vector unsigned short); + vector unsigned short vec_sl (vector unsigned short, + vector unsigned short); + vector signed int vec_sl (vector signed int, vector unsigned int); + vector unsigned int vec_sl (vector unsigned int, vector unsigned int); + + vector signed int vec_vslw (vector signed int, vector unsigned int); + vector unsigned int vec_vslw (vector unsigned int, vector unsigned int); + + vector signed short vec_vslh (vector signed short, + vector unsigned short); + vector unsigned short vec_vslh (vector unsigned short, + vector unsigned short); + + vector signed char vec_vslb (vector signed char, vector unsigned char); + vector unsigned char vec_vslb (vector unsigned char, + vector unsigned char); + + vector float vec_sld (vector float, vector float, const int); + vector signed int vec_sld (vector signed int, + vector signed int, + const int); + vector unsigned int vec_sld (vector unsigned int, + vector unsigned int, + const int); + vector bool int vec_sld (vector bool int, + vector bool int, + const int); + vector signed short vec_sld (vector signed short, + vector signed short, + const int); + vector unsigned short vec_sld (vector unsigned short, + vector unsigned short, + const int); + vector bool short vec_sld (vector bool short, + vector bool short, + const int); + vector pixel vec_sld (vector pixel, + vector pixel, + const int); + vector signed char vec_sld (vector signed char, + vector signed char, + const int); + vector unsigned char vec_sld (vector unsigned char, + vector unsigned char, + const int); + vector bool char vec_sld (vector bool char, + vector bool char, + const int); + + vector signed int vec_sll (vector signed int, + vector unsigned int); + vector signed int vec_sll (vector signed int, + vector unsigned short); + vector signed int vec_sll (vector signed int, + vector unsigned char); + vector unsigned int vec_sll (vector unsigned int, + vector unsigned int); + vector unsigned int vec_sll (vector unsigned int, + vector unsigned short); + vector unsigned int vec_sll (vector unsigned int, + vector unsigned char); + vector bool int vec_sll (vector bool int, + vector unsigned int); + vector bool int vec_sll (vector bool int, + vector unsigned short); + vector bool int vec_sll (vector bool int, + vector unsigned char); + vector signed short vec_sll (vector signed short, + vector unsigned int); + vector signed short vec_sll (vector signed short, + vector unsigned short); + vector signed short vec_sll (vector signed short, + vector unsigned char); + vector unsigned short vec_sll (vector unsigned short, + vector unsigned int); + vector unsigned short vec_sll (vector unsigned short, + vector unsigned short); + vector unsigned short vec_sll (vector unsigned short, + vector unsigned char); + vector bool short vec_sll (vector bool short, vector unsigned int); + vector bool short vec_sll (vector bool short, vector unsigned short); + vector bool short vec_sll (vector bool short, vector unsigned char); + vector pixel vec_sll (vector pixel, vector unsigned int); + vector pixel vec_sll (vector pixel, vector unsigned short); + vector pixel vec_sll (vector pixel, vector unsigned char); + vector signed char vec_sll (vector signed char, vector unsigned int); + vector signed char vec_sll (vector signed char, vector unsigned short); + vector signed char vec_sll (vector signed char, vector unsigned char); + vector unsigned char vec_sll (vector unsigned char, + vector unsigned int); + vector unsigned char vec_sll (vector unsigned char, + vector unsigned short); + vector unsigned char vec_sll (vector unsigned char, + vector unsigned char); + vector bool char vec_sll (vector bool char, vector unsigned int); + vector bool char vec_sll (vector bool char, vector unsigned short); + vector bool char vec_sll (vector bool char, vector unsigned char); + + vector float vec_slo (vector float, vector signed char); + vector float vec_slo (vector float, vector unsigned char); + vector signed int vec_slo (vector signed int, vector signed char); + vector signed int vec_slo (vector signed int, vector unsigned char); + vector unsigned int vec_slo (vector unsigned int, vector signed char); + vector unsigned int vec_slo (vector unsigned int, vector unsigned char); + vector signed short vec_slo (vector signed short, vector signed char); + vector signed short vec_slo (vector signed short, vector unsigned char); + vector unsigned short vec_slo (vector unsigned short, + vector signed char); + vector unsigned short vec_slo (vector unsigned short, + vector unsigned char); + vector pixel vec_slo (vector pixel, vector signed char); + vector pixel vec_slo (vector pixel, vector unsigned char); + vector signed char vec_slo (vector signed char, vector signed char); + vector signed char vec_slo (vector signed char, vector unsigned char); + vector unsigned char vec_slo (vector unsigned char, vector signed char); + vector unsigned char vec_slo (vector unsigned char, + vector unsigned char); + + vector signed char vec_splat (vector signed char, const int); + vector unsigned char vec_splat (vector unsigned char, const int); + vector bool char vec_splat (vector bool char, const int); + vector signed short vec_splat (vector signed short, const int); + vector unsigned short vec_splat (vector unsigned short, const int); + vector bool short vec_splat (vector bool short, const int); + vector pixel vec_splat (vector pixel, const int); + vector float vec_splat (vector float, const int); + vector signed int vec_splat (vector signed int, const int); + vector unsigned int vec_splat (vector unsigned int, const int); + vector bool int vec_splat (vector bool int, const int); + + vector float vec_vspltw (vector float, const int); + vector signed int vec_vspltw (vector signed int, const int); + vector unsigned int vec_vspltw (vector unsigned int, const int); + vector bool int vec_vspltw (vector bool int, const int); + + vector bool short vec_vsplth (vector bool short, const int); + vector signed short vec_vsplth (vector signed short, const int); + vector unsigned short vec_vsplth (vector unsigned short, const int); + vector pixel vec_vsplth (vector pixel, const int); + + vector signed char vec_vspltb (vector signed char, const int); + vector unsigned char vec_vspltb (vector unsigned char, const int); + vector bool char vec_vspltb (vector bool char, const int); + + vector signed char vec_splat_s8 (const int); + + vector signed short vec_splat_s16 (const int); + + vector signed int vec_splat_s32 (const int); + + vector unsigned char vec_splat_u8 (const int); + + vector unsigned short vec_splat_u16 (const int); + + vector unsigned int vec_splat_u32 (const int); + + vector signed char vec_sr (vector signed char, vector unsigned char); + vector unsigned char vec_sr (vector unsigned char, + vector unsigned char); + vector signed short vec_sr (vector signed short, + vector unsigned short); + vector unsigned short vec_sr (vector unsigned short, + vector unsigned short); + vector signed int vec_sr (vector signed int, vector unsigned int); + vector unsigned int vec_sr (vector unsigned int, vector unsigned int); + + vector signed int vec_vsrw (vector signed int, vector unsigned int); + vector unsigned int vec_vsrw (vector unsigned int, vector unsigned int); + + vector signed short vec_vsrh (vector signed short, + vector unsigned short); + vector unsigned short vec_vsrh (vector unsigned short, + vector unsigned short); + + vector signed char vec_vsrb (vector signed char, vector unsigned char); + vector unsigned char vec_vsrb (vector unsigned char, + vector unsigned char); + + vector signed char vec_sra (vector signed char, vector unsigned char); + vector unsigned char vec_sra (vector unsigned char, + vector unsigned char); + vector signed short vec_sra (vector signed short, + vector unsigned short); + vector unsigned short vec_sra (vector unsigned short, + vector unsigned short); + vector signed int vec_sra (vector signed int, vector unsigned int); + vector unsigned int vec_sra (vector unsigned int, vector unsigned int); + + vector signed int vec_vsraw (vector signed int, vector unsigned int); + vector unsigned int vec_vsraw (vector unsigned int, + vector unsigned int); + + vector signed short vec_vsrah (vector signed short, + vector unsigned short); + vector unsigned short vec_vsrah (vector unsigned short, + vector unsigned short); + + vector signed char vec_vsrab (vector signed char, vector unsigned char); + vector unsigned char vec_vsrab (vector unsigned char, + vector unsigned char); + + vector signed int vec_srl (vector signed int, vector unsigned int); + vector signed int vec_srl (vector signed int, vector unsigned short); + vector signed int vec_srl (vector signed int, vector unsigned char); + vector unsigned int vec_srl (vector unsigned int, vector unsigned int); + vector unsigned int vec_srl (vector unsigned int, + vector unsigned short); + vector unsigned int vec_srl (vector unsigned int, vector unsigned char); + vector bool int vec_srl (vector bool int, vector unsigned int); + vector bool int vec_srl (vector bool int, vector unsigned short); + vector bool int vec_srl (vector bool int, vector unsigned char); + vector signed short vec_srl (vector signed short, vector unsigned int); + vector signed short vec_srl (vector signed short, + vector unsigned short); + vector signed short vec_srl (vector signed short, vector unsigned char); + vector unsigned short vec_srl (vector unsigned short, + vector unsigned int); + vector unsigned short vec_srl (vector unsigned short, + vector unsigned short); + vector unsigned short vec_srl (vector unsigned short, + vector unsigned char); + vector bool short vec_srl (vector bool short, vector unsigned int); + vector bool short vec_srl (vector bool short, vector unsigned short); + vector bool short vec_srl (vector bool short, vector unsigned char); + vector pixel vec_srl (vector pixel, vector unsigned int); + vector pixel vec_srl (vector pixel, vector unsigned short); + vector pixel vec_srl (vector pixel, vector unsigned char); + vector signed char vec_srl (vector signed char, vector unsigned int); + vector signed char vec_srl (vector signed char, vector unsigned short); + vector signed char vec_srl (vector signed char, vector unsigned char); + vector unsigned char vec_srl (vector unsigned char, + vector unsigned int); + vector unsigned char vec_srl (vector unsigned char, + vector unsigned short); + vector unsigned char vec_srl (vector unsigned char, + vector unsigned char); + vector bool char vec_srl (vector bool char, vector unsigned int); + vector bool char vec_srl (vector bool char, vector unsigned short); + vector bool char vec_srl (vector bool char, vector unsigned char); + + vector float vec_sro (vector float, vector signed char); + vector float vec_sro (vector float, vector unsigned char); + vector signed int vec_sro (vector signed int, vector signed char); + vector signed int vec_sro (vector signed int, vector unsigned char); + vector unsigned int vec_sro (vector unsigned int, vector signed char); + vector unsigned int vec_sro (vector unsigned int, vector unsigned char); + vector signed short vec_sro (vector signed short, vector signed char); + vector signed short vec_sro (vector signed short, vector unsigned char); + vector unsigned short vec_sro (vector unsigned short, + vector signed char); + vector unsigned short vec_sro (vector unsigned short, + vector unsigned char); + vector pixel vec_sro (vector pixel, vector signed char); + vector pixel vec_sro (vector pixel, vector unsigned char); + vector signed char vec_sro (vector signed char, vector signed char); + vector signed char vec_sro (vector signed char, vector unsigned char); + vector unsigned char vec_sro (vector unsigned char, vector signed char); + vector unsigned char vec_sro (vector unsigned char, + vector unsigned char); + + void vec_st (vector float, int, vector float *); + void vec_st (vector float, int, float *); + void vec_st (vector signed int, int, vector signed int *); + void vec_st (vector signed int, int, int *); + void vec_st (vector unsigned int, int, vector unsigned int *); + void vec_st (vector unsigned int, int, unsigned int *); + void vec_st (vector bool int, int, vector bool int *); + void vec_st (vector bool int, int, unsigned int *); + void vec_st (vector bool int, int, int *); + void vec_st (vector signed short, int, vector signed short *); + void vec_st (vector signed short, int, short *); + void vec_st (vector unsigned short, int, vector unsigned short *); + void vec_st (vector unsigned short, int, unsigned short *); + void vec_st (vector bool short, int, vector bool short *); + void vec_st (vector bool short, int, unsigned short *); + void vec_st (vector pixel, int, vector pixel *); + void vec_st (vector pixel, int, unsigned short *); + void vec_st (vector pixel, int, short *); + void vec_st (vector bool short, int, short *); + void vec_st (vector signed char, int, vector signed char *); + void vec_st (vector signed char, int, signed char *); + void vec_st (vector unsigned char, int, vector unsigned char *); + void vec_st (vector unsigned char, int, unsigned char *); + void vec_st (vector bool char, int, vector bool char *); + void vec_st (vector bool char, int, unsigned char *); + void vec_st (vector bool char, int, signed char *); + + void vec_ste (vector signed char, int, signed char *); + void vec_ste (vector unsigned char, int, unsigned char *); + void vec_ste (vector bool char, int, signed char *); + void vec_ste (vector bool char, int, unsigned char *); + void vec_ste (vector signed short, int, short *); + void vec_ste (vector unsigned short, int, unsigned short *); + void vec_ste (vector bool short, int, short *); + void vec_ste (vector bool short, int, unsigned short *); + void vec_ste (vector pixel, int, short *); + void vec_ste (vector pixel, int, unsigned short *); + void vec_ste (vector float, int, float *); + void vec_ste (vector signed int, int, int *); + void vec_ste (vector unsigned int, int, unsigned int *); + void vec_ste (vector bool int, int, int *); + void vec_ste (vector bool int, int, unsigned int *); + + void vec_stvewx (vector float, int, float *); + void vec_stvewx (vector signed int, int, int *); + void vec_stvewx (vector unsigned int, int, unsigned int *); + void vec_stvewx (vector bool int, int, int *); + void vec_stvewx (vector bool int, int, unsigned int *); + + void vec_stvehx (vector signed short, int, short *); + void vec_stvehx (vector unsigned short, int, unsigned short *); + void vec_stvehx (vector bool short, int, short *); + void vec_stvehx (vector bool short, int, unsigned short *); + void vec_stvehx (vector pixel, int, short *); + void vec_stvehx (vector pixel, int, unsigned short *); + + void vec_stvebx (vector signed char, int, signed char *); + void vec_stvebx (vector unsigned char, int, unsigned char *); + void vec_stvebx (vector bool char, int, signed char *); + void vec_stvebx (vector bool char, int, unsigned char *); + + void vec_stl (vector float, int, vector float *); + void vec_stl (vector float, int, float *); + void vec_stl (vector signed int, int, vector signed int *); + void vec_stl (vector signed int, int, int *); + void vec_stl (vector unsigned int, int, vector unsigned int *); + void vec_stl (vector unsigned int, int, unsigned int *); + void vec_stl (vector bool int, int, vector bool int *); + void vec_stl (vector bool int, int, unsigned int *); + void vec_stl (vector bool int, int, int *); + void vec_stl (vector signed short, int, vector signed short *); + void vec_stl (vector signed short, int, short *); + void vec_stl (vector unsigned short, int, vector unsigned short *); + void vec_stl (vector unsigned short, int, unsigned short *); + void vec_stl (vector bool short, int, vector bool short *); + void vec_stl (vector bool short, int, unsigned short *); + void vec_stl (vector bool short, int, short *); + void vec_stl (vector pixel, int, vector pixel *); + void vec_stl (vector pixel, int, unsigned short *); + void vec_stl (vector pixel, int, short *); + void vec_stl (vector signed char, int, vector signed char *); + void vec_stl (vector signed char, int, signed char *); + void vec_stl (vector unsigned char, int, vector unsigned char *); + void vec_stl (vector unsigned char, int, unsigned char *); + void vec_stl (vector bool char, int, vector bool char *); + void vec_stl (vector bool char, int, unsigned char *); + void vec_stl (vector bool char, int, signed char *); + + vector signed char vec_sub (vector bool char, vector signed char); + vector signed char vec_sub (vector signed char, vector bool char); + vector signed char vec_sub (vector signed char, vector signed char); + vector unsigned char vec_sub (vector bool char, vector unsigned char); + vector unsigned char vec_sub (vector unsigned char, vector bool char); + vector unsigned char vec_sub (vector unsigned char, + vector unsigned char); + vector signed short vec_sub (vector bool short, vector signed short); + vector signed short vec_sub (vector signed short, vector bool short); + vector signed short vec_sub (vector signed short, vector signed short); + vector unsigned short vec_sub (vector bool short, + vector unsigned short); + vector unsigned short vec_sub (vector unsigned short, + vector bool short); + vector unsigned short vec_sub (vector unsigned short, + vector unsigned short); + vector signed int vec_sub (vector bool int, vector signed int); + vector signed int vec_sub (vector signed int, vector bool int); + vector signed int vec_sub (vector signed int, vector signed int); + vector unsigned int vec_sub (vector bool int, vector unsigned int); + vector unsigned int vec_sub (vector unsigned int, vector bool int); + vector unsigned int vec_sub (vector unsigned int, vector unsigned int); + vector float vec_sub (vector float, vector float); + + vector float vec_vsubfp (vector float, vector float); + + vector signed int vec_vsubuwm (vector bool int, vector signed int); + vector signed int vec_vsubuwm (vector signed int, vector bool int); + vector signed int vec_vsubuwm (vector signed int, vector signed int); + vector unsigned int vec_vsubuwm (vector bool int, vector unsigned int); + vector unsigned int vec_vsubuwm (vector unsigned int, vector bool int); + vector unsigned int vec_vsubuwm (vector unsigned int, + vector unsigned int); + + vector signed short vec_vsubuhm (vector bool short, + vector signed short); + vector signed short vec_vsubuhm (vector signed short, + vector bool short); + vector signed short vec_vsubuhm (vector signed short, + vector signed short); + vector unsigned short vec_vsubuhm (vector bool short, + vector unsigned short); + vector unsigned short vec_vsubuhm (vector unsigned short, + vector bool short); + vector unsigned short vec_vsubuhm (vector unsigned short, + vector unsigned short); + + vector signed char vec_vsububm (vector bool char, vector signed char); + vector signed char vec_vsububm (vector signed char, vector bool char); + vector signed char vec_vsububm (vector signed char, vector signed char); + vector unsigned char vec_vsububm (vector bool char, + vector unsigned char); + vector unsigned char vec_vsububm (vector unsigned char, + vector bool char); + vector unsigned char vec_vsububm (vector unsigned char, + vector unsigned char); + + vector unsigned int vec_subc (vector unsigned int, vector unsigned int); + + vector unsigned char vec_subs (vector bool char, vector unsigned char); + vector unsigned char vec_subs (vector unsigned char, vector bool char); + vector unsigned char vec_subs (vector unsigned char, + vector unsigned char); + vector signed char vec_subs (vector bool char, vector signed char); + vector signed char vec_subs (vector signed char, vector bool char); + vector signed char vec_subs (vector signed char, vector signed char); + vector unsigned short vec_subs (vector bool short, + vector unsigned short); + vector unsigned short vec_subs (vector unsigned short, + vector bool short); + vector unsigned short vec_subs (vector unsigned short, + vector unsigned short); + vector signed short vec_subs (vector bool short, vector signed short); + vector signed short vec_subs (vector signed short, vector bool short); + vector signed short vec_subs (vector signed short, vector signed short); + vector unsigned int vec_subs (vector bool int, vector unsigned int); + vector unsigned int vec_subs (vector unsigned int, vector bool int); + vector unsigned int vec_subs (vector unsigned int, vector unsigned int); + vector signed int vec_subs (vector bool int, vector signed int); + vector signed int vec_subs (vector signed int, vector bool int); + vector signed int vec_subs (vector signed int, vector signed int); + + vector signed int vec_vsubsws (vector bool int, vector signed int); + vector signed int vec_vsubsws (vector signed int, vector bool int); + vector signed int vec_vsubsws (vector signed int, vector signed int); + + vector unsigned int vec_vsubuws (vector bool int, vector unsigned int); + vector unsigned int vec_vsubuws (vector unsigned int, vector bool int); + vector unsigned int vec_vsubuws (vector unsigned int, + vector unsigned int); + + vector signed short vec_vsubshs (vector bool short, + vector signed short); + vector signed short vec_vsubshs (vector signed short, + vector bool short); + vector signed short vec_vsubshs (vector signed short, + vector signed short); + + vector unsigned short vec_vsubuhs (vector bool short, + vector unsigned short); + vector unsigned short vec_vsubuhs (vector unsigned short, + vector bool short); + vector unsigned short vec_vsubuhs (vector unsigned short, + vector unsigned short); + + vector signed char vec_vsubsbs (vector bool char, vector signed char); + vector signed char vec_vsubsbs (vector signed char, vector bool char); + vector signed char vec_vsubsbs (vector signed char, vector signed char); + + vector unsigned char vec_vsububs (vector bool char, + vector unsigned char); + vector unsigned char vec_vsububs (vector unsigned char, + vector bool char); + vector unsigned char vec_vsububs (vector unsigned char, + vector unsigned char); + + vector unsigned int vec_sum4s (vector unsigned char, + vector unsigned int); + vector signed int vec_sum4s (vector signed char, vector signed int); + vector signed int vec_sum4s (vector signed short, vector signed int); + + vector signed int vec_vsum4shs (vector signed short, vector signed int); + + vector signed int vec_vsum4sbs (vector signed char, vector signed int); + + vector unsigned int vec_vsum4ubs (vector unsigned char, + vector unsigned int); + + vector signed int vec_sum2s (vector signed int, vector signed int); + + vector signed int vec_sums (vector signed int, vector signed int); + + vector float vec_trunc (vector float); + + vector signed short vec_unpackh (vector signed char); + vector bool short vec_unpackh (vector bool char); + vector signed int vec_unpackh (vector signed short); + vector bool int vec_unpackh (vector bool short); + vector unsigned int vec_unpackh (vector pixel); + + vector bool int vec_vupkhsh (vector bool short); + vector signed int vec_vupkhsh (vector signed short); + + vector unsigned int vec_vupkhpx (vector pixel); + + vector bool short vec_vupkhsb (vector bool char); + vector signed short vec_vupkhsb (vector signed char); + + vector signed short vec_unpackl (vector signed char); + vector bool short vec_unpackl (vector bool char); + vector unsigned int vec_unpackl (vector pixel); + vector signed int vec_unpackl (vector signed short); + vector bool int vec_unpackl (vector bool short); + + vector unsigned int vec_vupklpx (vector pixel); + + vector bool int vec_vupklsh (vector bool short); + vector signed int vec_vupklsh (vector signed short); + + vector bool short vec_vupklsb (vector bool char); + vector signed short vec_vupklsb (vector signed char); + + vector float vec_xor (vector float, vector float); + vector float vec_xor (vector float, vector bool int); + vector float vec_xor (vector bool int, vector float); + vector bool int vec_xor (vector bool int, vector bool int); + vector signed int vec_xor (vector bool int, vector signed int); + vector signed int vec_xor (vector signed int, vector bool int); + vector signed int vec_xor (vector signed int, vector signed int); + vector unsigned int vec_xor (vector bool int, vector unsigned int); + vector unsigned int vec_xor (vector unsigned int, vector bool int); + vector unsigned int vec_xor (vector unsigned int, vector unsigned int); + vector bool short vec_xor (vector bool short, vector bool short); + vector signed short vec_xor (vector bool short, vector signed short); + vector signed short vec_xor (vector signed short, vector bool short); + vector signed short vec_xor (vector signed short, vector signed short); + vector unsigned short vec_xor (vector bool short, + vector unsigned short); + vector unsigned short vec_xor (vector unsigned short, + vector bool short); + vector unsigned short vec_xor (vector unsigned short, + vector unsigned short); + vector signed char vec_xor (vector bool char, vector signed char); + vector bool char vec_xor (vector bool char, vector bool char); + vector signed char vec_xor (vector signed char, vector bool char); + vector signed char vec_xor (vector signed char, vector signed char); + vector unsigned char vec_xor (vector bool char, vector unsigned char); + vector unsigned char vec_xor (vector unsigned char, vector bool char); + vector unsigned char vec_xor (vector unsigned char, + vector unsigned char); + + int vec_all_eq (vector signed char, vector bool char); + int vec_all_eq (vector signed char, vector signed char); + int vec_all_eq (vector unsigned char, vector bool char); + int vec_all_eq (vector unsigned char, vector unsigned char); + int vec_all_eq (vector bool char, vector bool char); + int vec_all_eq (vector bool char, vector unsigned char); + int vec_all_eq (vector bool char, vector signed char); + int vec_all_eq (vector signed short, vector bool short); + int vec_all_eq (vector signed short, vector signed short); + int vec_all_eq (vector unsigned short, vector bool short); + int vec_all_eq (vector unsigned short, vector unsigned short); + int vec_all_eq (vector bool short, vector bool short); + int vec_all_eq (vector bool short, vector unsigned short); + int vec_all_eq (vector bool short, vector signed short); + int vec_all_eq (vector pixel, vector pixel); + int vec_all_eq (vector signed int, vector bool int); + int vec_all_eq (vector signed int, vector signed int); + int vec_all_eq (vector unsigned int, vector bool int); + int vec_all_eq (vector unsigned int, vector unsigned int); + int vec_all_eq (vector bool int, vector bool int); + int vec_all_eq (vector bool int, vector unsigned int); + int vec_all_eq (vector bool int, vector signed int); + int vec_all_eq (vector float, vector float); + + int vec_all_ge (vector bool char, vector unsigned char); + int vec_all_ge (vector unsigned char, vector bool char); + int vec_all_ge (vector unsigned char, vector unsigned char); + int vec_all_ge (vector bool char, vector signed char); + int vec_all_ge (vector signed char, vector bool char); + int vec_all_ge (vector signed char, vector signed char); + int vec_all_ge (vector bool short, vector unsigned short); + int vec_all_ge (vector unsigned short, vector bool short); + int vec_all_ge (vector unsigned short, vector unsigned short); + int vec_all_ge (vector signed short, vector signed short); + int vec_all_ge (vector bool short, vector signed short); + int vec_all_ge (vector signed short, vector bool short); + int vec_all_ge (vector bool int, vector unsigned int); + int vec_all_ge (vector unsigned int, vector bool int); + int vec_all_ge (vector unsigned int, vector unsigned int); + int vec_all_ge (vector bool int, vector signed int); + int vec_all_ge (vector signed int, vector bool int); + int vec_all_ge (vector signed int, vector signed int); + int vec_all_ge (vector float, vector float); + + int vec_all_gt (vector bool char, vector unsigned char); + int vec_all_gt (vector unsigned char, vector bool char); + int vec_all_gt (vector unsigned char, vector unsigned char); + int vec_all_gt (vector bool char, vector signed char); + int vec_all_gt (vector signed char, vector bool char); + int vec_all_gt (vector signed char, vector signed char); + int vec_all_gt (vector bool short, vector unsigned short); + int vec_all_gt (vector unsigned short, vector bool short); + int vec_all_gt (vector unsigned short, vector unsigned short); + int vec_all_gt (vector bool short, vector signed short); + int vec_all_gt (vector signed short, vector bool short); + int vec_all_gt (vector signed short, vector signed short); + int vec_all_gt (vector bool int, vector unsigned int); + int vec_all_gt (vector unsigned int, vector bool int); + int vec_all_gt (vector unsigned int, vector unsigned int); + int vec_all_gt (vector bool int, vector signed int); + int vec_all_gt (vector signed int, vector bool int); + int vec_all_gt (vector signed int, vector signed int); + int vec_all_gt (vector float, vector float); + + int vec_all_in (vector float, vector float); + + int vec_all_le (vector bool char, vector unsigned char); + int vec_all_le (vector unsigned char, vector bool char); + int vec_all_le (vector unsigned char, vector unsigned char); + int vec_all_le (vector bool char, vector signed char); + int vec_all_le (vector signed char, vector bool char); + int vec_all_le (vector signed char, vector signed char); + int vec_all_le (vector bool short, vector unsigned short); + int vec_all_le (vector unsigned short, vector bool short); + int vec_all_le (vector unsigned short, vector unsigned short); + int vec_all_le (vector bool short, vector signed short); + int vec_all_le (vector signed short, vector bool short); + int vec_all_le (vector signed short, vector signed short); + int vec_all_le (vector bool int, vector unsigned int); + int vec_all_le (vector unsigned int, vector bool int); + int vec_all_le (vector unsigned int, vector unsigned int); + int vec_all_le (vector bool int, vector signed int); + int vec_all_le (vector signed int, vector bool int); + int vec_all_le (vector signed int, vector signed int); + int vec_all_le (vector float, vector float); + + int vec_all_lt (vector bool char, vector unsigned char); + int vec_all_lt (vector unsigned char, vector bool char); + int vec_all_lt (vector unsigned char, vector unsigned char); + int vec_all_lt (vector bool char, vector signed char); + int vec_all_lt (vector signed char, vector bool char); + int vec_all_lt (vector signed char, vector signed char); + int vec_all_lt (vector bool short, vector unsigned short); + int vec_all_lt (vector unsigned short, vector bool short); + int vec_all_lt (vector unsigned short, vector unsigned short); + int vec_all_lt (vector bool short, vector signed short); + int vec_all_lt (vector signed short, vector bool short); + int vec_all_lt (vector signed short, vector signed short); + int vec_all_lt (vector bool int, vector unsigned int); + int vec_all_lt (vector unsigned int, vector bool int); + int vec_all_lt (vector unsigned int, vector unsigned int); + int vec_all_lt (vector bool int, vector signed int); + int vec_all_lt (vector signed int, vector bool int); + int vec_all_lt (vector signed int, vector signed int); + int vec_all_lt (vector float, vector float); + + int vec_all_nan (vector float); + + int vec_all_ne (vector signed char, vector bool char); + int vec_all_ne (vector signed char, vector signed char); + int vec_all_ne (vector unsigned char, vector bool char); + int vec_all_ne (vector unsigned char, vector unsigned char); + int vec_all_ne (vector bool char, vector bool char); + int vec_all_ne (vector bool char, vector unsigned char); + int vec_all_ne (vector bool char, vector signed char); + int vec_all_ne (vector signed short, vector bool short); + int vec_all_ne (vector signed short, vector signed short); + int vec_all_ne (vector unsigned short, vector bool short); + int vec_all_ne (vector unsigned short, vector unsigned short); + int vec_all_ne (vector bool short, vector bool short); + int vec_all_ne (vector bool short, vector unsigned short); + int vec_all_ne (vector bool short, vector signed short); + int vec_all_ne (vector pixel, vector pixel); + int vec_all_ne (vector signed int, vector bool int); + int vec_all_ne (vector signed int, vector signed int); + int vec_all_ne (vector unsigned int, vector bool int); + int vec_all_ne (vector unsigned int, vector unsigned int); + int vec_all_ne (vector bool int, vector bool int); + int vec_all_ne (vector bool int, vector unsigned int); + int vec_all_ne (vector bool int, vector signed int); + int vec_all_ne (vector float, vector float); + + int vec_all_nge (vector float, vector float); + + int vec_all_ngt (vector float, vector float); + + int vec_all_nle (vector float, vector float); + + int vec_all_nlt (vector float, vector float); + + int vec_all_numeric (vector float); + + int vec_any_eq (vector signed char, vector bool char); + int vec_any_eq (vector signed char, vector signed char); + int vec_any_eq (vector unsigned char, vector bool char); + int vec_any_eq (vector unsigned char, vector unsigned char); + int vec_any_eq (vector bool char, vector bool char); + int vec_any_eq (vector bool char, vector unsigned char); + int vec_any_eq (vector bool char, vector signed char); + int vec_any_eq (vector signed short, vector bool short); + int vec_any_eq (vector signed short, vector signed short); + int vec_any_eq (vector unsigned short, vector bool short); + int vec_any_eq (vector unsigned short, vector unsigned short); + int vec_any_eq (vector bool short, vector bool short); + int vec_any_eq (vector bool short, vector unsigned short); + int vec_any_eq (vector bool short, vector signed short); + int vec_any_eq (vector pixel, vector pixel); + int vec_any_eq (vector signed int, vector bool int); + int vec_any_eq (vector signed int, vector signed int); + int vec_any_eq (vector unsigned int, vector bool int); + int vec_any_eq (vector unsigned int, vector unsigned int); + int vec_any_eq (vector bool int, vector bool int); + int vec_any_eq (vector bool int, vector unsigned int); + int vec_any_eq (vector bool int, vector signed int); + int vec_any_eq (vector float, vector float); + + int vec_any_ge (vector signed char, vector bool char); + int vec_any_ge (vector unsigned char, vector bool char); + int vec_any_ge (vector unsigned char, vector unsigned char); + int vec_any_ge (vector signed char, vector signed char); + int vec_any_ge (vector bool char, vector unsigned char); + int vec_any_ge (vector bool char, vector signed char); + int vec_any_ge (vector unsigned short, vector bool short); + int vec_any_ge (vector unsigned short, vector unsigned short); + int vec_any_ge (vector signed short, vector signed short); + int vec_any_ge (vector signed short, vector bool short); + int vec_any_ge (vector bool short, vector unsigned short); + int vec_any_ge (vector bool short, vector signed short); + int vec_any_ge (vector signed int, vector bool int); + int vec_any_ge (vector unsigned int, vector bool int); + int vec_any_ge (vector unsigned int, vector unsigned int); + int vec_any_ge (vector signed int, vector signed int); + int vec_any_ge (vector bool int, vector unsigned int); + int vec_any_ge (vector bool int, vector signed int); + int vec_any_ge (vector float, vector float); + + int vec_any_gt (vector bool char, vector unsigned char); + int vec_any_gt (vector unsigned char, vector bool char); + int vec_any_gt (vector unsigned char, vector unsigned char); + int vec_any_gt (vector bool char, vector signed char); + int vec_any_gt (vector signed char, vector bool char); + int vec_any_gt (vector signed char, vector signed char); + int vec_any_gt (vector bool short, vector unsigned short); + int vec_any_gt (vector unsigned short, vector bool short); + int vec_any_gt (vector unsigned short, vector unsigned short); + int vec_any_gt (vector bool short, vector signed short); + int vec_any_gt (vector signed short, vector bool short); + int vec_any_gt (vector signed short, vector signed short); + int vec_any_gt (vector bool int, vector unsigned int); + int vec_any_gt (vector unsigned int, vector bool int); + int vec_any_gt (vector unsigned int, vector unsigned int); + int vec_any_gt (vector bool int, vector signed int); + int vec_any_gt (vector signed int, vector bool int); + int vec_any_gt (vector signed int, vector signed int); + int vec_any_gt (vector float, vector float); + + int vec_any_le (vector bool char, vector unsigned char); + int vec_any_le (vector unsigned char, vector bool char); + int vec_any_le (vector unsigned char, vector unsigned char); + int vec_any_le (vector bool char, vector signed char); + int vec_any_le (vector signed char, vector bool char); + int vec_any_le (vector signed char, vector signed char); + int vec_any_le (vector bool short, vector unsigned short); + int vec_any_le (vector unsigned short, vector bool short); + int vec_any_le (vector unsigned short, vector unsigned short); + int vec_any_le (vector bool short, vector signed short); + int vec_any_le (vector signed short, vector bool short); + int vec_any_le (vector signed short, vector signed short); + int vec_any_le (vector bool int, vector unsigned int); + int vec_any_le (vector unsigned int, vector bool int); + int vec_any_le (vector unsigned int, vector unsigned int); + int vec_any_le (vector bool int, vector signed int); + int vec_any_le (vector signed int, vector bool int); + int vec_any_le (vector signed int, vector signed int); + int vec_any_le (vector float, vector float); + + int vec_any_lt (vector bool char, vector unsigned char); + int vec_any_lt (vector unsigned char, vector bool char); + int vec_any_lt (vector unsigned char, vector unsigned char); + int vec_any_lt (vector bool char, vector signed char); + int vec_any_lt (vector signed char, vector bool char); + int vec_any_lt (vector signed char, vector signed char); + int vec_any_lt (vector bool short, vector unsigned short); + int vec_any_lt (vector unsigned short, vector bool short); + int vec_any_lt (vector unsigned short, vector unsigned short); + int vec_any_lt (vector bool short, vector signed short); + int vec_any_lt (vector signed short, vector bool short); + int vec_any_lt (vector signed short, vector signed short); + int vec_any_lt (vector bool int, vector unsigned int); + int vec_any_lt (vector unsigned int, vector bool int); + int vec_any_lt (vector unsigned int, vector unsigned int); + int vec_any_lt (vector bool int, vector signed int); + int vec_any_lt (vector signed int, vector bool int); + int vec_any_lt (vector signed int, vector signed int); + int vec_any_lt (vector float, vector float); + + int vec_any_nan (vector float); + + int vec_any_ne (vector signed char, vector bool char); + int vec_any_ne (vector signed char, vector signed char); + int vec_any_ne (vector unsigned char, vector bool char); + int vec_any_ne (vector unsigned char, vector unsigned char); + int vec_any_ne (vector bool char, vector bool char); + int vec_any_ne (vector bool char, vector unsigned char); + int vec_any_ne (vector bool char, vector signed char); + int vec_any_ne (vector signed short, vector bool short); + int vec_any_ne (vector signed short, vector signed short); + int vec_any_ne (vector unsigned short, vector bool short); + int vec_any_ne (vector unsigned short, vector unsigned short); + int vec_any_ne (vector bool short, vector bool short); + int vec_any_ne (vector bool short, vector unsigned short); + int vec_any_ne (vector bool short, vector signed short); + int vec_any_ne (vector pixel, vector pixel); + int vec_any_ne (vector signed int, vector bool int); + int vec_any_ne (vector signed int, vector signed int); + int vec_any_ne (vector unsigned int, vector bool int); + int vec_any_ne (vector unsigned int, vector unsigned int); + int vec_any_ne (vector bool int, vector bool int); + int vec_any_ne (vector bool int, vector unsigned int); + int vec_any_ne (vector bool int, vector signed int); + int vec_any_ne (vector float, vector float); + + int vec_any_nge (vector float, vector float); + + int vec_any_ngt (vector float, vector float); + + int vec_any_nle (vector float, vector float); + + int vec_any_nlt (vector float, vector float); + + int vec_any_numeric (vector float); + + int vec_any_out (vector float, vector float); + + If the vector/scalar (VSX) instruction set is available, the following +additional functions are available: + + 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_ld (int, const vector double *); + vector double vec_ld (int, const double *); + vector double vec_ldl (int, const vector double *); + vector double vec_ldl (int, const double *); + vector unsigned char vec_lvsl (int, const volatile double *); + vector unsigned char vec_lvsr (int, const volatile 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 double vec_rint (vector double); + vector double vec_recip (vector double, vector double); + vector double vec_rsqrt (vector double); + vector double vec_rsqrte (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); + void vec_st (vector double, int, vector double *); + void vec_st (vector double, int, 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); + + vector double vec_vsx_ld (int, const vector double *); + vector double vec_vsx_ld (int, const double *); + vector float vec_vsx_ld (int, const vector float *); + vector float vec_vsx_ld (int, const float *); + vector bool int vec_vsx_ld (int, const vector bool int *); + vector signed int vec_vsx_ld (int, const vector signed int *); + vector signed int vec_vsx_ld (int, const int *); + vector signed int vec_vsx_ld (int, const long *); + vector unsigned int vec_vsx_ld (int, const vector unsigned int *); + vector unsigned int vec_vsx_ld (int, const unsigned int *); + vector unsigned int vec_vsx_ld (int, const unsigned long *); + vector bool short vec_vsx_ld (int, const vector bool short *); + vector pixel vec_vsx_ld (int, const vector pixel *); + vector signed short vec_vsx_ld (int, const vector signed short *); + vector signed short vec_vsx_ld (int, const short *); + vector unsigned short vec_vsx_ld (int, const vector unsigned short *); + vector unsigned short vec_vsx_ld (int, const unsigned short *); + vector bool char vec_vsx_ld (int, const vector bool char *); + vector signed char vec_vsx_ld (int, const vector signed char *); + vector signed char vec_vsx_ld (int, const signed char *); + vector unsigned char vec_vsx_ld (int, const vector unsigned char *); + vector unsigned char vec_vsx_ld (int, const unsigned char *); + + void vec_vsx_st (vector double, int, vector double *); + void vec_vsx_st (vector double, int, double *); + void vec_vsx_st (vector float, int, vector float *); + void vec_vsx_st (vector float, int, float *); + void vec_vsx_st (vector signed int, int, vector signed int *); + void vec_vsx_st (vector signed int, int, int *); + void vec_vsx_st (vector unsigned int, int, vector unsigned int *); + void vec_vsx_st (vector unsigned int, int, unsigned int *); + void vec_vsx_st (vector bool int, int, vector bool int *); + void vec_vsx_st (vector bool int, int, unsigned int *); + void vec_vsx_st (vector bool int, int, int *); + void vec_vsx_st (vector signed short, int, vector signed short *); + void vec_vsx_st (vector signed short, int, short *); + void vec_vsx_st (vector unsigned short, int, vector unsigned short *); + void vec_vsx_st (vector unsigned short, int, unsigned short *); + void vec_vsx_st (vector bool short, int, vector bool short *); + void vec_vsx_st (vector bool short, int, unsigned short *); + void vec_vsx_st (vector pixel, int, vector pixel *); + void vec_vsx_st (vector pixel, int, unsigned short *); + void vec_vsx_st (vector pixel, int, short *); + void vec_vsx_st (vector bool short, int, short *); + void vec_vsx_st (vector signed char, int, vector signed char *); + void vec_vsx_st (vector signed char, int, signed char *); + void vec_vsx_st (vector unsigned char, int, vector unsigned char *); + void vec_vsx_st (vector unsigned char, int, unsigned char *); + void vec_vsx_st (vector bool char, int, vector bool char *); + void vec_vsx_st (vector bool char, int, unsigned char *); + void vec_vsx_st (vector bool char, int, signed char *); + + vector double vec_xxpermdi (vector double, vector double, int); + vector float vec_xxpermdi (vector float, vector float, int); + vector long long vec_xxpermdi (vector long long, vector long long, int); + vector unsigned long long vec_xxpermdi (vector unsigned long long, + vector unsigned long long, int); + vector int vec_xxpermdi (vector int, vector int, int); + vector unsigned int vec_xxpermdi (vector unsigned int, + vector unsigned int, int); + vector short vec_xxpermdi (vector short, vector short, int); + vector unsigned short vec_xxpermdi (vector unsigned short, + vector unsigned short, int); + vector signed char vec_xxpermdi (vector signed char, vector signed char, int); + vector unsigned char vec_xxpermdi (vector unsigned char, + vector unsigned char, int); + + vector double vec_xxsldi (vector double, vector double, int); + vector float vec_xxsldi (vector float, vector float, int); + vector long long vec_xxsldi (vector long long, vector long long, int); + vector unsigned long long vec_xxsldi (vector unsigned long long, + vector unsigned long long, int); + vector int vec_xxsldi (vector int, vector int, int); + vector unsigned int vec_xxsldi (vector unsigned int, vector unsigned int, int); + vector short vec_xxsldi (vector short, vector short, int); + vector unsigned short vec_xxsldi (vector unsigned short, + vector unsigned short, int); + vector signed char vec_xxsldi (vector signed char, vector signed char, int); + vector unsigned char vec_xxsldi (vector unsigned char, + vector unsigned char, int); + + Note that the 'vec_ld' and 'vec_st' built-in functions always generate +the AltiVec 'LVX' and 'STVX' instructions even if the VSX instruction +set is available. The 'vec_vsx_ld' and 'vec_vsx_st' built-in functions +always generate the VSX 'LXVD2X', 'LXVW4X', 'STXVD2X', and 'STXVW4X' +instructions. + + If the ISA 2.07 additions to the vector/scalar (power8-vector) +instruction set is available, the following additional functions are +available for both 32-bit and 64-bit targets. For 64-bit targets, you +can use VECTOR LONG instead of VECTOR LONG LONG, VECTOR BOOL LONG +instead of VECTOR BOOL LONG LONG, and VECTOR UNSIGNED LONG instead of +VECTOR UNSIGNED LONG LONG. + + vector long long vec_abs (vector long long); + + vector long long vec_add (vector long long, vector long long); + vector unsigned long long vec_add (vector unsigned long long, + vector unsigned long long); + + int vec_all_eq (vector long long, vector long long); + int vec_all_ge (vector long long, vector long long); + int vec_all_gt (vector long long, vector long long); + int vec_all_le (vector long long, vector long long); + int vec_all_lt (vector long long, vector long long); + int vec_all_ne (vector long long, vector long long); + int vec_any_eq (vector long long, vector long long); + int vec_any_ge (vector long long, vector long long); + int vec_any_gt (vector long long, vector long long); + int vec_any_le (vector long long, vector long long); + int vec_any_lt (vector long long, vector long long); + int vec_any_ne (vector long long, vector long long); + + vector long long vec_eqv (vector long long, vector long long); + vector long long vec_eqv (vector bool long long, vector long long); + vector long long vec_eqv (vector long long, vector bool long long); + vector unsigned long long vec_eqv (vector unsigned long long, + vector unsigned long long); + vector unsigned long long vec_eqv (vector bool long long, + vector unsigned long long); + vector unsigned long long vec_eqv (vector unsigned long long, + vector bool long long); + vector int vec_eqv (vector int, vector int); + vector int vec_eqv (vector bool int, vector int); + vector int vec_eqv (vector int, vector bool int); + vector unsigned int vec_eqv (vector unsigned int, vector unsigned int); + vector unsigned int vec_eqv (vector bool unsigned int, + vector unsigned int); + vector unsigned int vec_eqv (vector unsigned int, + vector bool unsigned int); + vector short vec_eqv (vector short, vector short); + vector short vec_eqv (vector bool short, vector short); + vector short vec_eqv (vector short, vector bool short); + vector unsigned short vec_eqv (vector unsigned short, vector unsigned short); + vector unsigned short vec_eqv (vector bool unsigned short, + vector unsigned short); + vector unsigned short vec_eqv (vector unsigned short, + vector bool unsigned short); + vector signed char vec_eqv (vector signed char, vector signed char); + vector signed char vec_eqv (vector bool signed char, vector signed char); + vector signed char vec_eqv (vector signed char, vector bool signed char); + vector unsigned char vec_eqv (vector unsigned char, vector unsigned char); + vector unsigned char vec_eqv (vector bool unsigned char, vector unsigned char); + vector unsigned char vec_eqv (vector unsigned char, vector bool unsigned char); + + vector long long vec_max (vector long long, vector long long); + vector unsigned long long vec_max (vector unsigned long long, + vector unsigned long long); + + vector long long vec_min (vector long long, vector long long); + vector unsigned long long vec_min (vector unsigned long long, + vector unsigned long long); + + vector long long vec_nand (vector long long, vector long long); + vector long long vec_nand (vector bool long long, vector long long); + vector long long vec_nand (vector long long, vector bool long long); + vector unsigned long long vec_nand (vector unsigned long long, + vector unsigned long long); + vector unsigned long long vec_nand (vector bool long long, + vector unsigned long long); + vector unsigned long long vec_nand (vector unsigned long long, + vector bool long long); + vector int vec_nand (vector int, vector int); + vector int vec_nand (vector bool int, vector int); + vector int vec_nand (vector int, vector bool int); + vector unsigned int vec_nand (vector unsigned int, vector unsigned int); + vector unsigned int vec_nand (vector bool unsigned int, + vector unsigned int); + vector unsigned int vec_nand (vector unsigned int, + vector bool unsigned int); + vector short vec_nand (vector short, vector short); + vector short vec_nand (vector bool short, vector short); + vector short vec_nand (vector short, vector bool short); + vector unsigned short vec_nand (vector unsigned short, vector unsigned short); + vector unsigned short vec_nand (vector bool unsigned short, + vector unsigned short); + vector unsigned short vec_nand (vector unsigned short, + vector bool unsigned short); + vector signed char vec_nand (vector signed char, vector signed char); + vector signed char vec_nand (vector bool signed char, vector signed char); + vector signed char vec_nand (vector signed char, vector bool signed char); + vector unsigned char vec_nand (vector unsigned char, vector unsigned char); + vector unsigned char vec_nand (vector bool unsigned char, vector unsigned char); + vector unsigned char vec_nand (vector unsigned char, vector bool unsigned char); + + vector long long vec_orc (vector long long, vector long long); + vector long long vec_orc (vector bool long long, vector long long); + vector long long vec_orc (vector long long, vector bool long long); + vector unsigned long long vec_orc (vector unsigned long long, + vector unsigned long long); + vector unsigned long long vec_orc (vector bool long long, + vector unsigned long long); + vector unsigned long long vec_orc (vector unsigned long long, + vector bool long long); + vector int vec_orc (vector int, vector int); + vector int vec_orc (vector bool int, vector int); + vector int vec_orc (vector int, vector bool int); + vector unsigned int vec_orc (vector unsigned int, vector unsigned int); + vector unsigned int vec_orc (vector bool unsigned int, + vector unsigned int); + vector unsigned int vec_orc (vector unsigned int, + vector bool unsigned int); + vector short vec_orc (vector short, vector short); + vector short vec_orc (vector bool short, vector short); + vector short vec_orc (vector short, vector bool short); + vector unsigned short vec_orc (vector unsigned short, vector unsigned short); + vector unsigned short vec_orc (vector bool unsigned short, + vector unsigned short); + vector unsigned short vec_orc (vector unsigned short, + vector bool unsigned short); + vector signed char vec_orc (vector signed char, vector signed char); + vector signed char vec_orc (vector bool signed char, vector signed char); + vector signed char vec_orc (vector signed char, vector bool signed char); + vector unsigned char vec_orc (vector unsigned char, vector unsigned char); + vector unsigned char vec_orc (vector bool unsigned char, vector unsigned char); + vector unsigned char vec_orc (vector unsigned char, vector bool unsigned char); + + vector int vec_pack (vector long long, vector long long); + vector unsigned int vec_pack (vector unsigned long long, + vector unsigned long long); + vector bool int vec_pack (vector bool long long, vector bool long long); + + vector int vec_packs (vector long long, vector long long); + vector unsigned int vec_packs (vector unsigned long long, + vector unsigned long long); + + vector unsigned int vec_packsu (vector long long, vector long long); + + vector long long vec_rl (vector long long, + vector unsigned long long); + vector long long vec_rl (vector unsigned long long, + vector unsigned long long); + + vector long long vec_sl (vector long long, vector unsigned long long); + vector long long vec_sl (vector unsigned long long, + vector unsigned long long); + + vector long long vec_sr (vector long long, vector unsigned long long); + vector unsigned long long char vec_sr (vector unsigned long long, + vector unsigned long long); + + vector long long vec_sra (vector long long, vector unsigned long long); + vector unsigned long long vec_sra (vector unsigned long long, + vector unsigned long long); + + vector long long vec_sub (vector long long, vector long long); + vector unsigned long long vec_sub (vector unsigned long long, + vector unsigned long long); + + vector long long vec_unpackh (vector int); + vector unsigned long long vec_unpackh (vector unsigned int); + + vector long long vec_unpackl (vector int); + vector unsigned long long vec_unpackl (vector unsigned int); + + vector long long vec_vaddudm (vector long long, vector long long); + vector long long vec_vaddudm (vector bool long long, vector long long); + vector long long vec_vaddudm (vector long long, vector bool long long); + vector unsigned long long vec_vaddudm (vector unsigned long long, + vector unsigned long long); + vector unsigned long long vec_vaddudm (vector bool unsigned long long, + vector unsigned long long); + vector unsigned long long vec_vaddudm (vector unsigned long long, + vector bool unsigned long long); + + vector long long vec_vbpermq (vector signed char, vector signed char); + vector long long vec_vbpermq (vector unsigned char, vector unsigned char); + + vector long long vec_vclz (vector long long); + vector unsigned long long vec_vclz (vector unsigned long long); + vector int vec_vclz (vector int); + vector unsigned int vec_vclz (vector int); + vector short vec_vclz (vector short); + vector unsigned short vec_vclz (vector unsigned short); + vector signed char vec_vclz (vector signed char); + vector unsigned char vec_vclz (vector unsigned char); + + vector signed char vec_vclzb (vector signed char); + vector unsigned char vec_vclzb (vector unsigned char); + + vector long long vec_vclzd (vector long long); + vector unsigned long long vec_vclzd (vector unsigned long long); + + vector short vec_vclzh (vector short); + vector unsigned short vec_vclzh (vector unsigned short); + + vector int vec_vclzw (vector int); + vector unsigned int vec_vclzw (vector int); + + vector signed char vec_vgbbd (vector signed char); + vector unsigned char vec_vgbbd (vector unsigned char); + + vector long long vec_vmaxsd (vector long long, vector long long); + + vector unsigned long long vec_vmaxud (vector unsigned long long, + unsigned vector long long); + + vector long long vec_vminsd (vector long long, vector long long); + + vector unsigned long long vec_vminud (vector long long, + vector long long); + + vector int vec_vpksdss (vector long long, vector long long); + vector unsigned int vec_vpksdss (vector long long, vector long long); + + vector unsigned int vec_vpkudus (vector unsigned long long, + vector unsigned long long); + + vector int vec_vpkudum (vector long long, vector long long); + vector unsigned int vec_vpkudum (vector unsigned long long, + vector unsigned long long); + vector bool int vec_vpkudum (vector bool long long, vector bool long long); + + vector long long vec_vpopcnt (vector long long); + vector unsigned long long vec_vpopcnt (vector unsigned long long); + vector int vec_vpopcnt (vector int); + vector unsigned int vec_vpopcnt (vector int); + vector short vec_vpopcnt (vector short); + vector unsigned short vec_vpopcnt (vector unsigned short); + vector signed char vec_vpopcnt (vector signed char); + vector unsigned char vec_vpopcnt (vector unsigned char); + + vector signed char vec_vpopcntb (vector signed char); + vector unsigned char vec_vpopcntb (vector unsigned char); + + vector long long vec_vpopcntd (vector long long); + vector unsigned long long vec_vpopcntd (vector unsigned long long); + + vector short vec_vpopcnth (vector short); + vector unsigned short vec_vpopcnth (vector unsigned short); + + vector int vec_vpopcntw (vector int); + vector unsigned int vec_vpopcntw (vector int); + + vector long long vec_vrld (vector long long, vector unsigned long long); + vector unsigned long long vec_vrld (vector unsigned long long, + vector unsigned long long); + + vector long long vec_vsld (vector long long, vector unsigned long long); + vector long long vec_vsld (vector unsigned long long, + vector unsigned long long); + + vector long long vec_vsrad (vector long long, vector unsigned long long); + vector unsigned long long vec_vsrad (vector unsigned long long, + vector unsigned long long); + + vector long long vec_vsrd (vector long long, vector unsigned long long); + vector unsigned long long char vec_vsrd (vector unsigned long long, + vector unsigned long long); + + vector long long vec_vsubudm (vector long long, vector long long); + vector long long vec_vsubudm (vector bool long long, vector long long); + vector long long vec_vsubudm (vector long long, vector bool long long); + vector unsigned long long vec_vsubudm (vector unsigned long long, + vector unsigned long long); + vector unsigned long long vec_vsubudm (vector bool long long, + vector unsigned long long); + vector unsigned long long vec_vsubudm (vector unsigned long long, + vector bool long long); + + vector long long vec_vupkhsw (vector int); + vector unsigned long long vec_vupkhsw (vector unsigned int); + + vector long long vec_vupklsw (vector int); + vector unsigned long long vec_vupklsw (vector int); + + If the ISA 2.07 additions to the vector/scalar (power8-vector) +instruction set is available, the following additional functions are +available for 64-bit targets. New vector types (VECTOR __INT128_T and +VECTOR __UINT128_T) are available to hold the __INT128_T and __UINT128_T +types to use these builtins. + + The normal vector extract, and set operations work on VECTOR __INT128_T +and VECTOR __UINT128_T types, but the index value must be 0. + + vector __int128_t vec_vaddcuq (vector __int128_t, vector __int128_t); + vector __uint128_t vec_vaddcuq (vector __uint128_t, vector __uint128_t); + + vector __int128_t vec_vadduqm (vector __int128_t, vector __int128_t); + vector __uint128_t vec_vadduqm (vector __uint128_t, vector __uint128_t); + + vector __int128_t vec_vaddecuq (vector __int128_t, vector __int128_t, + vector __int128_t); + vector __uint128_t vec_vaddecuq (vector __uint128_t, vector __uint128_t, + vector __uint128_t); + + vector __int128_t vec_vaddeuqm (vector __int128_t, vector __int128_t, + vector __int128_t); + vector __uint128_t vec_vaddeuqm (vector __uint128_t, vector __uint128_t, + vector __uint128_t); + + vector __int128_t vec_vsubecuq (vector __int128_t, vector __int128_t, + vector __int128_t); + vector __uint128_t vec_vsubecuq (vector __uint128_t, vector __uint128_t, + vector __uint128_t); + + vector __int128_t vec_vsubeuqm (vector __int128_t, vector __int128_t, + vector __int128_t); + vector __uint128_t vec_vsubeuqm (vector __uint128_t, vector __uint128_t, + vector __uint128_t); + + vector __int128_t vec_vsubcuq (vector __int128_t, vector __int128_t); + vector __uint128_t vec_vsubcuq (vector __uint128_t, vector __uint128_t); + + __int128_t vec_vsubuqm (__int128_t, __int128_t); + __uint128_t vec_vsubuqm (__uint128_t, __uint128_t); + + If the cryptographic instructions are enabled ('-mcrypto' or +'-mcpu=power8'), the following builtins are enabled. + + vector unsigned long long __builtin_crypto_vsbox (vector unsigned long long); + + vector unsigned long long __builtin_crypto_vcipher (vector unsigned long long, + vector unsigned long long); + + vector unsigned long long __builtin_crypto_vcipherlast + (vector unsigned long long, + vector unsigned long long); + + vector unsigned long long __builtin_crypto_vncipher (vector unsigned long long, + vector unsigned long long); + + vector unsigned long long __builtin_crypto_vncipherlast + (vector unsigned long long, + vector unsigned long long); + + vector unsigned char __builtin_crypto_vpermxor (vector unsigned char, + vector unsigned char, + vector unsigned char); + + vector unsigned short __builtin_crypto_vpermxor (vector unsigned short, + vector unsigned short, + vector unsigned short); + + vector unsigned int __builtin_crypto_vpermxor (vector unsigned int, + vector unsigned int, + vector unsigned int); + + vector unsigned long long __builtin_crypto_vpermxor (vector unsigned long long, + vector unsigned long long, + vector unsigned long long); + + vector unsigned char __builtin_crypto_vpmsumb (vector unsigned char, + vector unsigned char); + + vector unsigned short __builtin_crypto_vpmsumb (vector unsigned short, + vector unsigned short); + + vector unsigned int __builtin_crypto_vpmsumb (vector unsigned int, + vector unsigned int); + + vector unsigned long long __builtin_crypto_vpmsumb (vector unsigned long long, + vector unsigned long long); + + vector unsigned long long __builtin_crypto_vshasigmad + (vector unsigned long long, int, int); + + vector unsigned int __builtin_crypto_vshasigmaw (vector unsigned int, + int, int); + + The second argument to the __BUILTIN_CRYPTO_VSHASIGMAD and +__BUILTIN_CRYPTO_VSHASIGMAW builtin functions must be a constant integer +that is 0 or 1. The third argument to these builtin functions must be a +constant integer in the range of 0 to 15. + + +File: gcc.info, Node: PowerPC Hardware Transactional Memory Built-in Functions, Next: RX Built-in Functions, Prev: PowerPC AltiVec/VSX Built-in Functions, Up: Target Builtins + +6.57.22 PowerPC Hardware Transactional Memory Built-in Functions +---------------------------------------------------------------- + +GCC provides two interfaces for accessing the Hardware Transactional +Memory (HTM) instructions available on some of the PowerPC family of +prcoessors (eg, POWER8). The two interfaces come in a low level +interface, consisting of built-in functions specific to PowerPC and a +higher level interface consisting of inline functions that are common +between PowerPC and S/390. + +6.57.22.1 PowerPC HTM Low Level Built-in Functions +.................................................. + +The following low level built-in functions are available with '-mhtm' or +'-mcpu=CPU' where CPU is 'power8' or later. They all generate the +machine instruction that is part of the name. + + The HTM built-ins return true or false depending on their success and +their arguments match exactly the type and order of the associated +hardware instruction's operands. Refer to the ISA manual for a +description of each instruction's operands. + + unsigned int __builtin_tbegin (unsigned int) + unsigned int __builtin_tend (unsigned int) + + unsigned int __builtin_tabort (unsigned int) + unsigned int __builtin_tabortdc (unsigned int, unsigned int, unsigned int) + unsigned int __builtin_tabortdci (unsigned int, unsigned int, int) + unsigned int __builtin_tabortwc (unsigned int, unsigned int, unsigned int) + unsigned int __builtin_tabortwci (unsigned int, unsigned int, int) + + unsigned int __builtin_tcheck (unsigned int) + unsigned int __builtin_treclaim (unsigned int) + unsigned int __builtin_trechkpt (void) + unsigned int __builtin_tsr (unsigned int) + + In addition to the above HTM built-ins, we have added built-ins for +some common extended mnemonics of the HTM instructions: + + unsigned int __builtin_tendall (void) + unsigned int __builtin_tresume (void) + unsigned int __builtin_tsuspend (void) + + The following set of built-in functions are available to gain access to +the HTM specific special purpose registers. + + unsigned long __builtin_get_texasr (void) + unsigned long __builtin_get_texasru (void) + unsigned long __builtin_get_tfhar (void) + unsigned long __builtin_get_tfiar (void) + + void __builtin_set_texasr (unsigned long); + void __builtin_set_texasru (unsigned long); + void __builtin_set_tfhar (unsigned long); + void __builtin_set_tfiar (unsigned long); + + Example usage of these low level built-in functions may look like: + + #include <htmintrin.h> + + int num_retries = 10; + + while (1) + { + if (__builtin_tbegin (0)) + { + /* Transaction State Initiated. */ + if (is_locked (lock)) + __builtin_tabort (0); + ... transaction code... + __builtin_tend (0); + break; + } + else + { + /* Transaction State Failed. Use locks if the transaction + failure is "persistent" or we've tried too many times. */ + if (num_retries-- <= 0 + || _TEXASRU_FAILURE_PERSISTENT (__builtin_get_texasru ())) + { + acquire_lock (lock); + ... non transactional fallback path... + release_lock (lock); + break; + } + } + } + + One final built-in function has been added that returns the value of +the 2-bit Transaction State field of the Machine Status Register (MSR) +as stored in 'CR0'. + + unsigned long __builtin_ttest (void) + + This built-in can be used to determine the current transaction state +using the following code example: + + #include <htmintrin.h> + + unsigned char tx_state = _HTM_STATE (__builtin_ttest ()); + + if (tx_state == _HTM_TRANSACTIONAL) + { + /* Code to use in transactional state. */ + } + else if (tx_state == _HTM_NONTRANSACTIONAL) + { + /* Code to use in non-transactional state. */ + } + else if (tx_state == _HTM_SUSPENDED) + { + /* Code to use in transaction suspended state. */ + } + +6.57.22.2 PowerPC HTM High Level Inline Functions +................................................. + +The following high level HTM interface is made available by including +'<htmxlintrin.h>' and using '-mhtm' or '-mcpu=CPU' where CPU is 'power8' +or later. This interface is common between PowerPC and S/390, allowing +users to write one HTM source implementation that can be compiled and +executed on either system. + + long __TM_simple_begin (void) + long __TM_begin (void* const TM_buff) + long __TM_end (void) + void __TM_abort (void) + void __TM_named_abort (unsigned char const code) + void __TM_resume (void) + void __TM_suspend (void) + + long __TM_is_user_abort (void* const TM_buff) + long __TM_is_named_user_abort (void* const TM_buff, unsigned char *code) + long __TM_is_illegal (void* const TM_buff) + long __TM_is_footprint_exceeded (void* const TM_buff) + long __TM_nesting_depth (void* const TM_buff) + long __TM_is_nested_too_deep(void* const TM_buff) + long __TM_is_conflict(void* const TM_buff) + long __TM_is_failure_persistent(void* const TM_buff) + long __TM_failure_address(void* const TM_buff) + long long __TM_failure_code(void* const TM_buff) + + Using these common set of HTM inline functions, we can create a more +portable version of the HTM example in the previous section that will +work on either PowerPC or S/390: + + #include <htmxlintrin.h> + + int num_retries = 10; + TM_buff_type TM_buff; + + while (1) + { + if (__TM_begin (TM_buff)) + { + /* Transaction State Initiated. */ + if (is_locked (lock)) + __TM_abort (); + ... transaction code... + __TM_end (); + break; + } + else + { + /* Transaction State Failed. Use locks if the transaction + failure is "persistent" or we've tried too many times. */ + if (num_retries-- <= 0 + || __TM_is_failure_persistent (TM_buff)) + { + acquire_lock (lock); + ... non transactional fallback path... + release_lock (lock); + break; + } + } + } + + +File: gcc.info, Node: RX Built-in Functions, Next: S/390 System z Built-in Functions, Prev: PowerPC Hardware Transactional Memory Built-in Functions, Up: Target Builtins + +6.57.23 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: + + -- Built-in Function: void __builtin_rx_brk (void) + Generates the 'brk' machine instruction. + + -- Built-in Function: void __builtin_rx_clrpsw (int) + Generates the 'clrpsw' machine instruction to clear the specified + bit in the processor status word. + + -- Built-in Function: void __builtin_rx_int (int) + Generates the 'int' machine instruction to generate an interrupt + with the specified value. + + -- Built-in Function: void __builtin_rx_machi (int, int) + Generates the 'machi' machine instruction to add the result of + multiplying the top 16 bits of the two arguments into the + accumulator. + + -- Built-in Function: void __builtin_rx_maclo (int, int) + Generates the 'maclo' machine instruction to add the result of + multiplying the bottom 16 bits of the two arguments into the + accumulator. + + -- Built-in Function: void __builtin_rx_mulhi (int, int) + Generates the 'mulhi' machine instruction to place the result of + multiplying the top 16 bits of the two arguments into the + accumulator. + + -- Built-in Function: void __builtin_rx_mullo (int, int) + Generates the 'mullo' machine instruction to place the result of + multiplying the bottom 16 bits of the two arguments into the + accumulator. + + -- Built-in Function: int __builtin_rx_mvfachi (void) + Generates the 'mvfachi' machine instruction to read the top 32 bits + of the accumulator. + + -- Built-in Function: int __builtin_rx_mvfacmi (void) + Generates the 'mvfacmi' machine instruction to read the middle 32 + bits of the accumulator. + + -- Built-in Function: int __builtin_rx_mvfc (int) + Generates the 'mvfc' machine instruction which reads the control + register specified in its argument and returns its value. + + -- Built-in Function: void __builtin_rx_mvtachi (int) + Generates the 'mvtachi' machine instruction to set the top 32 bits + of the accumulator. + + -- Built-in Function: void __builtin_rx_mvtaclo (int) + Generates the 'mvtaclo' machine instruction to set the bottom 32 + bits of the accumulator. + + -- Built-in Function: void __builtin_rx_mvtc (int reg, int val) + Generates the 'mvtc' machine instruction which sets control + register number 'reg' to 'val'. + + -- Built-in Function: void __builtin_rx_mvtipl (int) + Generates the 'mvtipl' machine instruction set the interrupt + priority level. + + -- Built-in Function: void __builtin_rx_racw (int) + Generates the 'racw' machine instruction to round the accumulator + according to the specified mode. + + -- Built-in Function: int __builtin_rx_revw (int) + Generates the '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. + + -- Built-in Function: void __builtin_rx_rmpa (void) + Generates the 'rmpa' machine instruction which initiates a repeated + multiply and accumulate sequence. + + -- Built-in Function: void __builtin_rx_round (float) + Generates the 'round' machine instruction which returns the + floating-point argument rounded according to the current rounding + mode set in the floating-point status word register. + + -- Built-in Function: int __builtin_rx_sat (int) + Generates the 'sat' machine instruction which returns the saturated + value of the argument. + + -- Built-in Function: void __builtin_rx_setpsw (int) + Generates the 'setpsw' machine instruction to set the specified bit + in the processor status word. + + -- Built-in Function: void __builtin_rx_wait (void) + Generates the 'wait' machine instruction. + + +File: gcc.info, Node: S/390 System z Built-in Functions, Next: SH Built-in Functions, Prev: RX Built-in Functions, Up: Target Builtins + +6.57.24 S/390 System z Built-in Functions +----------------------------------------- + + -- Built-in Function: int __builtin_tbegin (void*) + Generates the 'tbegin' machine instruction starting a + non-constraint hardware transaction. If the parameter is non-NULL + the memory area is used to store the transaction diagnostic buffer + and will be passed as first operand to 'tbegin'. This buffer can + be defined using the 'struct __htm_tdb' C struct defined in + 'htmintrin.h' and must reside on a double-word boundary. The + second tbegin operand is set to '0xff0c'. This enables + save/restore of all GPRs and disables aborts for FPR and AR + manipulations inside the transaction body. The condition code set + by the tbegin instruction is returned as integer value. The tbegin + instruction by definition overwrites the content of all FPRs. The + compiler will generate code which saves and restores the FPRs. For + soft-float code it is recommended to used the '*_nofloat' variant. + In order to prevent a TDB from being written it is required to pass + an constant zero value as parameter. Passing the zero value + through a variable is not sufficient. Although modifications of + access registers inside the transaction will not trigger an + transaction abort it is not supported to actually modify them. + Access registers do not get saved when entering a transaction. + They will have undefined state when reaching the abort code. + + Macros for the possible return codes of tbegin are defined in the +'htmintrin.h' header file: + +'_HTM_TBEGIN_STARTED' + 'tbegin' has been executed as part of normal processing. The + transaction body is supposed to be executed. +'_HTM_TBEGIN_INDETERMINATE' + The transaction was aborted due to an indeterminate condition which + might be persistent. +'_HTM_TBEGIN_TRANSIENT' + The transaction aborted due to a transient failure. The + transaction should be re-executed in that case. +'_HTM_TBEGIN_PERSISTENT' + The transaction aborted due to a persistent failure. Re-execution + under same circumstances will not be productive. + + -- Macro: _HTM_FIRST_USER_ABORT_CODE + The '_HTM_FIRST_USER_ABORT_CODE' defined in 'htmintrin.h' specifies + the first abort code which can be used for '__builtin_tabort'. + Values below this threshold are reserved for machine use. + + -- Data type: struct __htm_tdb + The 'struct __htm_tdb' defined in 'htmintrin.h' describes the + structure of the transaction diagnostic block as specified in the + Principles of Operation manual chapter 5-91. + + -- Built-in Function: int __builtin_tbegin_nofloat (void*) + Same as '__builtin_tbegin' but without FPR saves and restores. + Using this variant in code making use of FPRs will leave the FPRs + in undefined state when entering the transaction abort handler + code. + + -- Built-in Function: int __builtin_tbegin_retry (void*, int) + In addition to '__builtin_tbegin' a loop for transient failures is + generated. If tbegin returns a condition code of 2 the transaction + will be retried as often as specified in the second argument. The + perform processor assist instruction is used to tell the CPU about + the number of fails so far. + + -- Built-in Function: int __builtin_tbegin_retry_nofloat (void*, int) + Same as '__builtin_tbegin_retry' but without FPR saves and + restores. Using this variant in code making use of FPRs will leave + the FPRs in undefined state when entering the transaction abort + handler code. + + -- Built-in Function: void __builtin_tbeginc (void) + Generates the 'tbeginc' machine instruction starting a constraint + hardware transaction. The second operand is set to '0xff08'. + + -- Built-in Function: int __builtin_tend (void) + Generates the 'tend' machine instruction finishing a transaction + and making the changes visible to other threads. The condition + code generated by tend is returned as integer value. + + -- Built-in Function: void __builtin_tabort (int) + Generates the 'tabort' machine instruction with the specified abort + code. Abort codes from 0 through 255 are reserved and will result + in an error message. + + -- Built-in Function: void __builtin_tx_assist (int) + Generates the 'ppa rX,rY,1' machine instruction. Where the integer + parameter is loaded into rX and a value of zero is loaded into rY. + The integer parameter specifies the number of times the transaction + repeatedly aborted. + + -- Built-in Function: int __builtin_tx_nesting_depth (void) + Generates the 'etnd' machine instruction. The current nesting + depth is returned as integer value. For a nesting depth of 0 the + code is not executed as part of an transaction. + + -- Built-in Function: void __builtin_non_tx_store (uint64_t *, + uint64_t) + + Generates the 'ntstg' machine instruction. The second argument is + written to the first arguments location. The store operation will + not be rolled-back in case of an transaction abort. + + +File: gcc.info, Node: SH Built-in Functions, Next: SPARC VIS Built-in Functions, Prev: S/390 System z Built-in Functions, Up: Target Builtins + +6.57.25 SH Built-in Functions +----------------------------- + +The following built-in functions are supported on the SH1, SH2, SH3 and +SH4 families of processors: + + -- Built-in Function: void __builtin_set_thread_pointer (void *PTR) + Sets the 'GBR' register to the specified value PTR. This is + usually used by system code that manages threads and execution + contexts. The compiler normally does not generate code that + modifies the contents of 'GBR' and thus the value is preserved + across function calls. Changing the 'GBR' value in user code must + be done with caution, since the compiler might use 'GBR' in order + to access thread local variables. + + -- Built-in Function: void * __builtin_thread_pointer (void) + Returns the value that is currently set in the 'GBR' register. + Memory loads and stores that use the thread pointer as a base + address are turned into 'GBR' based displacement loads and stores, + if possible. For example: + struct my_tcb + { + int a, b, c, d, e; + }; + + int get_tcb_value (void) + { + // Generate 'mov.l @(8,gbr),r0' instruction + return ((my_tcb*)__builtin_thread_pointer ())->c; + } + + +File: gcc.info, Node: SPARC VIS Built-in Functions, Next: SPU Built-in Functions, Prev: SH Built-in Functions, Up: Target Builtins + +6.57.26 SPARC VIS Built-in Functions +------------------------------------ + +GCC supports SIMD operations on the SPARC using both the generic vector +extensions (*note Vector Extensions::) as well as built-in functions for +the SPARC Visual Instruction Set (VIS). When you use the '-mvis' switch, +the VIS extension is exposed as the following built-in functions: + + typedef int v1si __attribute__ ((vector_size (4))); + typedef int v2si __attribute__ ((vector_size (8))); + typedef short v4hi __attribute__ ((vector_size (8))); + typedef short v2hi __attribute__ ((vector_size (4))); + typedef unsigned char v8qi __attribute__ ((vector_size (8))); + typedef unsigned char v4qi __attribute__ ((vector_size (4))); + + void __builtin_vis_write_gsr (int64_t); + int64_t __builtin_vis_read_gsr (void); + + void * __builtin_vis_alignaddr (void *, long); + void * __builtin_vis_alignaddrl (void *, long); + int64_t __builtin_vis_faligndatadi (int64_t, int64_t); + v2si __builtin_vis_faligndatav2si (v2si, v2si); + v4hi __builtin_vis_faligndatav4hi (v4si, v4si); + v8qi __builtin_vis_faligndatav8qi (v8qi, v8qi); + + v4hi __builtin_vis_fexpand (v4qi); + + v4hi __builtin_vis_fmul8x16 (v4qi, v4hi); + v4hi __builtin_vis_fmul8x16au (v4qi, v2hi); + v4hi __builtin_vis_fmul8x16al (v4qi, v2hi); + v4hi __builtin_vis_fmul8sux16 (v8qi, v4hi); + v4hi __builtin_vis_fmul8ulx16 (v8qi, v4hi); + v2si __builtin_vis_fmuld8sux16 (v4qi, v2hi); + v2si __builtin_vis_fmuld8ulx16 (v4qi, v2hi); + + v4qi __builtin_vis_fpack16 (v4hi); + v8qi __builtin_vis_fpack32 (v2si, v8qi); + v2hi __builtin_vis_fpackfix (v2si); + v8qi __builtin_vis_fpmerge (v4qi, v4qi); + + int64_t __builtin_vis_pdist (v8qi, v8qi, int64_t); + + long __builtin_vis_edge8 (void *, void *); + long __builtin_vis_edge8l (void *, void *); + long __builtin_vis_edge16 (void *, void *); + long __builtin_vis_edge16l (void *, void *); + long __builtin_vis_edge32 (void *, void *); + long __builtin_vis_edge32l (void *, void *); + + long __builtin_vis_fcmple16 (v4hi, v4hi); + long __builtin_vis_fcmple32 (v2si, v2si); + long __builtin_vis_fcmpne16 (v4hi, v4hi); + long __builtin_vis_fcmpne32 (v2si, v2si); + long __builtin_vis_fcmpgt16 (v4hi, v4hi); + long __builtin_vis_fcmpgt32 (v2si, v2si); + long __builtin_vis_fcmpeq16 (v4hi, v4hi); + long __builtin_vis_fcmpeq32 (v2si, v2si); + + v4hi __builtin_vis_fpadd16 (v4hi, v4hi); + v2hi __builtin_vis_fpadd16s (v2hi, v2hi); + v2si __builtin_vis_fpadd32 (v2si, v2si); + v1si __builtin_vis_fpadd32s (v1si, v1si); + v4hi __builtin_vis_fpsub16 (v4hi, v4hi); + v2hi __builtin_vis_fpsub16s (v2hi, v2hi); + v2si __builtin_vis_fpsub32 (v2si, v2si); + v1si __builtin_vis_fpsub32s (v1si, v1si); + + long __builtin_vis_array8 (long, long); + long __builtin_vis_array16 (long, long); + long __builtin_vis_array32 (long, long); + + When you use the '-mvis2' switch, the VIS version 2.0 built-in +functions also become available: + + long __builtin_vis_bmask (long, long); + int64_t __builtin_vis_bshuffledi (int64_t, int64_t); + v2si __builtin_vis_bshufflev2si (v2si, v2si); + v4hi __builtin_vis_bshufflev2si (v4hi, v4hi); + v8qi __builtin_vis_bshufflev2si (v8qi, v8qi); + + long __builtin_vis_edge8n (void *, void *); + long __builtin_vis_edge8ln (void *, void *); + long __builtin_vis_edge16n (void *, void *); + long __builtin_vis_edge16ln (void *, void *); + long __builtin_vis_edge32n (void *, void *); + long __builtin_vis_edge32ln (void *, void *); + + When you use the '-mvis3' switch, the VIS version 3.0 built-in +functions also become available: + + void __builtin_vis_cmask8 (long); + void __builtin_vis_cmask16 (long); + void __builtin_vis_cmask32 (long); + + v4hi __builtin_vis_fchksm16 (v4hi, v4hi); + + v4hi __builtin_vis_fsll16 (v4hi, v4hi); + v4hi __builtin_vis_fslas16 (v4hi, v4hi); + v4hi __builtin_vis_fsrl16 (v4hi, v4hi); + v4hi __builtin_vis_fsra16 (v4hi, v4hi); + v2si __builtin_vis_fsll16 (v2si, v2si); + v2si __builtin_vis_fslas16 (v2si, v2si); + v2si __builtin_vis_fsrl16 (v2si, v2si); + v2si __builtin_vis_fsra16 (v2si, v2si); + + long __builtin_vis_pdistn (v8qi, v8qi); + + v4hi __builtin_vis_fmean16 (v4hi, v4hi); + + int64_t __builtin_vis_fpadd64 (int64_t, int64_t); + int64_t __builtin_vis_fpsub64 (int64_t, int64_t); + + v4hi __builtin_vis_fpadds16 (v4hi, v4hi); + v2hi __builtin_vis_fpadds16s (v2hi, v2hi); + v4hi __builtin_vis_fpsubs16 (v4hi, v4hi); + v2hi __builtin_vis_fpsubs16s (v2hi, v2hi); + v2si __builtin_vis_fpadds32 (v2si, v2si); + v1si __builtin_vis_fpadds32s (v1si, v1si); + v2si __builtin_vis_fpsubs32 (v2si, v2si); + v1si __builtin_vis_fpsubs32s (v1si, v1si); + + long __builtin_vis_fucmple8 (v8qi, v8qi); + long __builtin_vis_fucmpne8 (v8qi, v8qi); + long __builtin_vis_fucmpgt8 (v8qi, v8qi); + long __builtin_vis_fucmpeq8 (v8qi, v8qi); + + float __builtin_vis_fhadds (float, float); + double __builtin_vis_fhaddd (double, double); + float __builtin_vis_fhsubs (float, float); + double __builtin_vis_fhsubd (double, double); + float __builtin_vis_fnhadds (float, float); + double __builtin_vis_fnhaddd (double, double); + + int64_t __builtin_vis_umulxhi (int64_t, int64_t); + int64_t __builtin_vis_xmulx (int64_t, int64_t); + int64_t __builtin_vis_xmulxhi (int64_t, int64_t); + + +File: gcc.info, Node: SPU Built-in Functions, Next: TI C6X Built-in Functions, Prev: SPARC VIS Built-in Functions, Up: Target Builtins + +6.57.27 SPU Built-in Functions +------------------------------ + +GCC provides extensions for the SPU processor as described in the +Sony/Toshiba/IBM SPU Language Extensions Specification, which can be +found at <http://cell.scei.co.jp/> or +<http://www.ibm.com/developerworks/power/cell/>. GCC's implementation +differs in several ways. + + * The optional extension of specifying vector constants in + parentheses is not supported. + + * A vector initializer requires no cast if the vector constant is of + the same type as the variable it is initializing. + + * If 'signed' or 'unsigned' is omitted, the signedness of the vector + type is the default signedness of the base type. The default + varies depending on the operating system, so a portable program + should always specify the signedness. + + * By default, the keyword '__vector' is added. The macro 'vector' is + defined in '<spu_intrinsics.h>' and can be undefined. + + * GCC allows using a 'typedef' name as the type specifier for a + vector type. + + * For C, overloaded functions are implemented with macros so the + following does not work: + + spu_add ((vector signed int){1, 2, 3, 4}, foo); + + Since 'spu_add' is a macro, the vector constant in the example is + treated as four separate arguments. Wrap the entire argument in + parentheses for this to work. + + * The extended version of '__builtin_expect' is not supported. + + _Note:_ Only the interface described in the aforementioned +specification is supported. Internally, GCC uses built-in functions to +implement the required functionality, but these are not supported and +are subject to change without notice. + + +File: gcc.info, Node: TI C6X Built-in Functions, Next: TILE-Gx Built-in Functions, Prev: SPU Built-in Functions, Up: Target Builtins + +6.57.28 TI C6X Built-in Functions +--------------------------------- + +GCC provides intrinsics to access certain instructions of the TI C6X +processors. These intrinsics, listed below, are available after +inclusion of the 'c6x_intrinsics.h' header file. They map directly to +C6X instructions. + + + int _sadd (int, int) + int _ssub (int, int) + int _sadd2 (int, int) + int _ssub2 (int, int) + long long _mpy2 (int, int) + long long _smpy2 (int, int) + int _add4 (int, int) + int _sub4 (int, int) + int _saddu4 (int, int) + + int _smpy (int, int) + int _smpyh (int, int) + int _smpyhl (int, int) + int _smpylh (int, int) + + int _sshl (int, int) + int _subc (int, int) + + int _avg2 (int, int) + int _avgu4 (int, int) + + int _clrr (int, int) + int _extr (int, int) + int _extru (int, int) + int _abs (int) + int _abs2 (int) + + +File: gcc.info, Node: TILE-Gx Built-in Functions, Next: TILEPro Built-in Functions, Prev: TI C6X Built-in Functions, Up: Target Builtins + +6.57.29 TILE-Gx Built-in Functions +---------------------------------- + +GCC provides intrinsics to access every instruction of the TILE-Gx +processor. The intrinsics are of the form: + + + unsigned long long __insn_OP (...) + + Where OP is the name of the instruction. Refer to the ISA manual for +the complete list of instructions. + + GCC also provides intrinsics to directly access the network registers. +The intrinsics are: + + + unsigned long long __tile_idn0_receive (void) + unsigned long long __tile_idn1_receive (void) + unsigned long long __tile_udn0_receive (void) + unsigned long long __tile_udn1_receive (void) + unsigned long long __tile_udn2_receive (void) + unsigned long long __tile_udn3_receive (void) + void __tile_idn_send (unsigned long long) + void __tile_udn_send (unsigned long long) + + The intrinsic 'void __tile_network_barrier (void)' is used to guarantee +that no network operations before it are reordered with those after it. + + +File: gcc.info, Node: TILEPro Built-in Functions, Prev: TILE-Gx Built-in Functions, Up: Target Builtins + +6.57.30 TILEPro Built-in Functions +---------------------------------- + +GCC provides intrinsics to access every instruction of the TILEPro +processor. The intrinsics are of the form: + + + unsigned __insn_OP (...) + +where OP is the name of the instruction. Refer to the ISA manual for +the complete list of instructions. + + GCC also provides intrinsics to directly access the network registers. +The intrinsics are: + + + unsigned __tile_idn0_receive (void) + unsigned __tile_idn1_receive (void) + unsigned __tile_sn_receive (void) + unsigned __tile_udn0_receive (void) + unsigned __tile_udn1_receive (void) + unsigned __tile_udn2_receive (void) + unsigned __tile_udn3_receive (void) + void __tile_idn_send (unsigned) + void __tile_sn_send (unsigned) + void __tile_udn_send (unsigned) + + The intrinsic 'void __tile_network_barrier (void)' is used to guarantee +that no network operations before it are reordered with those after it. + + +File: gcc.info, Node: Target Format Checks, Next: Pragmas, Prev: Target Builtins, Up: C Extensions + +6.58 Format Checks Specific to Particular Target Machines +========================================================= + +For some target machines, GCC supports additional options to the format +attribute (*note Declaring Attributes of Functions: Function +Attributes.). + +* Menu: + +* Solaris Format Checks:: +* Darwin Format Checks:: + + +File: gcc.info, Node: Solaris Format Checks, Next: Darwin Format Checks, Up: Target Format Checks + +6.58.1 Solaris Format Checks +---------------------------- + +Solaris targets support the 'cmn_err' (or '__cmn_err__') format check. +'cmn_err' accepts a subset of the standard 'printf' conversions, and the +two-argument '%b' conversion for displaying bit-fields. See the Solaris +man page for 'cmn_err' for more information. + + +File: gcc.info, Node: Darwin Format Checks, Prev: Solaris Format Checks, Up: Target Format Checks + +6.58.2 Darwin Format Checks +--------------------------- + +Darwin targets support the 'CFString' (or '__CFString__') in the format +attribute context. Declarations made with such attribution are parsed +for correct syntax and format argument types. However, parsing of the +format string itself is currently undefined and is not carried out by +this version of the compiler. + + Additionally, 'CFStringRefs' (defined by the 'CoreFoundation' headers) +may also be used as format arguments. Note that the relevant headers +are only likely to be available on Darwin (OSX) installations. On such +installations, the XCode and system documentation provide descriptions +of 'CFString', 'CFStringRefs' and associated functions. + + +File: gcc.info, Node: Pragmas, Next: Unnamed Fields, Prev: Target Format Checks, Up: C Extensions + +6.59 Pragmas Accepted by GCC +============================ + +GCC supports several types of pragmas, primarily in order to compile +code originally written for other compilers. Note that in general we do +not recommend the use of pragmas; *Note Function Attributes::, for +further explanation. + +* Menu: + +* ARM Pragmas:: +* M32C Pragmas:: +* MeP Pragmas:: +* RS/6000 and PowerPC Pragmas:: +* Darwin Pragmas:: +* Solaris Pragmas:: +* Symbol-Renaming Pragmas:: +* Structure-Packing Pragmas:: +* Weak Pragmas:: +* Diagnostic Pragmas:: +* Visibility Pragmas:: +* Push/Pop Macro Pragmas:: +* Function Specific Option Pragmas:: +* Loop-Specific Pragmas:: + + +File: gcc.info, Node: ARM Pragmas, Next: M32C Pragmas, Up: Pragmas + +6.59.1 ARM Pragmas +------------------ + +The ARM target defines pragmas for controlling the default addition of +'long_call' and 'short_call' attributes to functions. *Note Function +Attributes::, for information about the effects of these attributes. + +'long_calls' + Set all subsequent functions to have the 'long_call' attribute. + +'no_long_calls' + Set all subsequent functions to have the 'short_call' attribute. + +'long_calls_off' + Do not affect the 'long_call' or 'short_call' attributes of + subsequent functions. + + +File: gcc.info, Node: M32C Pragmas, Next: MeP Pragmas, Prev: ARM Pragmas, Up: Pragmas + +6.59.2 M32C Pragmas +------------------- + +'GCC memregs NUMBER' + Overrides the command-line option '-memregs=' for the current file. + Use with care! This pragma must be before any function in the + file, and mixing different memregs values in different objects may + make them incompatible. This pragma is useful when a + performance-critical function uses a memreg for temporary values, + as it may allow you to reduce the number of memregs used. + +'ADDRESS NAME ADDRESS' + For any declared symbols matching NAME, this does three things to + that symbol: it forces the symbol to be located at the given + address (a number), it forces the symbol to be volatile, and it + changes the symbol's scope to be static. This pragma exists for + compatibility with other compilers, but note that the common + '1234H' numeric syntax is not supported (use '0x1234' instead). + Example: + + #pragma ADDRESS port3 0x103 + char port3; + + +File: gcc.info, Node: MeP Pragmas, Next: RS/6000 and PowerPC Pragmas, Prev: M32C Pragmas, Up: Pragmas + +6.59.3 MeP Pragmas +------------------ + +'custom io_volatile (on|off)' + Overrides the command-line option '-mio-volatile' for the current + file. Note that for compatibility with future GCC releases, this + option should only be used once before any 'io' variables in each + file. + +'GCC coprocessor available REGISTERS' + Specifies which coprocessor registers are available to the register + allocator. REGISTERS may be a single register, register range + separated by ellipses, or comma-separated list of those. Example: + + #pragma GCC coprocessor available $c0...$c10, $c28 + +'GCC coprocessor call_saved REGISTERS' + Specifies which coprocessor registers are to be saved and restored + by any function using them. REGISTERS may be a single register, + register range separated by ellipses, or comma-separated list of + those. Example: + + #pragma GCC coprocessor call_saved $c4...$c6, $c31 + +'GCC coprocessor subclass '(A|B|C|D)' = REGISTERS' + Creates and defines a register class. These register classes can + be used by inline 'asm' constructs. REGISTERS may be a single + register, register range separated by ellipses, or comma-separated + list of those. Example: + + #pragma GCC coprocessor subclass 'B' = $c2, $c4, $c6 + + asm ("cpfoo %0" : "=B" (x)); + +'GCC disinterrupt NAME , NAME ...' + For the named functions, the compiler adds code to disable + interrupts for the duration of those functions. If any functions + so named are not encountered in the source, a warning is emitted + that the pragma is not used. Examples: + + #pragma disinterrupt foo + #pragma disinterrupt bar, grill + int foo () { ... } + +'GCC call NAME , NAME ...' + For the named functions, the compiler always uses a + register-indirect call model when calling the named functions. + Examples: + + extern int foo (); + #pragma call foo + + +File: gcc.info, Node: RS/6000 and PowerPC Pragmas, Next: Darwin Pragmas, Prev: MeP Pragmas, Up: Pragmas + +6.59.4 RS/6000 and PowerPC Pragmas +---------------------------------- + +The RS/6000 and PowerPC targets define one pragma for controlling +whether or not the 'longcall' attribute is added to function +declarations by default. This pragma overrides the '-mlongcall' option, +but not the 'longcall' and 'shortcall' attributes. *Note RS/6000 and +PowerPC Options::, for more information about when long calls are and +are not necessary. + +'longcall (1)' + Apply the 'longcall' attribute to all subsequent function + declarations. + +'longcall (0)' + Do not apply the 'longcall' attribute to subsequent function + declarations. + + +File: gcc.info, Node: Darwin Pragmas, Next: Solaris Pragmas, Prev: RS/6000 and PowerPC Pragmas, Up: Pragmas + +6.59.5 Darwin Pragmas +--------------------- + +The following pragmas are available for all architectures running the +Darwin operating system. These are useful for compatibility with other +Mac OS compilers. + +'mark TOKENS...' + This pragma is accepted, but has no effect. + +'options align=ALIGNMENT' + This pragma sets the alignment of fields in structures. The values + of ALIGNMENT may be 'mac68k', to emulate m68k alignment, or + 'power', to emulate PowerPC alignment. Uses of this pragma nest + properly; to restore the previous setting, use 'reset' for the + ALIGNMENT. + +'segment TOKENS...' + This pragma is accepted, but has no effect. + +'unused (VAR [, VAR]...)' + This pragma declares variables to be possibly unused. GCC does not + produce warnings for the listed variables. The effect is similar + to that of the 'unused' attribute, except that this pragma may + appear anywhere within the variables' scopes. + + +File: gcc.info, Node: Solaris Pragmas, Next: Symbol-Renaming Pragmas, Prev: Darwin Pragmas, Up: Pragmas + +6.59.6 Solaris Pragmas +---------------------- + +The Solaris target supports '#pragma redefine_extname' (*note +Symbol-Renaming Pragmas::). It also supports additional '#pragma' +directives for compatibility with the system compiler. + +'align ALIGNMENT (VARIABLE [, VARIABLE]...)' + + Increase the minimum alignment of each VARIABLE to ALIGNMENT. This + is the same as GCC's 'aligned' attribute *note Variable + Attributes::). Macro expansion occurs on the arguments to this + pragma when compiling C and Objective-C. It does not currently + occur when compiling C++, but this is a bug which may be fixed in a + future release. + +'fini (FUNCTION [, FUNCTION]...)' + + This pragma causes each listed FUNCTION to be called after main, or + during shared module unloading, by adding a call to the '.fini' + section. + +'init (FUNCTION [, FUNCTION]...)' + + This pragma causes each listed FUNCTION to be called during + initialization (before 'main') or during shared module loading, by + adding a call to the '.init' section. + + +File: gcc.info, Node: Symbol-Renaming Pragmas, Next: Structure-Packing Pragmas, Prev: Solaris Pragmas, Up: Pragmas + +6.59.7 Symbol-Renaming Pragmas +------------------------------ + +For compatibility with the Solaris system headers, GCC supports two +'#pragma' directives that change the name used in assembly for a given +declaration. To get this effect on all platforms supported by GCC, use +the asm labels extension (*note Asm Labels::). + +'redefine_extname OLDNAME NEWNAME' + + This pragma gives the C function OLDNAME the assembly symbol + NEWNAME. The preprocessor macro '__PRAGMA_REDEFINE_EXTNAME' is + defined if this pragma is available (currently on all platforms). + + This pragma and the asm labels extension interact in a complicated +manner. Here are some corner cases you may want to be aware of. + + 1. Both pragmas silently apply only to declarations with external + linkage. Asm labels do not have this restriction. + + 2. In C++, both pragmas silently apply only to declarations with "C" + linkage. Again, asm labels do not have this restriction. + + 3. If any of the three ways of changing the assembly name of a + declaration is applied to a declaration whose assembly name has + already been determined (either by a previous use of one of these + features, or because the compiler needed the assembly name in order + to generate code), and the new name is different, a warning issues + and the name does not change. + + 4. The OLDNAME used by '#pragma redefine_extname' is always the + C-language name. + + +File: gcc.info, Node: Structure-Packing Pragmas, Next: Weak Pragmas, Prev: Symbol-Renaming Pragmas, Up: Pragmas + +6.59.8 Structure-Packing Pragmas +-------------------------------- + +For compatibility with Microsoft Windows compilers, GCC supports a set +of '#pragma' directives that change the maximum alignment of members of +structures (other than zero-width bit-fields), unions, and classes +subsequently defined. The N value below always is required to be a +small power of two and specifies the new alignment in bytes. + + 1. '#pragma pack(N)' simply sets the new alignment. + 2. '#pragma pack()' sets the alignment to the one that was in effect + when compilation started (see also command-line option + '-fpack-struct[=N]' *note Code Gen Options::). + 3. '#pragma pack(push[,N])' pushes the current alignment setting on an + internal stack and then optionally sets the new alignment. + 4. '#pragma pack(pop)' restores the alignment setting to the one saved + at the top of the internal stack (and removes that stack entry). + Note that '#pragma pack([N])' does not influence this internal + stack; thus it is possible to have '#pragma pack(push)' followed by + multiple '#pragma pack(N)' instances and finalized by a single + '#pragma pack(pop)'. + + Some targets, e.g. i386 and PowerPC, support the 'ms_struct' '#pragma' +which lays out a structure as the documented '__attribute__ +((ms_struct))'. + 1. '#pragma ms_struct on' turns on the layout for structures declared. + 2. '#pragma ms_struct off' turns off the layout for structures + declared. + 3. '#pragma ms_struct reset' goes back to the default layout. + + +File: gcc.info, Node: Weak Pragmas, Next: Diagnostic Pragmas, Prev: Structure-Packing Pragmas, Up: Pragmas + +6.59.9 Weak Pragmas +------------------- + +For compatibility with SVR4, GCC supports a set of '#pragma' directives +for declaring symbols to be weak, and defining weak aliases. + +'#pragma weak SYMBOL' + This pragma declares SYMBOL to be weak, as if the declaration had + the attribute of the same name. The pragma may appear before or + after the declaration of SYMBOL. It is not an error for SYMBOL to + never be defined at all. + +'#pragma weak SYMBOL1 = SYMBOL2' + This pragma declares SYMBOL1 to be a weak alias of SYMBOL2. It is + an error if SYMBOL2 is not defined in the current translation unit. + + +File: gcc.info, Node: Diagnostic Pragmas, Next: Visibility Pragmas, Prev: Weak Pragmas, Up: Pragmas + +6.59.10 Diagnostic Pragmas +-------------------------- + +GCC allows the user to selectively enable or disable certain types of +diagnostics, and change the kind of the diagnostic. For example, a +project's policy might require that all sources compile with '-Werror' +but certain files might have exceptions allowing specific types of +warnings. Or, a project might selectively enable diagnostics and treat +them as errors depending on which preprocessor macros are defined. + +'#pragma GCC diagnostic KIND OPTION' + + Modifies the disposition of a diagnostic. Note that not all + diagnostics are modifiable; at the moment only warnings (normally + controlled by '-W...') can be controlled, and not all of them. Use + '-fdiagnostics-show-option' to determine which diagnostics are + controllable and which option controls them. + + KIND is 'error' to treat this diagnostic as an error, 'warning' to + treat it like a warning (even if '-Werror' is in effect), or + 'ignored' if the diagnostic is to be ignored. OPTION is a double + quoted string that matches the command-line option. + + #pragma GCC diagnostic warning "-Wformat" + #pragma GCC diagnostic error "-Wformat" + #pragma GCC diagnostic ignored "-Wformat" + + Note that these pragmas override any command-line options. GCC + keeps track of the location of each pragma, and issues diagnostics + according to the state as of that point in the source file. Thus, + pragmas occurring after a line do not affect diagnostics caused by + that line. + +'#pragma GCC diagnostic push' +'#pragma GCC diagnostic pop' + + Causes GCC to remember the state of the diagnostics as of each + 'push', and restore to that point at each 'pop'. If a 'pop' has no + matching 'push', the command-line options are restored. + + #pragma GCC diagnostic error "-Wuninitialized" + foo(a); /* error is given for this one */ + #pragma GCC diagnostic push + #pragma GCC diagnostic ignored "-Wuninitialized" + foo(b); /* no diagnostic for this one */ + #pragma GCC diagnostic pop + foo(c); /* error is given for this one */ + #pragma GCC diagnostic pop + foo(d); /* depends on command-line options */ + + GCC also offers a simple mechanism for printing messages during +compilation. + +'#pragma message STRING' + + Prints STRING as a compiler message on compilation. The message is + informational only, and is neither a compilation warning nor an + error. + + #pragma message "Compiling " __FILE__ "..." + + STRING may be parenthesized, and is printed with location + information. For example, + + #define DO_PRAGMA(x) _Pragma (#x) + #define TODO(x) DO_PRAGMA(message ("TODO - " #x)) + + TODO(Remember to fix this) + + prints '/tmp/file.c:4: note: #pragma message: TODO - Remember to + fix this'. + + +File: gcc.info, Node: Visibility Pragmas, Next: Push/Pop Macro Pragmas, Prev: Diagnostic Pragmas, Up: Pragmas + +6.59.11 Visibility Pragmas +-------------------------- + +'#pragma GCC visibility push(VISIBILITY)' +'#pragma GCC visibility pop' + + This pragma allows the user to set the visibility for multiple + declarations without having to give each a visibility attribute + *Note Function Attributes::, for more information about visibility + and the attribute syntax. + + In C++, '#pragma GCC visibility' affects only namespace-scope + declarations. Class members and template specializations are not + affected; if you want to override the visibility for a particular + member or instantiation, you must use an attribute. + + +File: gcc.info, Node: Push/Pop Macro Pragmas, Next: Function Specific Option Pragmas, Prev: Visibility Pragmas, Up: Pragmas + +6.59.12 Push/Pop Macro Pragmas +------------------------------ + +For compatibility with Microsoft Windows compilers, GCC supports +'#pragma push_macro("MACRO_NAME")' and '#pragma +pop_macro("MACRO_NAME")'. + +'#pragma push_macro("MACRO_NAME")' + This pragma saves the value of the macro named as MACRO_NAME to the + top of the stack for this macro. + +'#pragma pop_macro("MACRO_NAME")' + This pragma sets the value of the macro named as MACRO_NAME to the + value on top of the stack for this macro. If the stack for + MACRO_NAME is empty, the value of the macro remains unchanged. + + For example: + + #define X 1 + #pragma push_macro("X") + #undef X + #define X -1 + #pragma pop_macro("X") + int x [X]; + +In this example, the definition of X as 1 is saved by '#pragma +push_macro' and restored by '#pragma pop_macro'. + + +File: gcc.info, Node: Function Specific Option Pragmas, Next: Loop-Specific Pragmas, Prev: Push/Pop Macro Pragmas, Up: Pragmas + +6.59.13 Function Specific Option Pragmas +---------------------------------------- + +'#pragma GCC target ("STRING"...)' + + This pragma allows you to set target specific options for functions + defined later in the source file. One or more strings can be + specified. Each function that is defined after this point is as if + 'attribute((target("STRING")))' was specified for that function. + The parenthesis around the options is optional. *Note Function + Attributes::, for more information about the 'target' attribute and + the attribute syntax. + + The '#pragma GCC target' pragma is presently implemented for + i386/x86_64, PowerPC, and Nios II targets only. + +'#pragma GCC optimize ("STRING"...)' + + This pragma allows you to set global optimization options for + functions defined later in the source file. One or more strings + can be specified. Each function that is defined after this point + is as if 'attribute((optimize("STRING")))' was specified for that + function. The parenthesis around the options is optional. *Note + Function Attributes::, for more information about the 'optimize' + attribute and the attribute syntax. + + The '#pragma GCC optimize' pragma is not implemented in GCC + versions earlier than 4.4. + +'#pragma GCC push_options' +'#pragma GCC pop_options' + + These pragmas maintain a stack of the current target and + optimization options. It is intended for include files where you + temporarily want to switch to using a different '#pragma GCC + target' or '#pragma GCC optimize' and then to pop back to the + previous options. + + The '#pragma GCC push_options' and '#pragma GCC pop_options' + pragmas are not implemented in GCC versions earlier than 4.4. + +'#pragma GCC reset_options' + + This pragma clears the current '#pragma GCC target' and '#pragma + GCC optimize' to use the default switches as specified on the + command line. + + The '#pragma GCC reset_options' pragma is not implemented in GCC + versions earlier than 4.4. + + +File: gcc.info, Node: Loop-Specific Pragmas, Prev: Function Specific Option Pragmas, Up: Pragmas + +6.59.14 Loop-Specific Pragmas +----------------------------- + +'#pragma GCC ivdep' + + With this pragma, the programmer asserts that there are no loop-carried +dependencies which would prevent that consecutive iterations of the +following loop can be executed concurrently with SIMD (single +instruction multiple data) instructions. + + For example, the compiler can only unconditionally vectorize the +following loop with the pragma: + + void foo (int n, int *a, int *b, int *c) + { + int i, j; + #pragma GCC ivdep + for (i = 0; i < n; ++i) + a[i] = b[i] + c[i]; + } + +In this example, using the 'restrict' qualifier had the same effect. In +the following example, that would not be possible. Assume k < -m or k +>= m. Only with the pragma, the compiler knows that it can +unconditionally vectorize the following loop: + + void ignore_vec_dep (int *a, int k, int c, int m) + { + #pragma GCC ivdep + for (int i = 0; i < m; i++) + a[i] = a[i + k] * c; + } + + +File: gcc.info, Node: Unnamed Fields, Next: Thread-Local, Prev: Pragmas, Up: C Extensions + +6.60 Unnamed struct/union fields within structs/unions +====================================================== + +As permitted by ISO C11 and for compatibility with other compilers, GCC +allows you to define a structure or union that contains, as fields, +structures and unions without names. For example: + + struct { + int a; + union { + int b; + float c; + }; + int d; + } foo; + +In this example, you are able to access members of the unnamed union +with code like 'foo.b'. Note that only unnamed structs and unions are +allowed, you may not have, for example, an unnamed 'int'. + + You must never create such structures that cause ambiguous field +definitions. For example, in this structure: + + struct { + int a; + struct { + int a; + }; + } foo; + +it is ambiguous which 'a' is being referred to with 'foo.a'. The +compiler gives errors for such constructs. + + Unless '-fms-extensions' is used, the unnamed field must be a structure +or union definition without a tag (for example, 'struct { int a; };'). +If '-fms-extensions' is used, the field may also be a definition with a +tag such as 'struct foo { int a; };', a reference to a previously +defined structure or union such as 'struct foo;', or a reference to a +'typedef' name for a previously defined structure or union type. + + The option '-fplan9-extensions' enables '-fms-extensions' as well as +two other extensions. First, a pointer to a structure is automatically +converted to a pointer to an anonymous field for assignments and +function calls. For example: + + struct s1 { int a; }; + struct s2 { struct s1; }; + extern void f1 (struct s1 *); + void f2 (struct s2 *p) { f1 (p); } + +In the call to 'f1' inside 'f2', the pointer 'p' is converted into a +pointer to the anonymous field. + + Second, when the type of an anonymous field is a 'typedef' for a +'struct' or 'union', code may refer to the field using the name of the +'typedef'. + + typedef struct { int a; } s1; + struct s2 { s1; }; + s1 f1 (struct s2 *p) { return p->s1; } + + These usages are only permitted when they are not ambiguous. + + +File: gcc.info, Node: Thread-Local, Next: Binary constants, Prev: Unnamed Fields, Up: C Extensions + +6.61 Thread-Local Storage +========================= + +Thread-local storage (TLS) is a mechanism by which variables are +allocated such that there is one instance of the variable per extant +thread. The runtime model GCC uses to implement this originates in the +IA-64 processor-specific ABI, but has since been migrated to other +processors as well. It requires significant support from the linker +('ld'), dynamic linker ('ld.so'), and system libraries ('libc.so' and +'libpthread.so'), so it is not available everywhere. + + At the user level, the extension is visible with a new storage class +keyword: '__thread'. For example: + + __thread int i; + extern __thread struct state s; + static __thread char *p; + + The '__thread' specifier may be used alone, with the 'extern' or +'static' specifiers, but with no other storage class specifier. When +used with 'extern' or 'static', '__thread' must appear immediately after +the other storage class specifier. + + The '__thread' specifier may be applied to any global, file-scoped +static, function-scoped static, or static data member of a class. It +may not be applied to block-scoped automatic or non-static data member. + + When the address-of operator is applied to a thread-local variable, it +is evaluated at run time and returns the address of the current thread's +instance of that variable. An address so obtained may be used by any +thread. When a thread terminates, any pointers to thread-local +variables in that thread become invalid. + + No static initialization may refer to the address of a thread-local +variable. + + In C++, if an initializer is present for a thread-local variable, it +must be a CONSTANT-EXPRESSION, as defined in 5.19.2 of the ANSI/ISO C++ +standard. + + See ELF Handling For Thread-Local Storage +(http://www.akkadia.org/drepper/tls.pdf) for a detailed explanation of +the four thread-local storage addressing models, and how the runtime is +expected to function. + +* Menu: + +* C99 Thread-Local Edits:: +* C++98 Thread-Local Edits:: + + +File: gcc.info, Node: C99 Thread-Local Edits, Next: C++98 Thread-Local Edits, Up: Thread-Local + +6.61.1 ISO/IEC 9899:1999 Edits for Thread-Local Storage +------------------------------------------------------- + +The following are a set of changes to ISO/IEC 9899:1999 (aka C99) that +document the exact semantics of the language extension. + + * '5.1.2 Execution environments' + + Add new text after paragraph 1 + + Within either execution environment, a "thread" is a flow of + control within a program. It is implementation defined + whether or not there may be more than one thread associated + with a program. It is implementation defined how threads + beyond the first are created, the name and type of the + function called at thread startup, and how threads may be + terminated. However, objects with thread storage duration + shall be initialized before thread startup. + + * '6.2.4 Storage durations of objects' + + Add new text before paragraph 3 + + An object whose identifier is declared with the storage-class + specifier '__thread' has "thread storage duration". Its + lifetime is the entire execution of the thread, and its stored + value is initialized only once, prior to thread startup. + + * '6.4.1 Keywords' + + Add '__thread'. + + * '6.7.1 Storage-class specifiers' + + Add '__thread' to the list of storage class specifiers in paragraph + 1. + + Change paragraph 2 to + + With the exception of '__thread', at most one storage-class + specifier may be given [...]. The '__thread' specifier may be + used alone, or immediately following 'extern' or 'static'. + + Add new text after paragraph 6 + + The declaration of an identifier for a variable that has block + scope that specifies '__thread' shall also specify either + 'extern' or 'static'. + + The '__thread' specifier shall be used only with variables. + + +File: gcc.info, Node: C++98 Thread-Local Edits, Prev: C99 Thread-Local Edits, Up: Thread-Local + +6.61.2 ISO/IEC 14882:1998 Edits for Thread-Local Storage +-------------------------------------------------------- + +The following are a set of changes to ISO/IEC 14882:1998 (aka C++98) +that document the exact semantics of the language extension. + + * [intro.execution] + + New text after paragraph 4 + + A "thread" is a flow of control within the abstract machine. + It is implementation defined whether or not there may be more + than one thread. + + New text after paragraph 7 + + It is unspecified whether additional action must be taken to + ensure when and whether side effects are visible to other + threads. + + * [lex.key] + + Add '__thread'. + + * [basic.start.main] + + Add after paragraph 5 + + The thread that begins execution at the 'main' function is + called the "main thread". It is implementation defined how + functions beginning threads other than the main thread are + designated or typed. A function so designated, as well as the + 'main' function, is called a "thread startup function". It is + implementation defined what happens if a thread startup + function returns. It is implementation defined what happens + to other threads when any thread calls 'exit'. + + * [basic.start.init] + + Add after paragraph 4 + + The storage for an object of thread storage duration shall be + statically initialized before the first statement of the + thread startup function. An object of thread storage duration + shall not require dynamic initialization. + + * [basic.start.term] + + Add after paragraph 3 + + The type of an object with thread storage duration shall not + have a non-trivial destructor, nor shall it be an array type + whose elements (directly or indirectly) have non-trivial + destructors. + + * [basic.stc] + + Add "thread storage duration" to the list in paragraph 1. + + Change paragraph 2 + + Thread, static, and automatic storage durations are associated + with objects introduced by declarations [...]. + + Add '__thread' to the list of specifiers in paragraph 3. + + * [basic.stc.thread] + + New section before [basic.stc.static] + + The keyword '__thread' applied to a non-local object gives the + object thread storage duration. + + A local variable or class data member declared both 'static' + and '__thread' gives the variable or member thread storage + duration. + + * [basic.stc.static] + + Change paragraph 1 + + All objects that have neither thread storage duration, dynamic + storage duration nor are local [...]. + + * [dcl.stc] + + Add '__thread' to the list in paragraph 1. + + Change paragraph 1 + + With the exception of '__thread', at most one + STORAGE-CLASS-SPECIFIER shall appear in a given + DECL-SPECIFIER-SEQ. The '__thread' specifier may be used + alone, or immediately following the 'extern' or 'static' + specifiers. [...] + + Add after paragraph 5 + + The '__thread' specifier can be applied only to the names of + objects and to anonymous unions. + + * [class.mem] + + Add after paragraph 6 + + Non-'static' members shall not be '__thread'. + + +File: gcc.info, Node: Binary constants, Prev: Thread-Local, Up: C Extensions + +6.62 Binary constants using the '0b' prefix +=========================================== + +Integer constants can be written as binary constants, consisting of a +sequence of '0' and '1' digits, prefixed by '0b' or '0B'. This is +particularly useful in environments that operate a lot on the bit level +(like microcontrollers). + + The following statements are identical: + + i = 42; + i = 0x2a; + i = 052; + i = 0b101010; + + The type of these constants follows the same rules as for octal or +hexadecimal integer constants, so suffixes like 'L' or 'UL' can be +applied. + + +File: gcc.info, Node: C++ Extensions, Next: Objective-C, Prev: C Extensions, Up: Top + +7 Extensions to the C++ Language +******************************** + +The GNU compiler provides these extensions to the C++ language (and you +can also use most of the C language extensions in your C++ programs). +If you want to write code that checks whether these features are +available, you can test for the GNU compiler the same way as for C +programs: check for a predefined macro '__GNUC__'. You can also use +'__GNUG__' to test specifically for GNU C++ (*note Predefined Macros: +(cpp)Common Predefined Macros.). + +* Menu: + +* C++ Volatiles:: What constitutes an access to a volatile object. +* Restricted Pointers:: C99 restricted pointers and references. +* Vague Linkage:: Where G++ puts inlines, vtables and such. +* C++ Interface:: You can use a single C++ header file for both + declarations and definitions. +* Template Instantiation:: Methods for ensuring that exactly one copy of + each needed template instantiation is emitted. +* Bound member functions:: You can extract a function pointer to the + method denoted by a '->*' or '.*' expression. +* C++ Attributes:: Variable, function, and type attributes for C++ only. +* Function Multiversioning:: Declaring multiple function versions. +* Namespace Association:: Strong using-directives for namespace association. +* Type Traits:: Compiler support for type traits +* Java Exceptions:: Tweaking exception handling to work with Java. +* Deprecated Features:: Things will disappear from G++. +* Backwards Compatibility:: Compatibilities with earlier definitions of C++. + + +File: gcc.info, Node: C++ Volatiles, Next: Restricted Pointers, Up: C++ Extensions + +7.1 When is a Volatile C++ Object Accessed? +=========================================== + +The C++ standard differs from the C standard in its treatment of +volatile objects. It fails to specify what constitutes a volatile +access, except to say that C++ should behave in a similar manner to C +with respect to volatiles, where possible. However, the different +lvalueness of expressions between C and C++ complicate the behavior. +G++ behaves the same as GCC for volatile access, *Note Volatiles: C +Extensions, for a description of GCC's behavior. + + The C and C++ language specifications differ when an object is accessed +in a void context: + + volatile int *src = SOMEVALUE; + *src; + + The C++ standard specifies that such expressions do not undergo lvalue +to rvalue conversion, and that the type of the dereferenced object may +be incomplete. The C++ standard does not specify explicitly that it is +lvalue to rvalue conversion that is responsible for causing an access. +There is reason to believe that it is, because otherwise certain simple +expressions become undefined. However, because it would surprise most +programmers, G++ treats dereferencing a pointer to volatile object of +complete type as GCC would do for an equivalent type in C. When the +object has incomplete type, G++ issues a warning; if you wish to force +an error, you must force a conversion to rvalue with, for instance, a +static cast. + + When using a reference to volatile, G++ does not treat equivalent +expressions as accesses to volatiles, but instead issues a warning that +no volatile is accessed. The rationale for this is that otherwise it +becomes difficult to determine where volatile access occur, and not +possible to ignore the return value from functions returning volatile +references. Again, if you wish to force a read, cast the reference to +an rvalue. + + G++ implements the same behavior as GCC does when assigning to a +volatile object--there is no reread of the assigned-to object, the +assigned rvalue is reused. Note that in C++ assignment expressions are +lvalues, and if used as an lvalue, the volatile object is referred to. +For instance, VREF refers to VOBJ, as expected, in the following +example: + + volatile int vobj; + volatile int &vref = vobj = SOMETHING; + + +File: gcc.info, Node: Restricted Pointers, Next: Vague Linkage, Prev: C++ Volatiles, Up: C++ Extensions + +7.2 Restricting Pointer Aliasing +================================ + +As with the C front end, G++ understands the C99 feature of restricted +pointers, specified with the '__restrict__', or '__restrict' type +qualifier. Because you cannot compile C++ by specifying the '-std=c99' +language flag, 'restrict' is not a keyword in C++. + + In addition to allowing restricted pointers, you can specify restricted +references, which indicate that the reference is not aliased in the +local context. + + void fn (int *__restrict__ rptr, int &__restrict__ rref) + { + /* ... */ + } + +In the body of 'fn', RPTR points to an unaliased integer and RREF refers +to a (different) unaliased integer. + + You may also specify whether a member function's THIS pointer is +unaliased by using '__restrict__' as a member function qualifier. + + void T::fn () __restrict__ + { + /* ... */ + } + +Within the body of 'T::fn', THIS has the effective definition 'T +*__restrict__ const this'. Notice that the interpretation of a +'__restrict__' member function qualifier is different to that of 'const' +or 'volatile' qualifier, in that it is applied to the pointer rather +than the object. This is consistent with other compilers that implement +restricted pointers. + + As with all outermost parameter qualifiers, '__restrict__' is ignored +in function definition matching. This means you only need to specify +'__restrict__' in a function definition, rather than in a function +prototype as well. + + +File: gcc.info, Node: Vague Linkage, Next: C++ Interface, Prev: Restricted Pointers, Up: C++ Extensions + +7.3 Vague Linkage +================= + +There are several constructs in C++ that require space in the object +file but are not clearly tied to a single translation unit. We say that +these constructs have "vague linkage". Typically such constructs are +emitted wherever they are needed, though sometimes we can be more +clever. + +Inline Functions + Inline functions are typically defined in a header file which can + be included in many different compilations. Hopefully they can + usually be inlined, but sometimes an out-of-line copy is necessary, + if the address of the function is taken or if inlining fails. In + general, we emit an out-of-line copy in all translation units where + one is needed. As an exception, we only emit inline virtual + functions with the vtable, since it always requires a copy. + + Local static variables and string constants used in an inline + function are also considered to have vague linkage, since they must + be shared between all inlined and out-of-line instances of the + function. + +VTables + C++ virtual functions are implemented in most compilers using a + lookup table, known as a vtable. The vtable contains pointers to + the virtual functions provided by a class, and each object of the + class contains a pointer to its vtable (or vtables, in some + multiple-inheritance situations). If the class declares any + non-inline, non-pure virtual functions, the first one is chosen as + the "key method" for the class, and the vtable is only emitted in + the translation unit where the key method is defined. + + _Note:_ If the chosen key method is later defined as inline, the + vtable is still emitted in every translation unit that defines it. + Make sure that any inline virtuals are declared inline in the class + body, even if they are not defined there. + +'type_info' objects + C++ requires information about types to be written out in order to + implement 'dynamic_cast', 'typeid' and exception handling. For + polymorphic classes (classes with virtual functions), the + 'type_info' object is written out along with the vtable so that + 'dynamic_cast' can determine the dynamic type of a class object at + run time. For all other types, we write out the 'type_info' object + when it is used: when applying 'typeid' to an expression, throwing + an object, or referring to a type in a catch clause or exception + specification. + +Template Instantiations + Most everything in this section also applies to template + instantiations, but there are other options as well. *Note Where's + the Template?: Template Instantiation. + + When used with GNU ld version 2.8 or later on an ELF system such as +GNU/Linux or Solaris 2, or on Microsoft Windows, duplicate copies of +these constructs will be discarded at link time. This is known as +COMDAT support. + + On targets that don't support COMDAT, but do support weak symbols, GCC +uses them. This way one copy overrides all the others, but the unused +copies still take up space in the executable. + + For targets that do not support either COMDAT or weak symbols, most +entities with vague linkage are emitted as local symbols to avoid +duplicate definition errors from the linker. This does not happen for +local statics in inlines, however, as having multiple copies almost +certainly breaks things. + + *Note Declarations and Definitions in One Header: C++ Interface, for +another way to control placement of these constructs. + + +File: gcc.info, Node: C++ Interface, Next: Template Instantiation, Prev: Vague Linkage, Up: C++ Extensions + +7.4 #pragma interface and implementation +======================================== + +'#pragma interface' and '#pragma implementation' provide the user with a +way of explicitly directing the compiler to emit entities with vague +linkage (and debugging information) in a particular translation unit. + + _Note:_ As of GCC 2.7.2, these '#pragma's are not useful in most cases, +because of COMDAT support and the "key method" heuristic mentioned in +*note Vague Linkage::. Using them can actually cause your program to +grow due to unnecessary out-of-line copies of inline functions. +Currently (3.4) the only benefit of these '#pragma's is reduced +duplication of debugging information, and that should be addressed soon +on DWARF 2 targets with the use of COMDAT groups. + +'#pragma interface' +'#pragma interface "SUBDIR/OBJECTS.h"' + Use this directive in _header files_ that define object classes, to + save space in most of the object files that use those classes. + Normally, local copies of certain information (backup copies of + inline member functions, debugging information, and the internal + tables that implement virtual functions) must be kept in each + object file that includes class definitions. You can use this + pragma to avoid such duplication. When a header file containing + '#pragma interface' is included in a compilation, this auxiliary + information is not generated (unless the main input source file + itself uses '#pragma implementation'). Instead, the object files + contain references to be resolved at link time. + + The second form of this directive is useful for the case where you + have multiple headers with the same name in different directories. + If you use this form, you must specify the same string to '#pragma + implementation'. + +'#pragma implementation' +'#pragma implementation "OBJECTS.h"' + Use this pragma in a _main input file_, when you want full output + from included header files to be generated (and made globally + visible). The included header file, in turn, should use '#pragma + interface'. Backup copies of inline member functions, debugging + information, and the internal tables used to implement virtual + functions are all generated in implementation files. + + If you use '#pragma implementation' with no argument, it applies to + an include file with the same basename(1) as your source file. For + example, in 'allclass.cc', giving just '#pragma implementation' by + itself is equivalent to '#pragma implementation "allclass.h"'. + + In versions of GNU C++ prior to 2.6.0 'allclass.h' was treated as + an implementation file whenever you would include it from + 'allclass.cc' even if you never specified '#pragma implementation'. + This was deemed to be more trouble than it was worth, however, and + disabled. + + Use the string argument if you want a single implementation file to + include code from multiple header files. (You must also use + '#include' to include the header file; '#pragma implementation' + only specifies how to use the file--it doesn't actually include + it.) + + There is no way to split up the contents of a single header file + into multiple implementation files. + + '#pragma implementation' and '#pragma interface' also have an effect on +function inlining. + + If you define a class in a header file marked with '#pragma interface', +the effect on an inline function defined in that class is similar to an +explicit 'extern' declaration--the compiler emits no code at all to +define an independent version of the function. Its definition is used +only for inlining with its callers. + + Conversely, when you include the same header file in a main source file +that declares it as '#pragma implementation', the compiler emits code +for the function itself; this defines a version of the function that can +be found via pointers (or by callers compiled without inlining). If all +calls to the function can be inlined, you can avoid emitting the +function by compiling with '-fno-implement-inlines'. If any calls are +not inlined, you will get linker errors. + + ---------- Footnotes ---------- + + (1) A file's "basename" is the name stripped of all leading path +information and of trailing suffixes, such as '.h' or '.C' or '.cc'. + + +File: gcc.info, Node: Template Instantiation, Next: Bound member functions, Prev: C++ Interface, Up: C++ Extensions + +7.5 Where's the Template? +========================= + +C++ templates are the first language feature to require more +intelligence from the environment than one usually finds on a UNIX +system. Somehow the compiler and linker have to make sure that each +template instance occurs exactly once in the executable if it is needed, +and not at all otherwise. There are two basic approaches to this +problem, which are referred to as the Borland model and the Cfront +model. + +Borland model + Borland C++ solved the template instantiation problem by adding the + code equivalent of common blocks to their linker; the compiler + emits template instances in each translation unit that uses them, + and the linker collapses them together. The advantage of this + model is that the linker only has to consider the object files + themselves; there is no external complexity to worry about. This + disadvantage is that compilation time is increased because the + template code is being compiled repeatedly. Code written for this + model tends to include definitions of all templates in the header + file, since they must be seen to be instantiated. + +Cfront model + The AT&T C++ translator, Cfront, solved the template instantiation + problem by creating the notion of a template repository, an + automatically maintained place where template instances are stored. + A more modern version of the repository works as follows: As + individual object files are built, the compiler places any template + definitions and instantiations encountered in the repository. At + link time, the link wrapper adds in the objects in the repository + and compiles any needed instances that were not previously emitted. + The advantages of this model are more optimal compilation speed and + the ability to use the system linker; to implement the Borland + model a compiler vendor also needs to replace the linker. The + disadvantages are vastly increased complexity, and thus potential + for error; for some code this can be just as transparent, but in + practice it can been very difficult to build multiple programs in + one directory and one program in multiple directories. Code + written for this model tends to separate definitions of non-inline + member templates into a separate file, which should be compiled + separately. + + When used with GNU ld version 2.8 or later on an ELF system such as +GNU/Linux or Solaris 2, or on Microsoft Windows, G++ supports the +Borland model. On other systems, G++ implements neither automatic +model. + + You have the following options for dealing with template +instantiations: + + 1. Compile your template-using code with '-frepo'. The compiler + generates files with the extension '.rpo' listing all of the + template instantiations used in the corresponding object files that + could be instantiated there; the link wrapper, 'collect2', then + updates the '.rpo' files to tell the compiler where to place those + instantiations and rebuild any affected object files. The + link-time overhead is negligible after the first pass, as the + compiler continues to place the instantiations in the same files. + + This is your best option for application code written for the + Borland model, as it just works. Code written for the Cfront model + needs to be modified so that the template definitions are available + at one or more points of instantiation; usually this is as simple + as adding '#include <tmethods.cc>' to the end of each template + header. + + For library code, if you want the library to provide all of the + template instantiations it needs, just try to link all of its + object files together; the link will fail, but cause the + instantiations to be generated as a side effect. Be warned, + however, that this may cause conflicts if multiple libraries try to + provide the same instantiations. For greater control, use explicit + instantiation as described in the next option. + + 2. Compile your code with '-fno-implicit-templates' to disable the + implicit generation of template instances, and explicitly + instantiate all the ones you use. This approach requires more + knowledge of exactly which instances you need than do the others, + but it's less mysterious and allows greater control. You can + scatter the explicit instantiations throughout your program, + perhaps putting them in the translation units where the instances + are used or the translation units that define the templates + themselves; you can put all of the explicit instantiations you need + into one big file; or you can create small files like + + #include "Foo.h" + #include "Foo.cc" + + template class Foo<int>; + template ostream& operator << + (ostream&, const Foo<int>&); + + for each of the instances you need, and create a template + instantiation library from those. + + If you are using Cfront-model code, you can probably get away with + not using '-fno-implicit-templates' when compiling files that don't + '#include' the member template definitions. + + If you use one big file to do the instantiations, you may want to + compile it without '-fno-implicit-templates' so you get all of the + instances required by your explicit instantiations (but not by any + other files) without having to specify them as well. + + The ISO C++ 2011 standard allows forward declaration of explicit + instantiations (with 'extern'). G++ supports explicit + instantiation declarations in C++98 mode and has extended the + template instantiation syntax to support instantiation of the + compiler support data for a template class (i.e. the vtable) + without instantiating any of its members (with 'inline'), and + instantiation of only the static data members of a template class, + without the support data or member functions (with ('static'): + + extern template int max (int, int); + inline template class Foo<int>; + static template class Foo<int>; + + 3. Do nothing. Pretend G++ does implement automatic instantiation + management. Code written for the Borland model works fine, but + each translation unit contains instances of each of the templates + it uses. In a large program, this can lead to an unacceptable + amount of code duplication. + + +File: gcc.info, Node: Bound member functions, Next: C++ Attributes, Prev: Template Instantiation, Up: C++ Extensions + +7.6 Extracting the function pointer from a bound pointer to member function +=========================================================================== + +In C++, pointer to member functions (PMFs) are implemented using a wide +pointer of sorts to handle all the possible call mechanisms; the PMF +needs to store information about how to adjust the 'this' pointer, and +if the function pointed to is virtual, where to find the vtable, and +where in the vtable to look for the member function. If you are using +PMFs in an inner loop, you should really reconsider that decision. If +that is not an option, you can extract the pointer to the function that +would be called for a given object/PMF pair and call it directly inside +the inner loop, to save a bit of time. + + Note that you still pay the penalty for the call through a function +pointer; on most modern architectures, such a call defeats the branch +prediction features of the CPU. This is also true of normal virtual +function calls. + + The syntax for this extension is + + extern A a; + extern int (A::*fp)(); + typedef int (*fptr)(A *); + + fptr p = (fptr)(a.*fp); + + For PMF constants (i.e. expressions of the form '&Klasse::Member'), no +object is needed to obtain the address of the function. They can be +converted to function pointers directly: + + fptr p1 = (fptr)(&A::foo); + + You must specify '-Wno-pmf-conversions' to use this extension. + + +File: gcc.info, Node: C++ Attributes, Next: Function Multiversioning, Prev: Bound member functions, Up: C++ Extensions + +7.7 C++-Specific Variable, Function, and Type Attributes +======================================================== + +Some attributes only make sense for C++ programs. + +'abi_tag ("TAG", ...)' + The 'abi_tag' attribute can be applied to a function or class + declaration. It modifies the mangled name of the function or class + to incorporate the tag name, in order to distinguish the function + or class from an earlier version with a different ABI; perhaps the + class has changed size, or the function has a different return type + that is not encoded in the mangled name. + + The argument can be a list of strings of arbitrary length. The + strings are sorted on output, so the order of the list is + unimportant. + + A redeclaration of a function or class must not add new ABI tags, + since doing so would change the mangled name. + + The ABI tags apply to a name, so all instantiations and + specializations of a template have the same tags. The attribute + will be ignored if applied to an explicit specialization or + instantiation. + + The '-Wabi-tag' flag enables a warning about a class which does not + have all the ABI tags used by its subobjects and virtual functions; + for users with code that needs to coexist with an earlier ABI, + using this option can help to find all affected types that need to + be tagged. + +'init_priority (PRIORITY)' + + In Standard C++, objects defined at namespace scope are guaranteed + to be initialized in an order in strict accordance with that of + their definitions _in a given translation unit_. No guarantee is + made for initializations across translation units. However, GNU + C++ allows users to control the order of initialization of objects + defined at namespace scope with the 'init_priority' attribute by + specifying a relative PRIORITY, a constant integral expression + currently bounded between 101 and 65535 inclusive. Lower numbers + indicate a higher priority. + + In the following example, 'A' would normally be created before 'B', + but the 'init_priority' attribute reverses that order: + + Some_Class A __attribute__ ((init_priority (2000))); + Some_Class B __attribute__ ((init_priority (543))); + + Note that the particular values of PRIORITY do not matter; only + their relative ordering. + +'java_interface' + + This type attribute informs C++ that the class is a Java interface. + It may only be applied to classes declared within an 'extern + "Java"' block. Calls to methods declared in this interface are + dispatched using GCJ's interface table mechanism, instead of + regular virtual table dispatch. + +'warn_unused' + + For C++ types with non-trivial constructors and/or destructors it + is impossible for the compiler to determine whether a variable of + this type is truly unused if it is not referenced. This type + attribute informs the compiler that variables of this type should + be warned about if they appear to be unused, just like variables of + fundamental types. + + This attribute is appropriate for types which just represent a + value, such as 'std::string'; it is not appropriate for types which + control a resource, such as 'std::mutex'. + + This attribute is also accepted in C, but it is unnecessary because + C does not have constructors or destructors. + + See also *note Namespace Association::. + + +File: gcc.info, Node: Function Multiversioning, Next: Namespace Association, Prev: C++ Attributes, Up: C++ Extensions + +7.8 Function Multiversioning +============================ + +With the GNU C++ front end, for target i386, you may specify multiple +versions of a function, where each function is specialized for a +specific target feature. At runtime, the appropriate version of the +function is automatically executed depending on the characteristics of +the execution platform. Here is an example. + + __attribute__ ((target ("default"))) + int foo () + { + // The default version of foo. + return 0; + } + + __attribute__ ((target ("sse4.2"))) + int foo () + { + // foo version for SSE4.2 + return 1; + } + + __attribute__ ((target ("arch=atom"))) + int foo () + { + // foo version for the Intel ATOM processor + return 2; + } + + __attribute__ ((target ("arch=amdfam10"))) + int foo () + { + // foo version for the AMD Family 0x10 processors. + return 3; + } + + int main () + { + int (*p)() = &foo; + assert ((*p) () == foo ()); + return 0; + } + + In the above example, four versions of function foo are created. The +first version of foo with the target attribute "default" is the default +version. This version gets executed when no other target specific +version qualifies for execution on a particular platform. A new version +of foo is created by using the same function signature but with a +different target string. Function foo is called or a pointer to it is +taken just like a regular function. GCC takes care of doing the +dispatching to call the right version at runtime. Refer to the GCC wiki +on Function Multiversioning +(http://gcc.gnu.org/wiki/FunctionMultiVersioning) for more details. + + +File: gcc.info, Node: Namespace Association, Next: Type Traits, Prev: Function Multiversioning, Up: C++ Extensions + +7.9 Namespace Association +========================= + +*Caution:* The semantics of this extension are equivalent to C++ 2011 +inline namespaces. Users should use inline namespaces instead as this +extension will be removed in future versions of G++. + + A using-directive with '__attribute ((strong))' is stronger than a +normal using-directive in two ways: + + * Templates from the used namespace can be specialized and explicitly + instantiated as though they were members of the using namespace. + + * The using namespace is considered an associated namespace of all + templates in the used namespace for purposes of argument-dependent + name lookup. + + The used namespace must be nested within the using namespace so that +normal unqualified lookup works properly. + + This is useful for composing a namespace transparently from +implementation namespaces. For example: + + namespace std { + namespace debug { + template <class T> struct A { }; + } + using namespace debug __attribute ((__strong__)); + template <> struct A<int> { }; // OK to specialize + + template <class T> void f (A<T>); + } + + int main() + { + f (std::A<float>()); // lookup finds std::f + f (std::A<int>()); + } + + +File: gcc.info, Node: Type Traits, Next: Java Exceptions, Prev: Namespace Association, Up: C++ Extensions + +7.10 Type Traits +================ + +The C++ front end implements syntactic extensions that allow +compile-time determination of various characteristics of a type (or of a +pair of types). + +'__has_nothrow_assign (type)' + If 'type' is const qualified or is a reference type then the trait + is false. Otherwise if '__has_trivial_assign (type)' is true then + the trait is true, else if 'type' is a cv class or union type with + copy assignment operators that are known not to throw an exception + then the trait is true, else it is false. Requires: 'type' shall + be a complete type, (possibly cv-qualified) 'void', or an array of + unknown bound. + +'__has_nothrow_copy (type)' + If '__has_trivial_copy (type)' is true then the trait is true, else + if 'type' is a cv class or union type with copy constructors that + are known not to throw an exception then the trait is true, else it + is false. Requires: 'type' shall be a complete type, (possibly + cv-qualified) 'void', or an array of unknown bound. + +'__has_nothrow_constructor (type)' + If '__has_trivial_constructor (type)' is true then the trait is + true, else if 'type' is a cv class or union type (or array thereof) + with a default constructor that is known not to throw an exception + then the trait is true, else it is false. Requires: 'type' shall + be a complete type, (possibly cv-qualified) 'void', or an array of + unknown bound. + +'__has_trivial_assign (type)' + If 'type' is const qualified or is a reference type then the trait + is false. Otherwise if '__is_pod (type)' is true then the trait is + true, else if 'type' is a cv class or union type with a trivial + copy assignment ([class.copy]) then the trait is true, else it is + false. Requires: 'type' shall be a complete type, (possibly + cv-qualified) 'void', or an array of unknown bound. + +'__has_trivial_copy (type)' + If '__is_pod (type)' is true or 'type' is a reference type then the + trait is true, else if 'type' is a cv class or union type with a + trivial copy constructor ([class.copy]) then the trait is true, + else it is false. Requires: 'type' shall be a complete type, + (possibly cv-qualified) 'void', or an array of unknown bound. + +'__has_trivial_constructor (type)' + If '__is_pod (type)' is true then the trait is true, else if 'type' + is a cv class or union type (or array thereof) with a trivial + default constructor ([class.ctor]) then the trait is true, else it + is false. Requires: 'type' shall be a complete type, (possibly + cv-qualified) 'void', or an array of unknown bound. + +'__has_trivial_destructor (type)' + If '__is_pod (type)' is true or 'type' is a reference type then the + trait is true, else if 'type' is a cv class or union type (or array + thereof) with a trivial destructor ([class.dtor]) then the trait is + true, else it is false. Requires: 'type' shall be a complete type, + (possibly cv-qualified) 'void', or an array of unknown bound. + +'__has_virtual_destructor (type)' + If 'type' is a class type with a virtual destructor ([class.dtor]) + then the trait is true, else it is false. Requires: 'type' shall + be a complete type, (possibly cv-qualified) 'void', or an array of + unknown bound. + +'__is_abstract (type)' + If 'type' is an abstract class ([class.abstract]) then the trait is + true, else it is false. Requires: 'type' shall be a complete type, + (possibly cv-qualified) 'void', or an array of unknown bound. + +'__is_base_of (base_type, derived_type)' + If 'base_type' is a base class of 'derived_type' ([class.derived]) + then the trait is true, otherwise it is false. Top-level cv + qualifications of 'base_type' and 'derived_type' are ignored. For + the purposes of this trait, a class type is considered is own base. + Requires: if '__is_class (base_type)' and '__is_class + (derived_type)' are true and 'base_type' and 'derived_type' are not + the same type (disregarding cv-qualifiers), 'derived_type' shall be + a complete type. Diagnostic is produced if this requirement is not + met. + +'__is_class (type)' + If 'type' is a cv class type, and not a union type + ([basic.compound]) the trait is true, else it is false. + +'__is_empty (type)' + If '__is_class (type)' is false then the trait is false. Otherwise + 'type' is considered empty if and only if: 'type' has no non-static + data members, or all non-static data members, if any, are + bit-fields of length 0, and 'type' has no virtual members, and + 'type' has no virtual base classes, and 'type' has no base classes + 'base_type' for which '__is_empty (base_type)' is false. Requires: + 'type' shall be a complete type, (possibly cv-qualified) 'void', or + an array of unknown bound. + +'__is_enum (type)' + If 'type' is a cv enumeration type ([basic.compound]) the trait is + true, else it is false. + +'__is_literal_type (type)' + If 'type' is a literal type ([basic.types]) the trait is true, else + it is false. Requires: 'type' shall be a complete type, (possibly + cv-qualified) 'void', or an array of unknown bound. + +'__is_pod (type)' + If 'type' is a cv POD type ([basic.types]) then the trait is true, + else it is false. Requires: 'type' shall be a complete type, + (possibly cv-qualified) 'void', or an array of unknown bound. + +'__is_polymorphic (type)' + If 'type' is a polymorphic class ([class.virtual]) then the trait + is true, else it is false. Requires: 'type' shall be a complete + type, (possibly cv-qualified) 'void', or an array of unknown bound. + +'__is_standard_layout (type)' + If 'type' is a standard-layout type ([basic.types]) the trait is + true, else it is false. Requires: 'type' shall be a complete type, + (possibly cv-qualified) 'void', or an array of unknown bound. + +'__is_trivial (type)' + If 'type' is a trivial type ([basic.types]) the trait is true, else + it is false. Requires: 'type' shall be a complete type, (possibly + cv-qualified) 'void', or an array of unknown bound. + +'__is_union (type)' + If 'type' is a cv union type ([basic.compound]) the trait is true, + else it is false. + +'__underlying_type (type)' + The underlying type of 'type'. Requires: 'type' shall be an + enumeration type ([dcl.enum]). + + +File: gcc.info, Node: Java Exceptions, Next: Deprecated Features, Prev: Type Traits, Up: C++ Extensions + +7.11 Java Exceptions +==================== + +The Java language uses a slightly different exception handling model +from C++. Normally, GNU C++ automatically detects when you are writing +C++ code that uses Java exceptions, and handle them appropriately. +However, if C++ code only needs to execute destructors when Java +exceptions are thrown through it, GCC guesses incorrectly. Sample +problematic code is: + + struct S { ~S(); }; + extern void bar(); // is written in Java, and may throw exceptions + void foo() + { + S s; + bar(); + } + +The usual effect of an incorrect guess is a link failure, complaining of +a missing routine called '__gxx_personality_v0'. + + You can inform the compiler that Java exceptions are to be used in a +translation unit, irrespective of what it might think, by writing +'#pragma GCC java_exceptions' at the head of the file. This '#pragma' +must appear before any functions that throw or catch exceptions, or run +destructors when exceptions are thrown through them. + + You cannot mix Java and C++ exceptions in the same translation unit. +It is believed to be safe to throw a C++ exception from one file through +another file compiled for the Java exception model, or vice versa, but +there may be bugs in this area. + + +File: gcc.info, Node: Deprecated Features, Next: Backwards Compatibility, Prev: Java Exceptions, Up: C++ Extensions + +7.12 Deprecated Features +======================== + +In the past, the GNU C++ compiler was extended to experiment with new +features, at a time when the C++ language was still evolving. Now that +the C++ standard is complete, some of those features are superseded by +superior alternatives. Using the old features might cause a warning in +some cases that the feature will be dropped in the future. In other +cases, the feature might be gone already. + + While the list below is not exhaustive, it documents some of the +options that are now deprecated: + +'-fexternal-templates' +'-falt-external-templates' + These are two of the many ways for G++ to implement template + instantiation. *Note Template Instantiation::. The C++ standard + clearly defines how template definitions have to be organized + across implementation units. G++ has an implicit instantiation + mechanism that should work just fine for standard-conforming code. + +'-fstrict-prototype' +'-fno-strict-prototype' + Previously it was possible to use an empty prototype parameter list + to indicate an unspecified number of parameters (like C), rather + than no parameters, as C++ demands. This feature has been removed, + except where it is required for backwards compatibility. *Note + Backwards Compatibility::. + + G++ allows a virtual function returning 'void *' to be overridden by +one returning a different pointer type. This extension to the covariant +return type rules is now deprecated and will be removed from a future +version. + + The G++ minimum and maximum operators ('<?' and '>?') and their +compound forms ('<?=') and '>?=') have been deprecated and are now +removed from G++. Code using these operators should be modified to use +'std::min' and 'std::max' instead. + + The named return value extension has been deprecated, and is now +removed from G++. + + The use of initializer lists with new expressions has been deprecated, +and is now removed from G++. + + Floating and complex non-type template parameters have been deprecated, +and are now removed from G++. + + The implicit typename extension has been deprecated and is now removed +from G++. + + The use of default arguments in function pointers, function typedefs +and other places where they are not permitted by the standard is +deprecated and will be removed from a future version of G++. + + G++ allows floating-point literals to appear in integral constant +expressions, e.g. ' enum E { e = int(2.2 * 3.7) } ' This extension is +deprecated and will be removed from a future version. + + G++ allows static data members of const floating-point type to be +declared with an initializer in a class definition. The standard only +allows initializers for static members of const integral types and const +enumeration types so this extension has been deprecated and will be +removed from a future version. + + +File: gcc.info, Node: Backwards Compatibility, Prev: Deprecated Features, Up: C++ Extensions + +7.13 Backwards Compatibility +============================ + +Now that there is a definitive ISO standard C++, G++ has a specification +to adhere to. The C++ language evolved over time, and features that +used to be acceptable in previous drafts of the standard, such as the +ARM [Annotated C++ Reference Manual], are no longer accepted. In order +to allow compilation of C++ written to such drafts, G++ contains some +backwards compatibilities. _All such backwards compatibility features +are liable to disappear in future versions of G++._ They should be +considered deprecated. *Note Deprecated Features::. + +'For scope' + If a variable is declared at for scope, it used to remain in scope + until the end of the scope that contained the for statement (rather + than just within the for scope). G++ retains this, but issues a + warning, if such a variable is accessed outside the for scope. + +'Implicit C language' + Old C system header files did not contain an 'extern "C" {...}' + scope to set the language. On such systems, all header files are + implicitly scoped inside a C language scope. Also, an empty + prototype '()' is treated as an unspecified number of arguments, + rather than no arguments, as C++ demands. + + +File: gcc.info, Node: Objective-C, Next: Compatibility, Prev: C++ Extensions, Up: Top + +8 GNU Objective-C features +************************** + +This document is meant to describe some of the GNU Objective-C features. +It is not intended to teach you Objective-C. There are several resources +on the Internet that present the language. + +* Menu: + +* GNU Objective-C runtime API:: +* Executing code before main:: +* Type encoding:: +* Garbage Collection:: +* Constant string objects:: +* compatibility_alias:: +* Exceptions:: +* Synchronization:: +* Fast enumeration:: +* Messaging with the GNU Objective-C runtime:: + + +File: gcc.info, Node: GNU Objective-C runtime API, Next: Executing code before main, Up: Objective-C + +8.1 GNU Objective-C runtime API +=============================== + +This section is specific for the GNU Objective-C runtime. If you are +using a different runtime, you can skip it. + + The GNU Objective-C runtime provides an API that allows you to interact +with the Objective-C runtime system, querying the live runtime +structures and even manipulating them. This allows you for example to +inspect and navigate classes, methods and protocols; to define new +classes or new methods, and even to modify existing classes or +protocols. + + If you are using a "Foundation" library such as GNUstep-Base, this +library will provide you with a rich set of functionality to do most of +the inspection tasks, and you probably will only need direct access to +the GNU Objective-C runtime API to define new classes or methods. + +* Menu: + +* Modern GNU Objective-C runtime API:: +* Traditional GNU Objective-C runtime API:: + + +File: gcc.info, Node: Modern GNU Objective-C runtime API, Next: Traditional GNU Objective-C runtime API, Up: GNU Objective-C runtime API + +8.1.1 Modern GNU Objective-C runtime API +---------------------------------------- + +The GNU Objective-C runtime provides an API which is similar to the one +provided by the "Objective-C 2.0" Apple/NeXT Objective-C runtime. The +API is documented in the public header files of the GNU Objective-C +runtime: + + * 'objc/objc.h': this is the basic Objective-C header file, defining + the basic Objective-C types such as 'id', 'Class' and 'BOOL'. You + have to include this header to do almost anything with Objective-C. + + * 'objc/runtime.h': this header declares most of the public runtime + API functions allowing you to inspect and manipulate the + Objective-C runtime data structures. These functions are fairly + standardized across Objective-C runtimes and are almost identical + to the Apple/NeXT Objective-C runtime ones. It does not declare + functions in some specialized areas (constructing and forwarding + message invocations, threading) which are in the other headers + below. You have to include 'objc/objc.h' and 'objc/runtime.h' to + use any of the functions, such as 'class_getName()', declared in + 'objc/runtime.h'. + + * 'objc/message.h': this header declares public functions used to + construct, deconstruct and forward message invocations. Because + messaging is done in quite a different way on different runtimes, + functions in this header are specific to the GNU Objective-C + runtime implementation. + + * 'objc/objc-exception.h': this header declares some public functions + related to Objective-C exceptions. For example functions in this + header allow you to throw an Objective-C exception from plain C/C++ + code. + + * 'objc/objc-sync.h': this header declares some public functions + related to the Objective-C '@synchronized()' syntax, allowing you + to emulate an Objective-C '@synchronized()' block in plain C/C++ + code. + + * 'objc/thr.h': this header declares a public runtime API threading + layer that is only provided by the GNU Objective-C runtime. It + declares functions such as 'objc_mutex_lock()', which provide a + platform-independent set of threading functions. + + The header files contain detailed documentation for each function in +the GNU Objective-C runtime API. + + +File: gcc.info, Node: Traditional GNU Objective-C runtime API, Prev: Modern GNU Objective-C runtime API, Up: GNU Objective-C runtime API + +8.1.2 Traditional GNU Objective-C runtime API +--------------------------------------------- + +The GNU Objective-C runtime used to provide a different API, which we +call the "traditional" GNU Objective-C runtime API. Functions belonging +to this API are easy to recognize because they use a different naming +convention, such as 'class_get_super_class()' (traditional API) instead +of 'class_getSuperclass()' (modern API). Software using this API +includes the file 'objc/objc-api.h' where it is declared. + + Starting with GCC 4.7.0, the traditional GNU runtime API is no longer +available. + + +File: gcc.info, Node: Executing code before main, Next: Type encoding, Prev: GNU Objective-C runtime API, Up: Objective-C + +8.2 '+load': Executing code before main +======================================= + +This section is specific for the GNU Objective-C runtime. If you are +using a different runtime, you can skip it. + + The GNU Objective-C runtime provides a way that allows you to execute +code before the execution of the program enters the 'main' function. +The code is executed on a per-class and a per-category basis, through a +special class method '+load'. + + This facility is very useful if you want to initialize global variables +which can be accessed by the program directly, without sending a message +to the class first. The usual way to initialize global variables, in +the '+initialize' method, might not be useful because '+initialize' is +only called when the first message is sent to a class object, which in +some cases could be too late. + + Suppose for example you have a 'FileStream' class that declares +'Stdin', 'Stdout' and 'Stderr' as global variables, like below: + + + FileStream *Stdin = nil; + FileStream *Stdout = nil; + FileStream *Stderr = nil; + + @implementation FileStream + + + (void)initialize + { + Stdin = [[FileStream new] initWithFd:0]; + Stdout = [[FileStream new] initWithFd:1]; + Stderr = [[FileStream new] initWithFd:2]; + } + + /* Other methods here */ + @end + + In this example, the initialization of 'Stdin', 'Stdout' and 'Stderr' +in '+initialize' occurs too late. The programmer can send a message to +one of these objects before the variables are actually initialized, thus +sending messages to the 'nil' object. The '+initialize' method which +actually initializes the global variables is not invoked until the first +message is sent to the class object. The solution would require these +variables to be initialized just before entering 'main'. + + The correct solution of the above problem is to use the '+load' method +instead of '+initialize': + + + @implementation FileStream + + + (void)load + { + Stdin = [[FileStream new] initWithFd:0]; + Stdout = [[FileStream new] initWithFd:1]; + Stderr = [[FileStream new] initWithFd:2]; + } + + /* Other methods here */ + @end + + The '+load' is a method that is not overridden by categories. If a +class and a category of it both implement '+load', both methods are +invoked. This allows some additional initializations to be performed in +a category. + + This mechanism is not intended to be a replacement for '+initialize'. +You should be aware of its limitations when you decide to use it instead +of '+initialize'. + +* Menu: + +* What you can and what you cannot do in +load:: + + +File: gcc.info, Node: What you can and what you cannot do in +load, Up: Executing code before main + +8.2.1 What you can and what you cannot do in '+load' +---------------------------------------------------- + +'+load' is to be used only as a last resort. Because it is executed +very early, most of the Objective-C runtime machinery will not be ready +when '+load' is executed; hence '+load' works best for executing C code +that is independent on the Objective-C runtime. + + The '+load' implementation in the GNU runtime guarantees you the +following things: + + * you can write whatever C code you like; + + * you can allocate and send messages to objects whose class is + implemented in the same file; + + * the '+load' implementation of all super classes of a class are + executed before the '+load' of that class is executed; + + * the '+load' implementation of a class is executed before the + '+load' implementation of any category. + + In particular, the following things, even if they can work in a +particular case, are not guaranteed: + + * allocation of or sending messages to arbitrary objects; + + * allocation of or sending messages to objects whose classes have a + category implemented in the same file; + + * sending messages to Objective-C constant strings ('@"this is a + constant string"'); + + You should make no assumptions about receiving '+load' in sibling +classes when you write '+load' of a class. The order in which sibling +classes receive '+load' is not guaranteed. + + The order in which '+load' and '+initialize' are called could be +problematic if this matters. If you don't allocate objects inside +'+load', it is guaranteed that '+load' is called before '+initialize'. +If you create an object inside '+load' the '+initialize' method of +object's class is invoked even if '+load' was not invoked. Note if you +explicitly call '+load' on a class, '+initialize' will be called first. +To avoid possible problems try to implement only one of these methods. + + The '+load' method is also invoked when a bundle is dynamically loaded +into your running program. This happens automatically without any +intervening operation from you. When you write bundles and you need to +write '+load' you can safely create and send messages to objects whose +classes already exist in the running program. The same restrictions as +above apply to classes defined in bundle. + + +File: gcc.info, Node: Type encoding, Next: Garbage Collection, Prev: Executing code before main, Up: Objective-C + +8.3 Type encoding +================= + +This is an advanced section. Type encodings are used extensively by the +compiler and by the runtime, but you generally do not need to know about +them to use Objective-C. + + The Objective-C compiler generates type encodings for all the types. +These type encodings are used at runtime to find out information about +selectors and methods and about objects and classes. + + The types are encoded in the following way: + +'_Bool' 'B' +'char' 'c' +'unsigned char' 'C' +'short' 's' +'unsigned short' 'S' +'int' 'i' +'unsigned int' 'I' +'long' 'l' +'unsigned long' 'L' +'long long' 'q' +'unsigned long 'Q' +long' +'float' 'f' +'double' 'd' +'long double' 'D' +'void' 'v' +'id' '@' +'Class' '#' +'SEL' ':' +'char*' '*' +'enum' an 'enum' is encoded exactly as the integer type + that the compiler uses for it, which depends on the + enumeration values. Often the compiler users + 'unsigned int', which is then encoded as 'I'. +unknown type '?' +Complex types 'j' followed by the inner type. For example + '_Complex double' is encoded as "jd". +bit-fields 'b' followed by the starting position of the + bit-field, the type of the bit-field and the size of + the bit-field (the bit-fields encoding was changed + from the NeXT's compiler encoding, see below) + + The encoding of bit-fields has changed to allow bit-fields to be +properly handled by the runtime functions that compute sizes and +alignments of types that contain bit-fields. The previous encoding +contained only the size of the bit-field. Using only this information +it is not possible to reliably compute the size occupied by the +bit-field. This is very important in the presence of the Boehm's +garbage collector because the objects are allocated using the typed +memory facility available in this collector. The typed memory +allocation requires information about where the pointers are located +inside the object. + + The position in the bit-field is the position, counting in bits, of the +bit closest to the beginning of the structure. + + The non-atomic types are encoded as follows: + +pointers '^' followed by the pointed type. +arrays '[' followed by the number of elements in the array + followed by the type of the elements followed by ']' +structures '{' followed by the name of the structure (or '?' if the + structure is unnamed), the '=' sign, the type of the + members and by '}' +unions '(' followed by the name of the structure (or '?' if the + union is unnamed), the '=' sign, the type of the members + followed by ')' +vectors '![' followed by the vector_size (the number of bytes + composing the vector) followed by a comma, followed by + the alignment (in bytes) of the vector, followed by the + type of the elements followed by ']' + + Here are some types and their encodings, as they are generated by the +compiler on an i386 machine: + + +Objective-C type Compiler encoding + int a[10]; '[10i]' + struct { '{?=i[3f]b128i3b131i2c}' + int i; + float f[3]; + int a:3; + int b:2; + char c; + } + int a __attribute__ ((vector_size (16)));'![16,16i]' (alignment would depend on the machine) + + + In addition to the types the compiler also encodes the type specifiers. +The table below describes the encoding of the current Objective-C type +specifiers: + + +Specifier Encoding +'const' 'r' +'in' 'n' +'inout' 'N' +'out' 'o' +'bycopy' 'O' +'byref' 'R' +'oneway' 'V' + + + The type specifiers are encoded just before the type. Unlike types +however, the type specifiers are only encoded when they appear in method +argument types. + + Note how 'const' interacts with pointers: + + +Objective-C type Compiler encoding + const int 'ri' + const int* '^ri' + int *const 'r^i' + + + 'const int*' is a pointer to a 'const int', and so is encoded as '^ri'. +'int* const', instead, is a 'const' pointer to an 'int', and so is +encoded as 'r^i'. + + Finally, there is a complication when encoding 'const char *' versus +'char * const'. Because 'char *' is encoded as '*' and not as '^c', +there is no way to express the fact that 'r' applies to the pointer or +to the pointee. + + Hence, it is assumed as a convention that 'r*' means 'const char *' +(since it is what is most often meant), and there is no way to encode +'char *const'. 'char *const' would simply be encoded as '*', and the +'const' is lost. + +* Menu: + +* Legacy type encoding:: +* @encode:: +* Method signatures:: + + +File: gcc.info, Node: Legacy type encoding, Next: @encode, Up: Type encoding + +8.3.1 Legacy type encoding +-------------------------- + +Unfortunately, historically GCC used to have a number of bugs in its +encoding code. The NeXT runtime expects GCC to emit type encodings in +this historical format (compatible with GCC-3.3), so when using the NeXT +runtime, GCC will introduce on purpose a number of incorrect encodings: + + * the read-only qualifier of the pointee gets emitted before the '^'. + The read-only qualifier of the pointer itself gets ignored, unless + it is a typedef. Also, the 'r' is only emitted for the outermost + type. + + * 32-bit longs are encoded as 'l' or 'L', but not always. For + typedefs, the compiler uses 'i' or 'I' instead if encoding a struct + field or a pointer. + + * 'enum's are always encoded as 'i' (int) even if they are actually + unsigned or long. + + In addition to that, the NeXT runtime uses a different encoding for +bitfields. It encodes them as 'b' followed by the size, without a bit +offset or the underlying field type. + + +File: gcc.info, Node: @encode, Next: Method signatures, Prev: Legacy type encoding, Up: Type encoding + +8.3.2 @encode +------------- + +GNU Objective-C supports the '@encode' syntax that allows you to create +a type encoding from a C/Objective-C type. For example, '@encode(int)' +is compiled by the compiler into '"i"'. + + '@encode' does not support type qualifiers other than 'const'. For +example, '@encode(const char*)' is valid and is compiled into '"r*"', +while '@encode(bycopy char *)' is invalid and will cause a compilation +error. + + +File: gcc.info, Node: Method signatures, Prev: @encode, Up: Type encoding + +8.3.3 Method signatures +----------------------- + +This section documents the encoding of method types, which is rarely +needed to use Objective-C. You should skip it at a first reading; the +runtime provides functions that will work on methods and can walk +through the list of parameters and interpret them for you. These +functions are part of the public "API" and are the preferred way to +interact with method signatures from user code. + + But if you need to debug a problem with method signatures and need to +know how they are implemented (i.e., the "ABI"), read on. + + Methods have their "signature" encoded and made available to the +runtime. The "signature" encodes all the information required to +dynamically build invocations of the method at runtime: return type and +arguments. + + The "signature" is a null-terminated string, composed of the following: + + * The return type, including type qualifiers. For example, a method + returning 'int' would have 'i' here. + + * The total size (in bytes) required to pass all the parameters. + This includes the two hidden parameters (the object 'self' and the + method selector '_cmd'). + + * Each argument, with the type encoding, followed by the offset (in + bytes) of the argument in the list of parameters. + + For example, a method with no arguments and returning 'int' would have +the signature 'i8@0:4' if the size of a pointer is 4. The signature is +interpreted as follows: the 'i' is the return type (an 'int'), the '8' +is the total size of the parameters in bytes (two pointers each of size +4), the '@0' is the first parameter (an object at byte offset '0') and +':4' is the second parameter (a 'SEL' at byte offset '4'). + + You can easily find more examples by running the "strings" program on +an Objective-C object file compiled by GCC. You'll see a lot of strings +that look very much like 'i8@0:4'. They are signatures of Objective-C +methods. + + +File: gcc.info, Node: Garbage Collection, Next: Constant string objects, Prev: Type encoding, Up: Objective-C + +8.4 Garbage Collection +====================== + +This section is specific for the GNU Objective-C runtime. If you are +using a different runtime, you can skip it. + + Support for garbage collection with the GNU runtime has been added by +using a powerful conservative garbage collector, known as the +Boehm-Demers-Weiser conservative garbage collector. + + To enable the support for it you have to configure the compiler using +an additional argument, '--enable-objc-gc'. This will build the +boehm-gc library, and build an additional runtime library which has +several enhancements to support the garbage collector. The new library +has a new name, 'libobjc_gc.a' to not conflict with the +non-garbage-collected library. + + When the garbage collector is used, the objects are allocated using the +so-called typed memory allocation mechanism available in the +Boehm-Demers-Weiser collector. This mode requires precise information +on where pointers are located inside objects. This information is +computed once per class, immediately after the class has been +initialized. + + There is a new runtime function 'class_ivar_set_gcinvisible()' which +can be used to declare a so-called "weak pointer" reference. Such a +pointer is basically hidden for the garbage collector; this can be +useful in certain situations, especially when you want to keep track of +the allocated objects, yet allow them to be collected. This kind of +pointers can only be members of objects, you cannot declare a global +pointer as a weak reference. Every type which is a pointer type can be +declared a weak pointer, including 'id', 'Class' and 'SEL'. + + Here is an example of how to use this feature. Suppose you want to +implement a class whose instances hold a weak pointer reference; the +following class does this: + + + @interface WeakPointer : Object + { + const void* weakPointer; + } + + - initWithPointer:(const void*)p; + - (const void*)weakPointer; + @end + + + @implementation WeakPointer + + + (void)initialize + { + if (self == objc_lookUpClass ("WeakPointer")) + class_ivar_set_gcinvisible (self, "weakPointer", YES); + } + + - initWithPointer:(const void*)p + { + weakPointer = p; + return self; + } + + - (const void*)weakPointer + { + return weakPointer; + } + + @end + + Weak pointers are supported through a new type character specifier +represented by the '!' character. The 'class_ivar_set_gcinvisible()' +function adds or removes this specifier to the string type description +of the instance variable named as argument. + + +File: gcc.info, Node: Constant string objects, Next: compatibility_alias, Prev: Garbage Collection, Up: Objective-C + +8.5 Constant string objects +=========================== + +GNU Objective-C provides constant string objects that are generated +directly by the compiler. You declare a constant string object by +prefixing a C constant string with the character '@': + + id myString = @"this is a constant string object"; + + The constant string objects are by default instances of the +'NXConstantString' class which is provided by the GNU Objective-C +runtime. To get the definition of this class you must include the +'objc/NXConstStr.h' header file. + + User defined libraries may want to implement their own constant string +class. To be able to support them, the GNU Objective-C compiler +provides a new command line options +'-fconstant-string-class=CLASS-NAME'. The provided class should adhere +to a strict structure, the same as 'NXConstantString''s structure: + + + @interface MyConstantStringClass + { + Class isa; + char *c_string; + unsigned int len; + } + @end + + 'NXConstantString' inherits from 'Object'; user class libraries may +choose to inherit the customized constant string class from a different +class than 'Object'. There is no requirement in the methods the +constant string class has to implement, but the final ivar layout of the +class must be the compatible with the given structure. + + When the compiler creates the statically allocated constant string +object, the 'c_string' field will be filled by the compiler with the +string; the 'length' field will be filled by the compiler with the +string length; the 'isa' pointer will be filled with 'NULL' by the +compiler, and it will later be fixed up automatically at runtime by the +GNU Objective-C runtime library to point to the class which was set by +the '-fconstant-string-class' option when the object file is loaded (if +you wonder how it works behind the scenes, the name of the class to use, +and the list of static objects to fixup, are stored by the compiler in +the object file in a place where the GNU runtime library will find them +at runtime). + + As a result, when a file is compiled with the '-fconstant-string-class' +option, all the constant string objects will be instances of the class +specified as argument to this option. It is possible to have multiple +compilation units referring to different constant string classes, +neither the compiler nor the linker impose any restrictions in doing +this. + + +File: gcc.info, Node: compatibility_alias, Next: Exceptions, Prev: Constant string objects, Up: Objective-C + +8.6 compatibility_alias +======================= + +The keyword '@compatibility_alias' allows you to define a class name as +equivalent to another class name. For example: + + @compatibility_alias WOApplication GSWApplication; + + tells the compiler that each time it encounters 'WOApplication' as a +class name, it should replace it with 'GSWApplication' (that is, +'WOApplication' is just an alias for 'GSWApplication'). + + There are some constraints on how this can be used-- + + * 'WOApplication' (the alias) must not be an existing class; + + * 'GSWApplication' (the real class) must be an existing class. + + +File: gcc.info, Node: Exceptions, Next: Synchronization, Prev: compatibility_alias, Up: Objective-C + +8.7 Exceptions +============== + +GNU Objective-C provides exception support built into the language, as +in the following example: + + @try { + ... + @throw expr; + ... + } + @catch (AnObjCClass *exc) { + ... + @throw expr; + ... + @throw; + ... + } + @catch (AnotherClass *exc) { + ... + } + @catch (id allOthers) { + ... + } + @finally { + ... + @throw expr; + ... + } + + The '@throw' statement may appear anywhere in an Objective-C or +Objective-C++ program; when used inside of a '@catch' block, the +'@throw' may appear without an argument (as shown above), in which case +the object caught by the '@catch' will be rethrown. + + Note that only (pointers to) Objective-C objects may be thrown and +caught using this scheme. When an object is thrown, it will be caught +by the nearest '@catch' clause capable of handling objects of that type, +analogously to how 'catch' blocks work in C++ and Java. A '@catch(id +...)' clause (as shown above) may also be provided to catch any and all +Objective-C exceptions not caught by previous '@catch' clauses (if any). + + The '@finally' clause, if present, will be executed upon exit from the +immediately preceding '@try ... @catch' section. This will happen +regardless of whether any exceptions are thrown, caught or rethrown +inside the '@try ... @catch' section, analogously to the behavior of the +'finally' clause in Java. + + There are several caveats to using the new exception mechanism: + + * The '-fobjc-exceptions' command line option must be used when + compiling Objective-C files that use exceptions. + + * With the GNU runtime, exceptions are always implemented as "native" + exceptions and it is recommended that the '-fexceptions' and + '-shared-libgcc' options are used when linking. + + * With the NeXT runtime, although currently designed to be binary + compatible with 'NS_HANDLER'-style idioms provided by the + 'NSException' class, the new exceptions can only be used on Mac OS + X 10.3 (Panther) and later systems, due to additional functionality + needed in the NeXT Objective-C runtime. + + * As mentioned above, the new exceptions do not support handling + types other than Objective-C objects. Furthermore, when used from + Objective-C++, the Objective-C exception model does not + interoperate with C++ exceptions at this time. This means you + cannot '@throw' an exception from Objective-C and 'catch' it in + C++, or vice versa (i.e., 'throw ... @catch'). + + +File: gcc.info, Node: Synchronization, Next: Fast enumeration, Prev: Exceptions, Up: Objective-C + +8.8 Synchronization +=================== + +GNU Objective-C provides support for synchronized blocks: + + @synchronized (ObjCClass *guard) { + ... + } + + Upon entering the '@synchronized' block, a thread of execution shall +first check whether a lock has been placed on the corresponding 'guard' +object by another thread. If it has, the current thread shall wait +until the other thread relinquishes its lock. Once 'guard' becomes +available, the current thread will place its own lock on it, execute the +code contained in the '@synchronized' block, and finally relinquish the +lock (thereby making 'guard' available to other threads). + + Unlike Java, Objective-C does not allow for entire methods to be marked +'@synchronized'. Note that throwing exceptions out of '@synchronized' +blocks is allowed, and will cause the guarding object to be unlocked +properly. + + Because of the interactions between synchronization and exception +handling, you can only use '@synchronized' when compiling with +exceptions enabled, that is with the command line option +'-fobjc-exceptions'. + + +File: gcc.info, Node: Fast enumeration, Next: Messaging with the GNU Objective-C runtime, Prev: Synchronization, Up: Objective-C + +8.9 Fast enumeration +==================== + +* Menu: + +* Using fast enumeration:: +* c99-like fast enumeration syntax:: +* Fast enumeration details:: +* Fast enumeration protocol:: + + +File: gcc.info, Node: Using fast enumeration, Next: c99-like fast enumeration syntax, Up: Fast enumeration + +8.9.1 Using fast enumeration +---------------------------- + +GNU Objective-C provides support for the fast enumeration syntax: + + id array = ...; + id object; + + for (object in array) + { + /* Do something with 'object' */ + } + + 'array' needs to be an Objective-C object (usually a collection object, +for example an array, a dictionary or a set) which implements the "Fast +Enumeration Protocol" (see below). If you are using a Foundation +library such as GNUstep Base or Apple Cocoa Foundation, all collection +objects in the library implement this protocol and can be used in this +way. + + The code above would iterate over all objects in 'array'. For each of +them, it assigns it to 'object', then executes the 'Do something with +'object'' statements. + + Here is a fully worked-out example using a Foundation library (which +provides the implementation of 'NSArray', 'NSString' and 'NSLog'): + + NSArray *array = [NSArray arrayWithObjects: @"1", @"2", @"3", nil]; + NSString *object; + + for (object in array) + NSLog (@"Iterating over %@", object); + + +File: gcc.info, Node: c99-like fast enumeration syntax, Next: Fast enumeration details, Prev: Using fast enumeration, Up: Fast enumeration + +8.9.2 c99-like fast enumeration syntax +-------------------------------------- + +A c99-like declaration syntax is also allowed: + + id array = ...; + + for (id object in array) + { + /* Do something with 'object' */ + } + + this is completely equivalent to: + + id array = ...; + + { + id object; + for (object in array) + { + /* Do something with 'object' */ + } + } + + but can save some typing. + + Note that the option '-std=c99' is not required to allow this syntax in +Objective-C. + + +File: gcc.info, Node: Fast enumeration details, Next: Fast enumeration protocol, Prev: c99-like fast enumeration syntax, Up: Fast enumeration + +8.9.3 Fast enumeration details +------------------------------ + +Here is a more technical description with the gory details. Consider +the code + + for (OBJECT EXPRESSION in COLLECTION EXPRESSION) + { + STATEMENTS + } + + here is what happens when you run it: + + * 'COLLECTION EXPRESSION' is evaluated exactly once and the result is + used as the collection object to iterate over. This means it is + safe to write code such as 'for (object in [NSDictionary + keyEnumerator]) ...'. + + * the iteration is implemented by the compiler by repeatedly getting + batches of objects from the collection object using the fast + enumeration protocol (see below), then iterating over all objects + in the batch. This is faster than a normal enumeration where + objects are retrieved one by one (hence the name "fast + enumeration"). + + * if there are no objects in the collection, then 'OBJECT EXPRESSION' + is set to 'nil' and the loop immediately terminates. + + * if there are objects in the collection, then for each object in the + collection (in the order they are returned) 'OBJECT EXPRESSION' is + set to the object, then 'STATEMENTS' are executed. + + * 'STATEMENTS' can contain 'break' and 'continue' commands, which + will abort the iteration or skip to the next loop iteration as + expected. + + * when the iteration ends because there are no more objects to + iterate over, 'OBJECT EXPRESSION' is set to 'nil'. This allows you + to determine whether the iteration finished because a 'break' + command was used (in which case 'OBJECT EXPRESSION' will remain set + to the last object that was iterated over) or because it iterated + over all the objects (in which case 'OBJECT EXPRESSION' will be set + to 'nil'). + + * 'STATEMENTS' must not make any changes to the collection object; if + they do, it is a hard error and the fast enumeration terminates by + invoking 'objc_enumerationMutation', a runtime function that + normally aborts the program but which can be customized by + Foundation libraries via 'objc_set_mutation_handler' to do + something different, such as raising an exception. + + +File: gcc.info, Node: Fast enumeration protocol, Prev: Fast enumeration details, Up: Fast enumeration + +8.9.4 Fast enumeration protocol +------------------------------- + +If you want your own collection object to be usable with fast +enumeration, you need to have it implement the method + + - (unsigned long) countByEnumeratingWithState: (NSFastEnumerationState *)state + objects: (id *)objects + count: (unsigned long)len; + + where 'NSFastEnumerationState' must be defined in your code as follows: + + typedef struct + { + unsigned long state; + id *itemsPtr; + unsigned long *mutationsPtr; + unsigned long extra[5]; + } NSFastEnumerationState; + + If no 'NSFastEnumerationState' is defined in your code, the compiler +will automatically replace 'NSFastEnumerationState *' with 'struct +__objcFastEnumerationState *', where that type is silently defined by +the compiler in an identical way. This can be confusing and we +recommend that you define 'NSFastEnumerationState' (as shown above) +instead. + + The method is called repeatedly during a fast enumeration to retrieve +batches of objects. Each invocation of the method should retrieve the +next batch of objects. + + The return value of the method is the number of objects in the current +batch; this should not exceed 'len', which is the maximum size of a +batch as requested by the caller. The batch itself is returned in the +'itemsPtr' field of the 'NSFastEnumerationState' struct. + + To help with returning the objects, the 'objects' array is a C array +preallocated by the caller (on the stack) of size 'len'. In many cases +you can put the objects you want to return in that 'objects' array, then +do 'itemsPtr = objects'. But you don't have to; if your collection +already has the objects to return in some form of C array, it could +return them from there instead. + + The 'state' and 'extra' fields of the 'NSFastEnumerationState' +structure allows your collection object to keep track of the state of +the enumeration. In a simple array implementation, 'state' may keep +track of the index of the last object that was returned, and 'extra' may +be unused. + + The 'mutationsPtr' field of the 'NSFastEnumerationState' is used to +keep track of mutations. It should point to a number; before working on +each object, the fast enumeration loop will check that this number has +not changed. If it has, a mutation has happened and the fast +enumeration will abort. So, 'mutationsPtr' could be set to point to +some sort of version number of your collection, which is increased by +one every time there is a change (for example when an object is added or +removed). Or, if you are content with less strict mutation checks, it +could point to the number of objects in your collection or some other +value that can be checked to perform an approximate check that the +collection has not been mutated. + + Finally, note how we declared the 'len' argument and the return value +to be of type 'unsigned long'. They could also be declared to be of +type 'unsigned int' and everything would still work. + + +File: gcc.info, Node: Messaging with the GNU Objective-C runtime, Prev: Fast enumeration, Up: Objective-C + +8.10 Messaging with the GNU Objective-C runtime +=============================================== + +This section is specific for the GNU Objective-C runtime. If you are +using a different runtime, you can skip it. + + The implementation of messaging in the GNU Objective-C runtime is +designed to be portable, and so is based on standard C. + + Sending a message in the GNU Objective-C runtime is composed of two +separate steps. First, there is a call to the lookup function, +'objc_msg_lookup ()' (or, in the case of messages to super, +'objc_msg_lookup_super ()'). This runtime function takes as argument +the receiver and the selector of the method to be called; it returns the +'IMP', that is a pointer to the function implementing the method. The +second step of method invocation consists of casting this pointer +function to the appropriate function pointer type, and calling the +function pointed to it with the right arguments. + + For example, when the compiler encounters a method invocation such as +'[object init]', it compiles it into a call to 'objc_msg_lookup (object, +@selector(init))' followed by a cast of the returned value to the +appropriate function pointer type, and then it calls it. + +* Menu: + +* Dynamically registering methods:: +* Forwarding hook:: + + +File: gcc.info, Node: Dynamically registering methods, Next: Forwarding hook, Up: Messaging with the GNU Objective-C runtime + +8.10.1 Dynamically registering methods +-------------------------------------- + +If 'objc_msg_lookup()' does not find a suitable method implementation, +because the receiver does not implement the required method, it tries to +see if the class can dynamically register the method. + + To do so, the runtime checks if the class of the receiver implements +the method + + + (BOOL) resolveInstanceMethod: (SEL)selector; + + in the case of an instance method, or + + + (BOOL) resolveClassMethod: (SEL)selector; + + in the case of a class method. If the class implements it, the runtime +invokes it, passing as argument the selector of the original method, and +if it returns 'YES', the runtime tries the lookup again, which could now +succeed if a matching method was added dynamically by +'+resolveInstanceMethod:' or '+resolveClassMethod:'. + + This allows classes to dynamically register methods (by adding them to +the class using 'class_addMethod') when they are first called. To do +so, a class should implement '+resolveInstanceMethod:' (or, depending on +the case, '+resolveClassMethod:') and have it recognize the selectors of +methods that can be registered dynamically at runtime, register them, +and return 'YES'. It should return 'NO' for methods that it does not +dynamically registered at runtime. + + If '+resolveInstanceMethod:' (or '+resolveClassMethod:') is not +implemented or returns 'NO', the runtime then tries the forwarding hook. + + Support for '+resolveInstanceMethod:' and 'resolveClassMethod:' was +added to the GNU Objective-C runtime in GCC version 4.6. + + +File: gcc.info, Node: Forwarding hook, Prev: Dynamically registering methods, Up: Messaging with the GNU Objective-C runtime + +8.10.2 Forwarding hook +---------------------- + +The GNU Objective-C runtime provides a hook, called +'__objc_msg_forward2', which is called by 'objc_msg_lookup()' when it +can't find a method implementation in the runtime tables and after +calling '+resolveInstanceMethod:' and '+resolveClassMethod:' has been +attempted and did not succeed in dynamically registering the method. + + To configure the hook, you set the global variable +'__objc_msg_forward2' to a function with the same argument and return +types of 'objc_msg_lookup()'. When 'objc_msg_lookup()' can not find a +method implementation, it invokes the hook function you provided to get +a method implementation to return. So, in practice +'__objc_msg_forward2' allows you to extend 'objc_msg_lookup()' by adding +some custom code that is called to do a further lookup when no standard +method implementation can be found using the normal lookup. + + This hook is generally reserved for "Foundation" libraries such as +GNUstep Base, which use it to implement their high-level method +forwarding API, typically based around the 'forwardInvocation:' method. +So, unless you are implementing your own "Foundation" library, you +should not set this hook. + + In a typical forwarding implementation, the '__objc_msg_forward2' hook +function determines the argument and return type of the method that is +being looked up, and then creates a function that takes these arguments +and has that return type, and returns it to the caller. Creating this +function is non-trivial and is typically performed using a dedicated +library such as 'libffi'. + + The forwarding method implementation thus created is returned by +'objc_msg_lookup()' and is executed as if it was a normal method +implementation. When the forwarding method implementation is called, it +is usually expected to pack all arguments into some sort of object +(typically, an 'NSInvocation' in a "Foundation" library), and hand it +over to the programmer ('forwardInvocation:') who is then allowed to +manipulate the method invocation using a high-level API provided by the +"Foundation" library. For example, the programmer may want to examine +the method invocation arguments and name and potentially change them +before forwarding the method invocation to one or more local objects +('performInvocation:') or even to remote objects (by using Distributed +Objects or some other mechanism). When all this completes, the return +value is passed back and must be returned correctly to the original +caller. + + Note that the GNU Objective-C runtime currently provides no support for +method forwarding or method invocations other than the +'__objc_msg_forward2' hook. + + If the forwarding hook does not exist or returns 'NULL', the runtime +currently attempts forwarding using an older, deprecated API, and if +that fails, it aborts the program. In future versions of the GNU +Objective-C runtime, the runtime will immediately abort. + + +File: gcc.info, Node: Compatibility, Next: Gcov, Prev: Objective-C, Up: Top + +9 Binary Compatibility +********************** + +Binary compatibility encompasses several related concepts: + +"application binary interface (ABI)" + The set of runtime conventions followed by all of the tools that + deal with binary representations of a program, including compilers, + assemblers, linkers, and language runtime support. Some ABIs are + formal with a written specification, possibly designed by multiple + interested parties. Others are simply the way things are actually + done by a particular set of tools. + +"ABI conformance" + A compiler conforms to an ABI if it generates code that follows all + of the specifications enumerated by that ABI. A library conforms + to an ABI if it is implemented according to that ABI. An + application conforms to an ABI if it is built using tools that + conform to that ABI and does not contain source code that + specifically changes behavior specified by the ABI. + +"calling conventions" + Calling conventions are a subset of an ABI that specify of how + arguments are passed and function results are returned. + +"interoperability" + Different sets of tools are interoperable if they generate files + that can be used in the same program. The set of tools includes + compilers, assemblers, linkers, libraries, header files, startup + files, and debuggers. Binaries produced by different sets of tools + are not interoperable unless they implement the same ABI. This + applies to different versions of the same tools as well as tools + from different vendors. + +"intercallability" + Whether a function in a binary built by one set of tools can call a + function in a binary built by a different set of tools is a subset + of interoperability. + +"implementation-defined features" + Language standards include lists of implementation-defined features + whose behavior can vary from one implementation to another. Some + of these features are normally covered by a platform's ABI and + others are not. The features that are not covered by an ABI + generally affect how a program behaves, but not intercallability. + +"compatibility" + Conformance to the same ABI and the same behavior of + implementation-defined features are both relevant for + compatibility. + + The application binary interface implemented by a C or C++ compiler +affects code generation and runtime support for: + + * size and alignment of data types + * layout of structured types + * calling conventions + * register usage conventions + * interfaces for runtime arithmetic support + * object file formats + + In addition, the application binary interface implemented by a C++ +compiler affects code generation and runtime support for: + * name mangling + * exception handling + * invoking constructors and destructors + * layout, alignment, and padding of classes + * layout and alignment of virtual tables + + Some GCC compilation options cause the compiler to generate code that +does not conform to the platform's default ABI. Other options cause +different program behavior for implementation-defined features that are +not covered by an ABI. These options are provided for consistency with +other compilers that do not follow the platform's default ABI or the +usual behavior of implementation-defined features for the platform. Be +very careful about using such options. + + Most platforms have a well-defined ABI that covers C code, but ABIs +that cover C++ functionality are not yet common. + + Starting with GCC 3.2, GCC binary conventions for C++ are based on a +written, vendor-neutral C++ ABI that was designed to be specific to +64-bit Itanium but also includes generic specifications that apply to +any platform. This C++ ABI is also implemented by other compiler +vendors on some platforms, notably GNU/Linux and BSD systems. We have +tried hard to provide a stable ABI that will be compatible with future +GCC releases, but it is possible that we will encounter problems that +make this difficult. Such problems could include different +interpretations of the C++ ABI by different vendors, bugs in the ABI, or +bugs in the implementation of the ABI in different compilers. GCC's +'-Wabi' switch warns when G++ generates code that is probably not +compatible with the C++ ABI. + + The C++ library used with a C++ compiler includes the Standard C++ +Library, with functionality defined in the C++ Standard, plus language +runtime support. The runtime support is included in a C++ ABI, but +there is no formal ABI for the Standard C++ Library. Two +implementations of that library are interoperable if one follows the +de-facto ABI of the other and if they are both built with the same +compiler, or with compilers that conform to the same ABI for C++ +compiler and runtime support. + + When G++ and another C++ compiler conform to the same C++ ABI, but the +implementations of the Standard C++ Library that they normally use do +not follow the same ABI for the Standard C++ Library, object files built +with those compilers can be used in the same program only if they use +the same C++ library. This requires specifying the location of the C++ +library header files when invoking the compiler whose usual library is +not being used. The location of GCC's C++ header files depends on how +the GCC build was configured, but can be seen by using the G++ '-v' +option. With default configuration options for G++ 3.3 the compile line +for a different C++ compiler needs to include + + -IGCC_INSTALL_DIRECTORY/include/c++/3.3 + + Similarly, compiling code with G++ that must use a C++ library other +than the GNU C++ library requires specifying the location of the header +files for that other library. + + The most straightforward way to link a program to use a particular C++ +library is to use a C++ driver that specifies that C++ library by +default. The 'g++' driver, for example, tells the linker where to find +GCC's C++ library ('libstdc++') plus the other libraries and startup +files it needs, in the proper order. + + If a program must use a different C++ library and it's not possible to +do the final link using a C++ driver that uses that library by default, +it is necessary to tell 'g++' the location and name of that library. It +might also be necessary to specify different startup files and other +runtime support libraries, and to suppress the use of GCC's support +libraries with one or more of the options '-nostdlib', '-nostartfiles', +and '-nodefaultlibs'. + + +File: gcc.info, Node: Gcov, Next: Trouble, Prev: Compatibility, Up: Top + +10 'gcov'--a Test Coverage Program +********************************** + +'gcov' is a tool you can use in conjunction with GCC to test code +coverage in your programs. + +* Menu: + +* Gcov Intro:: Introduction to gcov. +* Invoking Gcov:: How to use gcov. +* Gcov and Optimization:: Using gcov with GCC optimization. +* Gcov Data Files:: The files used by gcov. +* Cross-profiling:: Data file relocation. + + +File: gcc.info, Node: Gcov Intro, Next: Invoking Gcov, Up: Gcov + +10.1 Introduction to 'gcov' +=========================== + +'gcov' is a test coverage program. Use it in concert with GCC to +analyze your programs to help create more efficient, faster running code +and to discover untested parts of your program. You can use 'gcov' as a +profiling tool to help discover where your optimization efforts will +best affect your code. You can also use 'gcov' along with the other +profiling tool, 'gprof', to assess which parts of your code use the +greatest amount of computing time. + + Profiling tools help you analyze your code's performance. Using a +profiler such as 'gcov' or 'gprof', you can find out some basic +performance statistics, such as: + + * how often each line of code executes + + * what lines of code are actually executed + + * how much computing time each section of code uses + + Once you know these things about how your code works when compiled, you +can look at each module to see which modules should be optimized. +'gcov' helps you determine where to work on optimization. + + Software developers also use coverage testing in concert with +testsuites, to make sure software is actually good enough for a release. +Testsuites can verify that a program works as expected; a coverage +program tests to see how much of the program is exercised by the +testsuite. Developers can then determine what kinds of test cases need +to be added to the testsuites to create both better testing and a better +final product. + + You should compile your code without optimization if you plan to use +'gcov' because the optimization, by combining some lines of code into +one function, may not give you as much information as you need to look +for 'hot spots' where the code is using a great deal of computer time. +Likewise, because 'gcov' accumulates statistics by line (at the lowest +resolution), it works best with a programming style that places only one +statement on each line. If you use complicated macros that expand to +loops or to other control structures, the statistics are less +helpful--they only report on the line where the macro call appears. If +your complex macros behave like functions, you can replace them with +inline functions to solve this problem. + + 'gcov' creates a logfile called 'SOURCEFILE.gcov' which indicates how +many times each line of a source file 'SOURCEFILE.c' has executed. You +can use these logfiles along with 'gprof' to aid in fine-tuning the +performance of your programs. 'gprof' gives timing information you can +use along with the information you get from 'gcov'. + + 'gcov' works only on code compiled with GCC. It is not compatible with +any other profiling or test coverage mechanism. + + +File: gcc.info, Node: Invoking Gcov, Next: Gcov and Optimization, Prev: Gcov Intro, Up: Gcov + +10.2 Invoking 'gcov' +==================== + + gcov [OPTIONS] FILES + + 'gcov' accepts the following options: + +'-h' +'--help' + Display help about using 'gcov' (on the standard output), and exit + without doing any further processing. + +'-v' +'--version' + Display the 'gcov' version number (on the standard output), and + exit without doing any further processing. + +'-a' +'--all-blocks' + Write individual execution counts for every basic block. Normally + gcov outputs execution counts only for the main blocks of a line. + With this option you can determine if blocks within a single line + are not being executed. + +'-b' +'--branch-probabilities' + Write branch frequencies to the output file, and write branch + summary info to the standard output. This option allows you to see + how often each branch in your program was taken. Unconditional + branches will not be shown, unless the '-u' option is given. + +'-c' +'--branch-counts' + Write branch frequencies as the number of branches taken, rather + than the percentage of branches taken. + +'-n' +'--no-output' + Do not create the 'gcov' output file. + +'-l' +'--long-file-names' + Create long file names for included source files. For example, if + the header file 'x.h' contains code, and was included in the file + 'a.c', then running 'gcov' on the file 'a.c' will produce an output + file called 'a.c##x.h.gcov' instead of 'x.h.gcov'. This can be + useful if 'x.h' is included in multiple source files and you want + to see the individual contributions. If you use the '-p' option, + both the including and included file names will be complete path + names. + +'-p' +'--preserve-paths' + Preserve complete path information in the names of generated + '.gcov' files. Without this option, just the filename component is + used. With this option, all directories are used, with '/' + characters translated to '#' characters, '.' directory components + removed and unremoveable '..' components renamed to '^'. This is + useful if sourcefiles are in several different directories. + +'-r' +'--relative-only' + Only output information about source files with a relative pathname + (after source prefix elision). Absolute paths are usually system + header files and coverage of any inline functions therein is + normally uninteresting. + +'-f' +'--function-summaries' + Output summaries for each function in addition to the file level + summary. + +'-o DIRECTORY|FILE' +'--object-directory DIRECTORY' +'--object-file FILE' + Specify either the directory containing the gcov data files, or the + object path name. The '.gcno', and '.gcda' data files are searched + for using this option. If a directory is specified, the data files + are in that directory and named after the input file name, without + its extension. If a file is specified here, the data files are + named after that file, without its extension. + +'-s DIRECTORY' +'--source-prefix DIRECTORY' + A prefix for source file names to remove when generating the output + coverage files. This option is useful when building in a separate + directory, and the pathname to the source directory is not wanted + when determining the output file names. Note that this prefix + detection is applied before determining whether the source file is + absolute. + +'-u' +'--unconditional-branches' + When branch probabilities are given, include those of unconditional + branches. Unconditional branches are normally not interesting. + +'-d' +'--display-progress' + Display the progress on the standard output. + +'-i' +'--intermediate-format' + Output gcov file in an easy-to-parse intermediate text format that + can be used by 'lcov' or other tools. The output is a single + '.gcov' file per '.gcda' file. No source code is required. + + The format of the intermediate '.gcov' file is plain text with one + entry per line + + file:SOURCE_FILE_NAME + function:LINE_NUMBER,EXECUTION_COUNT,FUNCTION_NAME + lcount:LINE NUMBER,EXECUTION_COUNT + branch:LINE_NUMBER,BRANCH_COVERAGE_TYPE + + Where the BRANCH_COVERAGE_TYPE is + notexec (Branch not executed) + taken (Branch executed and taken) + nottaken (Branch executed, but not taken) + + There can be multiple FILE entries in an intermediate gcov + file. All entries following a FILE pertain to that source file + until the next FILE entry. + + Here is a sample when '-i' is used in conjunction with '-b' option: + + file:array.cc + function:11,1,_Z3sumRKSt6vectorIPiSaIS0_EE + function:22,1,main + lcount:11,1 + lcount:12,1 + lcount:14,1 + branch:14,taken + lcount:26,1 + branch:28,nottaken + +'-m' +'--demangled-names' + Display demangled function names in output. The default is to show + mangled function names. + + 'gcov' should be run with the current directory the same as that when +you invoked the compiler. Otherwise it will not be able to locate the +source files. 'gcov' produces files called 'MANGLEDNAME.gcov' in the +current directory. These contain the coverage information of the source +file they correspond to. One '.gcov' file is produced for each source +(or header) file containing code, which was compiled to produce the data +files. The MANGLEDNAME part of the output file name is usually simply +the source file name, but can be something more complicated if the '-l' +or '-p' options are given. Refer to those options for details. + + If you invoke 'gcov' with multiple input files, the contributions from +each input file are summed. Typically you would invoke it with the same +list of files as the final link of your executable. + + The '.gcov' files contain the ':' separated fields along with program +source code. The format is + + EXECUTION_COUNT:LINE_NUMBER:SOURCE LINE TEXT + + Additional block information may succeed each line, when requested by +command line option. The EXECUTION_COUNT is '-' for lines containing no +code. Unexecuted lines are marked '#####' or '====', depending on +whether they are reachable by non-exceptional paths or only exceptional +paths such as C++ exception handlers, respectively. + + Some lines of information at the start have LINE_NUMBER of zero. These +preamble lines are of the form + + -:0:TAG:VALUE + + The ordering and number of these preamble lines will be augmented as +'gcov' development progresses -- do not rely on them remaining +unchanged. Use TAG to locate a particular preamble line. + + The additional block information is of the form + + TAG INFORMATION + + The INFORMATION is human readable, but designed to be simple enough for +machine parsing too. + + When printing percentages, 0% and 100% are only printed when the values +are _exactly_ 0% and 100% respectively. Other values which would +conventionally be rounded to 0% or 100% are instead printed as the +nearest non-boundary value. + + When using 'gcov', you must first compile your program with two special +GCC options: '-fprofile-arcs -ftest-coverage'. This tells the compiler +to generate additional information needed by gcov (basically a flow +graph of the program) and also includes additional code in the object +files for generating the extra profiling information needed by gcov. +These additional files are placed in the directory where the object file +is located. + + Running the program will cause profile output to be generated. For +each source file compiled with '-fprofile-arcs', an accompanying '.gcda' +file will be placed in the object file directory. + + Running 'gcov' with your program's source file names as arguments will +now produce a listing of the code along with frequency of execution for +each line. For example, if your program is called 'tmp.c', this is what +you see when you use the basic 'gcov' facility: + + $ gcc -fprofile-arcs -ftest-coverage tmp.c + $ a.out + $ gcov tmp.c + 90.00% of 10 source lines executed in file tmp.c + Creating tmp.c.gcov. + + The file 'tmp.c.gcov' contains output from 'gcov'. Here is a sample: + + -: 0:Source:tmp.c + -: 0:Graph:tmp.gcno + -: 0:Data:tmp.gcda + -: 0:Runs:1 + -: 0:Programs:1 + -: 1:#include <stdio.h> + -: 2: + -: 3:int main (void) + 1: 4:{ + 1: 5: int i, total; + -: 6: + 1: 7: total = 0; + -: 8: + 11: 9: for (i = 0; i < 10; i++) + 10: 10: total += i; + -: 11: + 1: 12: if (total != 45) + #####: 13: printf ("Failure\n"); + -: 14: else + 1: 15: printf ("Success\n"); + 1: 16: return 0; + -: 17:} + + When you use the '-a' option, you will get individual block counts, and +the output looks like this: + + -: 0:Source:tmp.c + -: 0:Graph:tmp.gcno + -: 0:Data:tmp.gcda + -: 0:Runs:1 + -: 0:Programs:1 + -: 1:#include <stdio.h> + -: 2: + -: 3:int main (void) + 1: 4:{ + 1: 4-block 0 + 1: 5: int i, total; + -: 6: + 1: 7: total = 0; + -: 8: + 11: 9: for (i = 0; i < 10; i++) + 11: 9-block 0 + 10: 10: total += i; + 10: 10-block 0 + -: 11: + 1: 12: if (total != 45) + 1: 12-block 0 + #####: 13: printf ("Failure\n"); + $$$$$: 13-block 0 + -: 14: else + 1: 15: printf ("Success\n"); + 1: 15-block 0 + 1: 16: return 0; + 1: 16-block 0 + -: 17:} + + In this mode, each basic block is only shown on one line - the last +line of the block. A multi-line block will only contribute to the +execution count of that last line, and other lines will not be shown to +contain code, unless previous blocks end on those lines. The total +execution count of a line is shown and subsequent lines show the +execution counts for individual blocks that end on that line. After +each block, the branch and call counts of the block will be shown, if +the '-b' option is given. + + Because of the way GCC instruments calls, a call count can be shown +after a line with no individual blocks. As you can see, line 13 +contains a basic block that was not executed. + + When you use the '-b' option, your output looks like this: + + $ gcov -b tmp.c + 90.00% of 10 source lines executed in file tmp.c + 80.00% of 5 branches executed in file tmp.c + 80.00% of 5 branches taken at least once in file tmp.c + 50.00% of 2 calls executed in file tmp.c + Creating tmp.c.gcov. + + Here is a sample of a resulting 'tmp.c.gcov' file: + + -: 0:Source:tmp.c + -: 0:Graph:tmp.gcno + -: 0:Data:tmp.gcda + -: 0:Runs:1 + -: 0:Programs:1 + -: 1:#include <stdio.h> + -: 2: + -: 3:int main (void) + function main called 1 returned 1 blocks executed 75% + 1: 4:{ + 1: 5: int i, total; + -: 6: + 1: 7: total = 0; + -: 8: + 11: 9: for (i = 0; i < 10; i++) + branch 0 taken 91% (fallthrough) + branch 1 taken 9% + 10: 10: total += i; + -: 11: + 1: 12: if (total != 45) + branch 0 taken 0% (fallthrough) + branch 1 taken 100% + #####: 13: printf ("Failure\n"); + call 0 never executed + -: 14: else + 1: 15: printf ("Success\n"); + call 0 called 1 returned 100% + 1: 16: return 0; + -: 17:} + + For each function, a line is printed showing how many times the +function is called, how many times it returns and what percentage of the +function's blocks were executed. + + For each basic block, a line is printed after the last line of the +basic block describing the branch or call that ends the basic block. +There can be multiple branches and calls listed for a single source line +if there are multiple basic blocks that end on that line. In this case, +the branches and calls are each given a number. There is no simple way +to map these branches and calls back to source constructs. In general, +though, the lowest numbered branch or call will correspond to the +leftmost construct on the source line. + + For a branch, if it was executed at least once, then a percentage +indicating the number of times the branch was taken divided by the +number of times the branch was executed will be printed. Otherwise, the +message "never executed" is printed. + + For a call, if it was executed at least once, then a percentage +indicating the number of times the call returned divided by the number +of times the call was executed will be printed. This will usually be +100%, but may be less for functions that call 'exit' or 'longjmp', and +thus may not return every time they are called. + + The execution counts are cumulative. If the example program were +executed again without removing the '.gcda' file, the count for the +number of times each line in the source was executed would be added to +the results of the previous run(s). This is potentially useful in +several ways. For example, it could be used to accumulate data over a +number of program runs as part of a test verification suite, or to +provide more accurate long-term information over a large number of +program runs. + + The data in the '.gcda' files is saved immediately before the program +exits. For each source file compiled with '-fprofile-arcs', the +profiling code first attempts to read in an existing '.gcda' file; if +the file doesn't match the executable (differing number of basic block +counts) it will ignore the contents of the file. It then adds in the +new execution counts and finally writes the data to the file. + + +File: gcc.info, Node: Gcov and Optimization, Next: Gcov Data Files, Prev: Invoking Gcov, Up: Gcov + +10.3 Using 'gcov' with GCC Optimization +======================================= + +If you plan to use 'gcov' to help optimize your code, you must first +compile your program with two special GCC options: '-fprofile-arcs +-ftest-coverage'. Aside from that, you can use any other GCC options; +but if you want to prove that every single line in your program was +executed, you should not compile with optimization at the same time. On +some machines the optimizer can eliminate some simple code lines by +combining them with other lines. For example, code like this: + + if (a != b) + c = 1; + else + c = 0; + +can be compiled into one instruction on some machines. In this case, +there is no way for 'gcov' to calculate separate execution counts for +each line because there isn't separate code for each line. Hence the +'gcov' output looks like this if you compiled the program with +optimization: + + 100: 12:if (a != b) + 100: 13: c = 1; + 100: 14:else + 100: 15: c = 0; + + The output shows that this block of code, combined by optimization, +executed 100 times. In one sense this result is correct, because there +was only one instruction representing all four of these lines. However, +the output does not indicate how many times the result was 0 and how +many times the result was 1. + + Inlineable functions can create unexpected line counts. Line counts +are shown for the source code of the inlineable function, but what is +shown depends on where the function is inlined, or if it is not inlined +at all. + + If the function is not inlined, the compiler must emit an out of line +copy of the function, in any object file that needs it. If 'fileA.o' +and 'fileB.o' both contain out of line bodies of a particular inlineable +function, they will also both contain coverage counts for that function. +When 'fileA.o' and 'fileB.o' are linked together, the linker will, on +many systems, select one of those out of line bodies for all calls to +that function, and remove or ignore the other. Unfortunately, it will +not remove the coverage counters for the unused function body. Hence +when instrumented, all but one use of that function will show zero +counts. + + If the function is inlined in several places, the block structure in +each location might not be the same. For instance, a condition might +now be calculable at compile time in some instances. Because the +coverage of all the uses of the inline function will be shown for the +same source lines, the line counts themselves might seem inconsistent. + + Long-running applications can use the '_gcov_reset' and '_gcov_dump' +facilities to restrict profile collection to the program region of +interest. Calling '_gcov_reset(void)' will clear all profile counters +to zero, and calling '_gcov_dump(void)' will cause the profile +information collected at that point to be dumped to '.gcda' output +files. + + +File: gcc.info, Node: Gcov Data Files, Next: Cross-profiling, Prev: Gcov and Optimization, Up: Gcov + +10.4 Brief description of 'gcov' data files +=========================================== + +'gcov' uses two files for profiling. The names of these files are +derived from the original _object_ file by substituting the file suffix +with either '.gcno', or '.gcda'. The files contain coverage and profile +data stored in a platform-independent format. The '.gcno' files are +placed in the same directory as the object file. By default, the +'.gcda' files are also stored in the same directory as the object file, +but the GCC '-fprofile-dir' option may be used to store the '.gcda' +files in a separate directory. + + The '.gcno' notes file is generated when the source file is compiled +with the GCC '-ftest-coverage' option. It contains information to +reconstruct the basic block graphs and assign source line numbers to +blocks. + + The '.gcda' count data file is generated when a program containing +object files built with the GCC '-fprofile-arcs' option is executed. A +separate '.gcda' file is created for each object file compiled with this +option. It contains arc transition counts, value profile counts, and +some summary information. + + The full details of the file format is specified in 'gcov-io.h', and +functions provided in that header file should be used to access the +coverage files. + + +File: gcc.info, Node: Cross-profiling, Prev: Gcov Data Files, Up: Gcov + +10.5 Data file relocation to support cross-profiling +==================================================== + +Running the program will cause profile output to be generated. For each +source file compiled with '-fprofile-arcs', an accompanying '.gcda' file +will be placed in the object file directory. That implicitly requires +running the program on the same system as it was built or having the +same absolute directory structure on the target system. The program +will try to create the needed directory structure, if it is not already +present. + + To support cross-profiling, a program compiled with '-fprofile-arcs' +can relocate the data files based on two environment variables: + + * GCOV_PREFIX contains the prefix to add to the absolute paths in the + object file. Prefix can be absolute, or relative. The default is + no prefix. + + * GCOV_PREFIX_STRIP indicates the how many initial directory names to + strip off the hardwired absolute paths. Default value is 0. + + _Note:_ If GCOV_PREFIX_STRIP is set without GCOV_PREFIX is + undefined, then a relative path is made out of the hardwired + absolute paths. + + For example, if the object file '/user/build/foo.o' was built with +'-fprofile-arcs', the final executable will try to create the data file +'/user/build/foo.gcda' when running on the target system. This will +fail if the corresponding directory does not exist and it is unable to +create it. This can be overcome by, for example, setting the +environment as 'GCOV_PREFIX=/target/run' and 'GCOV_PREFIX_STRIP=1'. +Such a setting will name the data file '/target/run/build/foo.gcda'. + + You must move the data files to the expected directory tree in order to +use them for profile directed optimizations ('--use-profile'), or to use +the 'gcov' tool. + + +File: gcc.info, Node: Trouble, Next: Bugs, Prev: Gcov, Up: Top + +11 Known Causes of Trouble with GCC +*********************************** + +This section describes known problems that affect users of GCC. Most of +these are not GCC bugs per se--if they were, we would fix them. But the +result for a user may be like the result of a bug. + + Some of these problems are due to bugs in other software, some are +missing features that are too much work to add, and some are places +where people's opinions differ as to what is best. + +* Menu: + +* Actual Bugs:: Bugs we will fix later. +* Interoperation:: Problems using GCC with other compilers, + and with certain linkers, assemblers and debuggers. +* Incompatibilities:: GCC is incompatible with traditional C. +* Fixed Headers:: GCC uses corrected versions of system header files. + This is necessary, but doesn't always work smoothly. +* Standard Libraries:: GCC uses the system C library, which might not be + compliant with the ISO C standard. +* Disappointments:: Regrettable things we can't change, but not quite bugs. +* C++ Misunderstandings:: Common misunderstandings with GNU C++. +* Non-bugs:: Things we think are right, but some others disagree. +* Warnings and Errors:: Which problems in your code get warnings, + and which get errors. + + +File: gcc.info, Node: Actual Bugs, Next: Interoperation, Up: Trouble + +11.1 Actual Bugs We Haven't Fixed Yet +===================================== + + * The 'fixincludes' script interacts badly with automounters; if the + directory of system header files is automounted, it tends to be + unmounted while 'fixincludes' is running. This would seem to be a + bug in the automounter. We don't know any good way to work around + it. + + +File: gcc.info, Node: Interoperation, Next: Incompatibilities, Prev: Actual Bugs, Up: Trouble + +11.2 Interoperation +=================== + +This section lists various difficulties encountered in using GCC +together with other compilers or with the assemblers, linkers, libraries +and debuggers on certain systems. + + * On many platforms, GCC supports a different ABI for C++ than do + other compilers, so the object files compiled by GCC cannot be used + with object files generated by another C++ compiler. + + An area where the difference is most apparent is name mangling. + The use of different name mangling is intentional, to protect you + from more subtle problems. Compilers differ as to many internal + details of C++ implementation, including: how class instances are + laid out, how multiple inheritance is implemented, and how virtual + function calls are handled. If the name encoding were made the + same, your programs would link against libraries provided from + other compilers--but the programs would then crash when run. + Incompatible libraries are then detected at link time, rather than + at run time. + + * On some BSD systems, including some versions of Ultrix, use of + profiling causes static variable destructors (currently used only + in C++) not to be run. + + * On a SPARC, GCC aligns all values of type 'double' on an 8-byte + boundary, and it expects every 'double' to be so aligned. The Sun + compiler usually gives 'double' values 8-byte alignment, with one + exception: function arguments of type 'double' may not be aligned. + + As a result, if a function compiled with Sun CC takes the address + of an argument of type 'double' and passes this pointer of type + 'double *' to a function compiled with GCC, dereferencing the + pointer may cause a fatal signal. + + One way to solve this problem is to compile your entire program + with GCC. Another solution is to modify the function that is + compiled with Sun CC to copy the argument into a local variable; + local variables are always properly aligned. A third solution is + to modify the function that uses the pointer to dereference it via + the following function 'access_double' instead of directly with + '*': + + inline double + access_double (double *unaligned_ptr) + { + union d2i { double d; int i[2]; }; + + union d2i *p = (union d2i *) unaligned_ptr; + union d2i u; + + u.i[0] = p->i[0]; + u.i[1] = p->i[1]; + + return u.d; + } + + Storing into the pointer can be done likewise with the same union. + + * On Solaris, the 'malloc' function in the 'libmalloc.a' library may + allocate memory that is only 4 byte aligned. Since GCC on the + SPARC assumes that doubles are 8 byte aligned, this may result in a + fatal signal if doubles are stored in memory allocated by the + 'libmalloc.a' library. + + The solution is to not use the 'libmalloc.a' library. Use instead + 'malloc' and related functions from 'libc.a'; they do not have this + problem. + + * On the HP PA machine, ADB sometimes fails to work on functions + compiled with GCC. Specifically, it fails to work on functions + that use 'alloca' or variable-size arrays. This is because GCC + doesn't generate HP-UX unwind descriptors for such functions. It + may even be impossible to generate them. + + * Debugging ('-g') is not supported on the HP PA machine, unless you + use the preliminary GNU tools. + + * Taking the address of a label may generate errors from the HP-UX PA + assembler. GAS for the PA does not have this problem. + + * Using floating point parameters for indirect calls to static + functions will not work when using the HP assembler. There simply + is no way for GCC to specify what registers hold arguments for + static functions when using the HP assembler. GAS for the PA does + not have this problem. + + * In extremely rare cases involving some very large functions you may + receive errors from the HP linker complaining about an out of + bounds unconditional branch offset. This used to occur more often + in previous versions of GCC, but is now exceptionally rare. If you + should run into it, you can work around by making your function + smaller. + + * GCC compiled code sometimes emits warnings from the HP-UX assembler + of the form: + + (warning) Use of GR3 when + frame >= 8192 may cause conflict. + + These warnings are harmless and can be safely ignored. + + * In extremely rare cases involving some very large functions you may + receive errors from the AIX Assembler complaining about a + displacement that is too large. If you should run into it, you can + work around by making your function smaller. + + * The 'libstdc++.a' library in GCC relies on the SVR4 dynamic linker + semantics which merges global symbols between libraries and + applications, especially necessary for C++ streams functionality. + This is not the default behavior of AIX shared libraries and + dynamic linking. 'libstdc++.a' is built on AIX with + "runtime-linking" enabled so that symbol merging can occur. To + utilize this feature, the application linked with 'libstdc++.a' + must include the '-Wl,-brtl' flag on the link line. G++ cannot + impose this because this option may interfere with the semantics of + the user program and users may not always use 'g++' to link his or + her application. Applications are not required to use the + '-Wl,-brtl' flag on the link line--the rest of the 'libstdc++.a' + library which is not dependent on the symbol merging semantics will + continue to function correctly. + + * An application can interpose its own definition of functions for + functions invoked by 'libstdc++.a' with "runtime-linking" enabled + on AIX. To accomplish this the application must be linked with + "runtime-linking" option and the functions explicitly must be + exported by the application ('-Wl,-brtl,-bE:exportfile'). + + * AIX on the RS/6000 provides support (NLS) for environments outside + of the United States. Compilers and assemblers use NLS to support + locale-specific representations of various objects including + floating-point numbers ('.' vs ',' for separating decimal + fractions). There have been problems reported where the library + linked with GCC does not produce the same floating-point formats + that the assembler accepts. If you have this problem, set the + 'LANG' environment variable to 'C' or 'En_US'. + + * Even if you specify '-fdollars-in-identifiers', you cannot + successfully use '$' in identifiers on the RS/6000 due to a + restriction in the IBM assembler. GAS supports these identifiers. + + +File: gcc.info, Node: Incompatibilities, Next: Fixed Headers, Prev: Interoperation, Up: Trouble + +11.3 Incompatibilities of GCC +============================= + +There are several noteworthy incompatibilities between GNU C and K&R +(non-ISO) versions of C. + + * GCC normally makes string constants read-only. If several + identical-looking string constants are used, GCC stores only one + copy of the string. + + One consequence is that you cannot call 'mktemp' with a string + constant argument. The function 'mktemp' always alters the string + its argument points to. + + Another consequence is that 'sscanf' does not work on some very old + systems when passed a string constant as its format control string + or input. This is because 'sscanf' incorrectly tries to write into + the string constant. Likewise 'fscanf' and 'scanf'. + + The solution to these problems is to change the program to use + 'char'-array variables with initialization strings for these + purposes instead of string constants. + + * '-2147483648' is positive. + + This is because 2147483648 cannot fit in the type 'int', so + (following the ISO C rules) its data type is 'unsigned long int'. + Negating this value yields 2147483648 again. + + * GCC does not substitute macro arguments when they appear inside of + string constants. For example, the following macro in GCC + + #define foo(a) "a" + + will produce output '"a"' regardless of what the argument A is. + + * When you use 'setjmp' and 'longjmp', the only automatic variables + guaranteed to remain valid are those declared 'volatile'. This is + a consequence of automatic register allocation. Consider this + function: + + jmp_buf j; + + foo () + { + int a, b; + + a = fun1 (); + if (setjmp (j)) + return a; + + a = fun2 (); + /* 'longjmp (j)' may occur in 'fun3'. */ + return a + fun3 (); + } + + Here 'a' may or may not be restored to its first value when the + 'longjmp' occurs. If 'a' is allocated in a register, then its + first value is restored; otherwise, it keeps the last value stored + in it. + + If you use the '-W' option with the '-O' option, you will get a + warning when GCC thinks such a problem might be possible. + + * Programs that use preprocessing directives in the middle of macro + arguments do not work with GCC. For example, a program like this + will not work: + + foobar ( + #define luser + hack) + + ISO C does not permit such a construct. + + * K&R compilers allow comments to cross over an inclusion boundary + (i.e. started in an include file and ended in the including file). + + * Declarations of external variables and functions within a block + apply only to the block containing the declaration. In other + words, they have the same scope as any other declaration in the + same place. + + In some other C compilers, an 'extern' declaration affects all the + rest of the file even if it happens within a block. + + * In traditional C, you can combine 'long', etc., with a typedef + name, as shown here: + + typedef int foo; + typedef long foo bar; + + In ISO C, this is not allowed: 'long' and other type modifiers + require an explicit 'int'. + + * PCC allows typedef names to be used as function parameters. + + * Traditional C allows the following erroneous pair of declarations + to appear together in a given scope: + + typedef int foo; + typedef foo foo; + + * GCC treats all characters of identifiers as significant. According + to K&R-1 (2.2), "No more than the first eight characters are + significant, although more may be used.". Also according to K&R-1 + (2.2), "An identifier is a sequence of letters and digits; the + first character must be a letter. The underscore _ counts as a + letter.", but GCC also allows dollar signs in identifiers. + + * PCC allows whitespace in the middle of compound assignment + operators such as '+='. GCC, following the ISO standard, does not + allow this. + + * GCC complains about unterminated character constants inside of + preprocessing conditionals that fail. Some programs have English + comments enclosed in conditionals that are guaranteed to fail; if + these comments contain apostrophes, GCC will probably report an + error. For example, this code would produce an error: + + #if 0 + You can't expect this to work. + #endif + + The best solution to such a problem is to put the text into an + actual C comment delimited by '/*...*/'. + + * Many user programs contain the declaration 'long time ();'. In the + past, the system header files on many systems did not actually + declare 'time', so it did not matter what type your program + declared it to return. But in systems with ISO C headers, 'time' + is declared to return 'time_t', and if that is not the same as + 'long', then 'long time ();' is erroneous. + + The solution is to change your program to use appropriate system + headers ('<time.h>' on systems with ISO C headers) and not to + declare 'time' if the system header files declare it, or failing + that to use 'time_t' as the return type of 'time'. + + * When compiling functions that return 'float', PCC converts it to a + double. GCC actually returns a 'float'. If you are concerned with + PCC compatibility, you should declare your functions to return + 'double'; you might as well say what you mean. + + * When compiling functions that return structures or unions, GCC + output code normally uses a method different from that used on most + versions of Unix. As a result, code compiled with GCC cannot call + a structure-returning function compiled with PCC, and vice versa. + + The method used by GCC is as follows: a structure or union which is + 1, 2, 4 or 8 bytes long is returned like a scalar. A structure or + union with any other size is stored into an address supplied by the + caller (usually in a special, fixed register, but on some machines + it is passed on the stack). The target hook + 'TARGET_STRUCT_VALUE_RTX' tells GCC where to pass this address. + + By contrast, PCC on most target machines returns structures and + unions of any size by copying the data into an area of static + storage, and then returning the address of that storage as if it + were a pointer value. The caller must copy the data from that + memory area to the place where the value is wanted. GCC does not + use this method because it is slower and nonreentrant. + + On some newer machines, PCC uses a reentrant convention for all + structure and union returning. GCC on most of these machines uses + a compatible convention when returning structures and unions in + memory, but still returns small structures and unions in registers. + + You can tell GCC to use a compatible convention for all structure + and union returning with the option '-fpcc-struct-return'. + + * GCC complains about program fragments such as '0x74ae-0x4000' which + appear to be two hexadecimal constants separated by the minus + operator. Actually, this string is a single "preprocessing token". + Each such token must correspond to one token in C. Since this does + not, GCC prints an error message. Although it may appear obvious + that what is meant is an operator and two values, the ISO C + standard specifically requires that this be treated as erroneous. + + A "preprocessing token" is a "preprocessing number" if it begins + with a digit and is followed by letters, underscores, digits, + periods and 'e+', 'e-', 'E+', 'E-', 'p+', 'p-', 'P+', or 'P-' + character sequences. (In strict C90 mode, the sequences 'p+', + 'p-', 'P+' and 'P-' cannot appear in preprocessing numbers.) + + To make the above program fragment valid, place whitespace in front + of the minus sign. This whitespace will end the preprocessing + number. + + +File: gcc.info, Node: Fixed Headers, Next: Standard Libraries, Prev: Incompatibilities, Up: Trouble + +11.4 Fixed Header Files +======================= + +GCC needs to install corrected versions of some system header files. +This is because most target systems have some header files that won't +work with GCC unless they are changed. Some have bugs, some are +incompatible with ISO C, and some depend on special features of other +compilers. + + Installing GCC automatically creates and installs the fixed header +files, by running a program called 'fixincludes'. Normally, you don't +need to pay attention to this. But there are cases where it doesn't do +the right thing automatically. + + * If you update the system's header files, such as by installing a + new system version, the fixed header files of GCC are not + automatically updated. They can be updated using the 'mkheaders' + script installed in 'LIBEXECDIR/gcc/TARGET/VERSION/install-tools/'. + + * On some systems, header file directories contain machine-specific + symbolic links in certain places. This makes it possible to share + most of the header files among hosts running the same version of + the system on different machine models. + + The programs that fix the header files do not understand this + special way of using symbolic links; therefore, the directory of + fixed header files is good only for the machine model used to build + it. + + It is possible to make separate sets of fixed header files for the + different machine models, and arrange a structure of symbolic links + so as to use the proper set, but you'll have to do this by hand. + + +File: gcc.info, Node: Standard Libraries, Next: Disappointments, Prev: Fixed Headers, Up: Trouble + +11.5 Standard Libraries +======================= + +GCC by itself attempts to be a conforming freestanding implementation. +*Note Language Standards Supported by GCC: Standards, for details of +what this means. Beyond the library facilities required of such an +implementation, the rest of the C library is supplied by the vendor of +the operating system. If that C library doesn't conform to the C +standards, then your programs might get warnings (especially when using +'-Wall') that you don't expect. + + For example, the 'sprintf' function on SunOS 4.1.3 returns 'char *' +while the C standard says that 'sprintf' returns an 'int'. The +'fixincludes' program could make the prototype for this function match +the Standard, but that would be wrong, since the function will still +return 'char *'. + + If you need a Standard compliant library, then you need to find one, as +GCC does not provide one. The GNU C library (called 'glibc') provides +ISO C, POSIX, BSD, SystemV and X/Open compatibility for GNU/Linux and +HURD-based GNU systems; no recent version of it supports other systems, +though some very old versions did. Version 2.2 of the GNU C library +includes nearly complete C99 support. You could also ask your operating +system vendor if newer libraries are available. + + +File: gcc.info, Node: Disappointments, Next: C++ Misunderstandings, Prev: Standard Libraries, Up: Trouble + +11.6 Disappointments and Misunderstandings +========================================== + +These problems are perhaps regrettable, but we don't know any practical +way around them. + + * Certain local variables aren't recognized by debuggers when you + compile with optimization. + + This occurs because sometimes GCC optimizes the variable out of + existence. There is no way to tell the debugger how to compute the + value such a variable "would have had", and it is not clear that + would be desirable anyway. So GCC simply does not mention the + eliminated variable when it writes debugging information. + + You have to expect a certain amount of disagreement between the + executable and your source code, when you use optimization. + + * Users often think it is a bug when GCC reports an error for code + like this: + + int foo (struct mumble *); + + struct mumble { ... }; + + int foo (struct mumble *x) + { ... } + + This code really is erroneous, because the scope of 'struct mumble' + in the prototype is limited to the argument list containing it. It + does not refer to the 'struct mumble' defined with file scope + immediately below--they are two unrelated types with similar names + in different scopes. + + But in the definition of 'foo', the file-scope type is used because + that is available to be inherited. Thus, the definition and the + prototype do not match, and you get an error. + + This behavior may seem silly, but it's what the ISO standard + specifies. It is easy enough for you to make your code work by + moving the definition of 'struct mumble' above the prototype. It's + not worth being incompatible with ISO C just to avoid an error for + the example shown above. + + * Accesses to bit-fields even in volatile objects works by accessing + larger objects, such as a byte or a word. You cannot rely on what + size of object is accessed in order to read or write the bit-field; + it may even vary for a given bit-field according to the precise + usage. + + If you care about controlling the amount of memory that is + accessed, use volatile but do not use bit-fields. + + * GCC comes with shell scripts to fix certain known problems in + system header files. They install corrected copies of various + header files in a special directory where only GCC will normally + look for them. The scripts adapt to various systems by searching + all the system header files for the problem cases that we know + about. + + If new system header files are installed, nothing automatically + arranges to update the corrected header files. They can be updated + using the 'mkheaders' script installed in + 'LIBEXECDIR/gcc/TARGET/VERSION/install-tools/'. + + * On 68000 and x86 systems, for instance, you can get paradoxical + results if you test the precise values of floating point numbers. + For example, you can find that a floating point value which is not + a NaN is not equal to itself. This results from the fact that the + floating point registers hold a few more bits of precision than fit + in a 'double' in memory. Compiled code moves values between memory + and floating point registers at its convenience, and moving them + into memory truncates them. + + You can partially avoid this problem by using the '-ffloat-store' + option (*note Optimize Options::). + + * On AIX and other platforms without weak symbol support, templates + need to be instantiated explicitly and symbols for static members + of templates will not be generated. + + * On AIX, GCC scans object files and library archives for static + constructors and destructors when linking an application before the + linker prunes unreferenced symbols. This is necessary to prevent + the AIX linker from mistakenly assuming that static constructor or + destructor are unused and removing them before the scanning can + occur. All static constructors and destructors found will be + referenced even though the modules in which they occur may not be + used by the program. This may lead to both increased executable + size and unexpected symbol references. + + +File: gcc.info, Node: C++ Misunderstandings, Next: Non-bugs, Prev: Disappointments, Up: Trouble + +11.7 Common Misunderstandings with GNU C++ +========================================== + +C++ is a complex language and an evolving one, and its standard +definition (the ISO C++ standard) was only recently completed. As a +result, your C++ compiler may occasionally surprise you, even when its +behavior is correct. This section discusses some areas that frequently +give rise to questions of this sort. + +* Menu: + +* Static Definitions:: Static member declarations are not definitions +* Name lookup:: Name lookup, templates, and accessing members of base classes +* Temporaries:: Temporaries may vanish before you expect +* Copy Assignment:: Copy Assignment operators copy virtual bases twice + + +File: gcc.info, Node: Static Definitions, Next: Name lookup, Up: C++ Misunderstandings + +11.7.1 Declare _and_ Define Static Members +------------------------------------------ + +When a class has static data members, it is not enough to _declare_ the +static member; you must also _define_ it. For example: + + class Foo + { + ... + void method(); + static int bar; + }; + + This declaration only establishes that the class 'Foo' has an 'int' +named 'Foo::bar', and a member function named 'Foo::method'. But you +still need to define _both_ 'method' and 'bar' elsewhere. According to +the ISO standard, you must supply an initializer in one (and only one) +source file, such as: + + int Foo::bar = 0; + + Other C++ compilers may not correctly implement the standard behavior. +As a result, when you switch to 'g++' from one of these compilers, you +may discover that a program that appeared to work correctly in fact does +not conform to the standard: 'g++' reports as undefined symbols any +static data members that lack definitions. + + +File: gcc.info, Node: Name lookup, Next: Temporaries, Prev: Static Definitions, Up: C++ Misunderstandings + +11.7.2 Name lookup, templates, and accessing members of base classes +-------------------------------------------------------------------- + +The C++ standard prescribes that all names that are not dependent on +template parameters are bound to their present definitions when parsing +a template function or class.(1) Only names that are dependent are +looked up at the point of instantiation. For example, consider + + void foo(double); + + struct A { + template <typename T> + void f () { + foo (1); // 1 + int i = N; // 2 + T t; + t.bar(); // 3 + foo (t); // 4 + } + + static const int N; + }; + + Here, the names 'foo' and 'N' appear in a context that does not depend +on the type of 'T'. The compiler will thus require that they are +defined in the context of use in the template, not only before the point +of instantiation, and will here use '::foo(double)' and 'A::N', +respectively. In particular, it will convert the integer value to a +'double' when passing it to '::foo(double)'. + + Conversely, 'bar' and the call to 'foo' in the fourth marked line are +used in contexts that do depend on the type of 'T', so they are only +looked up at the point of instantiation, and you can provide +declarations for them after declaring the template, but before +instantiating it. In particular, if you instantiate 'A::f<int>', the +last line will call an overloaded '::foo(int)' if one was provided, even +if after the declaration of 'struct A'. + + This distinction between lookup of dependent and non-dependent names is +called two-stage (or dependent) name lookup. G++ implements it since +version 3.4. + + Two-stage name lookup sometimes leads to situations with behavior +different from non-template codes. The most common is probably this: + + template <typename T> struct Base { + int i; + }; + + template <typename T> struct Derived : public Base<T> { + int get_i() { return i; } + }; + + In 'get_i()', 'i' is not used in a dependent context, so the compiler +will look for a name declared at the enclosing namespace scope (which is +the global scope here). It will not look into the base class, since +that is dependent and you may declare specializations of 'Base' even +after declaring 'Derived', so the compiler can't really know what 'i' +would refer to. If there is no global variable 'i', then you will get +an error message. + + In order to make it clear that you want the member of the base class, +you need to defer lookup until instantiation time, at which the base +class is known. For this, you need to access 'i' in a dependent +context, by either using 'this->i' (remember that 'this' is of type +'Derived<T>*', so is obviously dependent), or using 'Base<T>::i'. +Alternatively, 'Base<T>::i' might be brought into scope by a +'using'-declaration. + + Another, similar example involves calling member functions of a base +class: + + template <typename T> struct Base { + int f(); + }; + + template <typename T> struct Derived : Base<T> { + int g() { return f(); }; + }; + + Again, the call to 'f()' is not dependent on template arguments (there +are no arguments that depend on the type 'T', and it is also not +otherwise specified that the call should be in a dependent context). +Thus a global declaration of such a function must be available, since +the one in the base class is not visible until instantiation time. The +compiler will consequently produce the following error message: + + x.cc: In member function `int Derived<T>::g()': + x.cc:6: error: there are no arguments to `f' that depend on a template + parameter, so a declaration of `f' must be available + x.cc:6: error: (if you use `-fpermissive', G++ will accept your code, but + allowing the use of an undeclared name is deprecated) + + To make the code valid either use 'this->f()', or 'Base<T>::f()'. +Using the '-fpermissive' flag will also let the compiler accept the +code, by marking all function calls for which no declaration is visible +at the time of definition of the template for later lookup at +instantiation time, as if it were a dependent call. We do not recommend +using '-fpermissive' to work around invalid code, and it will also only +catch cases where functions in base classes are called, not where +variables in base classes are used (as in the example above). + + Note that some compilers (including G++ versions prior to 3.4) get +these examples wrong and accept above code without an error. Those +compilers do not implement two-stage name lookup correctly. + + ---------- Footnotes ---------- + + (1) The C++ standard just uses the term "dependent" for names that +depend on the type or value of template parameters. This shorter term +will also be used in the rest of this section. + + +File: gcc.info, Node: Temporaries, Next: Copy Assignment, Prev: Name lookup, Up: C++ Misunderstandings + +11.7.3 Temporaries May Vanish Before You Expect +----------------------------------------------- + +It is dangerous to use pointers or references to _portions_ of a +temporary object. The compiler may very well delete the object before +you expect it to, leaving a pointer to garbage. The most common place +where this problem crops up is in classes like string classes, +especially ones that define a conversion function to type 'char *' or +'const char *'--which is one reason why the standard 'string' class +requires you to call the 'c_str' member function. However, any class +that returns a pointer to some internal structure is potentially subject +to this problem. + + For example, a program may use a function 'strfunc' that returns +'string' objects, and another function 'charfunc' that operates on +pointers to 'char': + + string strfunc (); + void charfunc (const char *); + + void + f () + { + const char *p = strfunc().c_str(); + ... + charfunc (p); + ... + charfunc (p); + } + +In this situation, it may seem reasonable to save a pointer to the C +string returned by the 'c_str' member function and use that rather than +call 'c_str' repeatedly. However, the temporary string created by the +call to 'strfunc' is destroyed after 'p' is initialized, at which point +'p' is left pointing to freed memory. + + Code like this may run successfully under some other compilers, +particularly obsolete cfront-based compilers that delete temporaries +along with normal local variables. However, the GNU C++ behavior is +standard-conforming, so if your program depends on late destruction of +temporaries it is not portable. + + The safe way to write such code is to give the temporary a name, which +forces it to remain until the end of the scope of the name. For +example: + + const string& tmp = strfunc (); + charfunc (tmp.c_str ()); + + +File: gcc.info, Node: Copy Assignment, Prev: Temporaries, Up: C++ Misunderstandings + +11.7.4 Implicit Copy-Assignment for Virtual Bases +------------------------------------------------- + +When a base class is virtual, only one subobject of the base class +belongs to each full object. Also, the constructors and destructors are +invoked only once, and called from the most-derived class. However, +such objects behave unspecified when being assigned. For example: + + struct Base{ + char *name; + Base(char *n) : name(strdup(n)){} + Base& operator= (const Base& other){ + free (name); + name = strdup (other.name); + } + }; + + struct A:virtual Base{ + int val; + A():Base("A"){} + }; + + struct B:virtual Base{ + int bval; + B():Base("B"){} + }; + + struct Derived:public A, public B{ + Derived():Base("Derived"){} + }; + + void func(Derived &d1, Derived &d2) + { + d1 = d2; + } + + The C++ standard specifies that 'Base::Base' is only called once when +constructing or copy-constructing a Derived object. It is unspecified +whether 'Base::operator=' is called more than once when the implicit +copy-assignment for Derived objects is invoked (as it is inside 'func' +in the example). + + G++ implements the "intuitive" algorithm for copy-assignment: assign +all direct bases, then assign all members. In that algorithm, the +virtual base subobject can be encountered more than once. In the +example, copying proceeds in the following order: 'val', 'name' (via +'strdup'), 'bval', and 'name' again. + + If application code relies on copy-assignment, a user-defined +copy-assignment operator removes any uncertainties. With such an +operator, the application can define whether and how the virtual base +subobject is assigned. + + +File: gcc.info, Node: Non-bugs, Next: Warnings and Errors, Prev: C++ Misunderstandings, Up: Trouble + +11.8 Certain Changes We Don't Want to Make +========================================== + +This section lists changes that people frequently request, but which we +do not make because we think GCC is better without them. + + * Checking the number and type of arguments to a function which has + an old-fashioned definition and no prototype. + + Such a feature would work only occasionally--only for calls that + appear in the same file as the called function, following the + definition. The only way to check all calls reliably is to add a + prototype for the function. But adding a prototype eliminates the + motivation for this feature. So the feature is not worthwhile. + + * Warning about using an expression whose type is signed as a shift + count. + + Shift count operands are probably signed more often than unsigned. + Warning about this would cause far more annoyance than good. + + * Warning about assigning a signed value to an unsigned variable. + + Such assignments must be very common; warning about them would + cause more annoyance than good. + + * Warning when a non-void function value is ignored. + + C contains many standard functions that return a value that most + programs choose to ignore. One obvious example is 'printf'. + Warning about this practice only leads the defensive programmer to + clutter programs with dozens of casts to 'void'. Such casts are + required so frequently that they become visual noise. Writing + those casts becomes so automatic that they no longer convey useful + information about the intentions of the programmer. For functions + where the return value should never be ignored, use the + 'warn_unused_result' function attribute (*note Function + Attributes::). + + * Making '-fshort-enums' the default. + + This would cause storage layout to be incompatible with most other + C compilers. And it doesn't seem very important, given that you + can get the same result in other ways. The case where it matters + most is when the enumeration-valued object is inside a structure, + and in that case you can specify a field width explicitly. + + * Making bit-fields unsigned by default on particular machines where + "the ABI standard" says to do so. + + The ISO C standard leaves it up to the implementation whether a + bit-field declared plain 'int' is signed or not. This in effect + creates two alternative dialects of C. + + The GNU C compiler supports both dialects; you can specify the + signed dialect with '-fsigned-bitfields' and the unsigned dialect + with '-funsigned-bitfields'. However, this leaves open the + question of which dialect to use by default. + + Currently, the preferred dialect makes plain bit-fields signed, + because this is simplest. Since 'int' is the same as 'signed int' + in every other context, it is cleanest for them to be the same in + bit-fields as well. + + Some computer manufacturers have published Application Binary + Interface standards which specify that plain bit-fields should be + unsigned. It is a mistake, however, to say anything about this + issue in an ABI. This is because the handling of plain bit-fields + distinguishes two dialects of C. Both dialects are meaningful on + every type of machine. Whether a particular object file was + compiled using signed bit-fields or unsigned is of no concern to + other object files, even if they access the same bit-fields in the + same data structures. + + A given program is written in one or the other of these two + dialects. The program stands a chance to work on most any machine + if it is compiled with the proper dialect. It is unlikely to work + at all if compiled with the wrong dialect. + + Many users appreciate the GNU C compiler because it provides an + environment that is uniform across machines. These users would be + inconvenienced if the compiler treated plain bit-fields differently + on certain machines. + + Occasionally users write programs intended only for a particular + machine type. On these occasions, the users would benefit if the + GNU C compiler were to support by default the same dialect as the + other compilers on that machine. But such applications are rare. + And users writing a program to run on more than one type of machine + cannot possibly benefit from this kind of compatibility. + + This is why GCC does and will treat plain bit-fields in the same + fashion on all types of machines (by default). + + There are some arguments for making bit-fields unsigned by default + on all machines. If, for example, this becomes a universal de + facto standard, it would make sense for GCC to go along with it. + This is something to be considered in the future. + + (Of course, users strongly concerned about portability should + indicate explicitly in each bit-field whether it is signed or not. + In this way, they write programs which have the same meaning in + both C dialects.) + + * Undefining '__STDC__' when '-ansi' is not used. + + Currently, GCC defines '__STDC__' unconditionally. This provides + good results in practice. + + Programmers normally use conditionals on '__STDC__' to ask whether + it is safe to use certain features of ISO C, such as function + prototypes or ISO token concatenation. Since plain 'gcc' supports + all the features of ISO C, the correct answer to these questions is + "yes". + + Some users try to use '__STDC__' to check for the availability of + certain library facilities. This is actually incorrect usage in an + ISO C program, because the ISO C standard says that a conforming + freestanding implementation should define '__STDC__' even though it + does not have the library facilities. 'gcc -ansi -pedantic' is a + conforming freestanding implementation, and it is therefore + required to define '__STDC__', even though it does not come with an + ISO C library. + + Sometimes people say that defining '__STDC__' in a compiler that + does not completely conform to the ISO C standard somehow violates + the standard. This is illogical. The standard is a standard for + compilers that claim to support ISO C, such as 'gcc -ansi'--not for + other compilers such as plain 'gcc'. Whatever the ISO C standard + says is relevant to the design of plain 'gcc' without '-ansi' only + for pragmatic reasons, not as a requirement. + + GCC normally defines '__STDC__' to be 1, and in addition defines + '__STRICT_ANSI__' if you specify the '-ansi' option, or a '-std' + option for strict conformance to some version of ISO C. On some + hosts, system include files use a different convention, where + '__STDC__' is normally 0, but is 1 if the user specifies strict + conformance to the C Standard. GCC follows the host convention + when processing system include files, but when processing user + files it follows the usual GNU C convention. + + * Undefining '__STDC__' in C++. + + Programs written to compile with C++-to-C translators get the value + of '__STDC__' that goes with the C compiler that is subsequently + used. These programs must test '__STDC__' to determine what kind + of C preprocessor that compiler uses: whether they should + concatenate tokens in the ISO C fashion or in the traditional + fashion. + + These programs work properly with GNU C++ if '__STDC__' is defined. + They would not work otherwise. + + In addition, many header files are written to provide prototypes in + ISO C but not in traditional C. Many of these header files can + work without change in C++ provided '__STDC__' is defined. If + '__STDC__' is not defined, they will all fail, and will all need to + be changed to test explicitly for C++ as well. + + * Deleting "empty" loops. + + Historically, GCC has not deleted "empty" loops under the + assumption that the most likely reason you would put one in a + program is to have a delay, so deleting them will not make real + programs run any faster. + + However, the rationale here is that optimization of a nonempty loop + cannot produce an empty one. This held for carefully written C + compiled with less powerful optimizers but is not always the case + for carefully written C++ or with more powerful optimizers. Thus + GCC will remove operations from loops whenever it can determine + those operations are not externally visible (apart from the time + taken to execute them, of course). In case the loop can be proved + to be finite, GCC will also remove the loop itself. + + Be aware of this when performing timing tests, for instance the + following loop can be completely removed, provided + 'some_expression' can provably not change any global state. + + { + int sum = 0; + int ix; + + for (ix = 0; ix != 10000; ix++) + sum += some_expression; + } + + Even though 'sum' is accumulated in the loop, no use is made of + that summation, so the accumulation can be removed. + + * Making side effects happen in the same order as in some other + compiler. + + It is never safe to depend on the order of evaluation of side + effects. For example, a function call like this may very well + behave differently from one compiler to another: + + void func (int, int); + + int i = 2; + func (i++, i++); + + There is no guarantee (in either the C or the C++ standard language + definitions) that the increments will be evaluated in any + particular order. Either increment might happen first. 'func' + might get the arguments '2, 3', or it might get '3, 2', or even '2, + 2'. + + * Making certain warnings into errors by default. + + Some ISO C testsuites report failure when the compiler does not + produce an error message for a certain program. + + ISO C requires a "diagnostic" message for certain kinds of invalid + programs, but a warning is defined by GCC to count as a diagnostic. + If GCC produces a warning but not an error, that is correct ISO C + support. If testsuites call this "failure", they should be run + with the GCC option '-pedantic-errors', which will turn these + warnings into errors. + + +File: gcc.info, Node: Warnings and Errors, Prev: Non-bugs, Up: Trouble + +11.9 Warning Messages and Error Messages +======================================== + +The GNU compiler can produce two kinds of diagnostics: errors and +warnings. Each kind has a different purpose: + + "Errors" report problems that make it impossible to compile your + program. GCC reports errors with the source file name and line + number where the problem is apparent. + + "Warnings" report other unusual conditions in your code that _may_ + indicate a problem, although compilation can (and does) proceed. + Warning messages also report the source file name and line number, + but include the text 'warning:' to distinguish them from error + messages. + + Warnings may indicate danger points where you should check to make sure +that your program really does what you intend; or the use of obsolete +features; or the use of nonstandard features of GNU C or C++. Many +warnings are issued only if you ask for them, with one of the '-W' +options (for instance, '-Wall' requests a variety of useful warnings). + + GCC always tries to compile your program if possible; it never +gratuitously rejects a program whose meaning is clear merely because +(for instance) it fails to conform to a standard. In some cases, +however, the C and C++ standards specify that certain extensions are +forbidden, and a diagnostic _must_ be issued by a conforming compiler. +The '-pedantic' option tells GCC to issue warnings in such cases; +'-pedantic-errors' says to make them errors instead. This does not mean +that _all_ non-ISO constructs get warnings or errors. + + *Note Options to Request or Suppress Warnings: Warning Options, for +more detail on these and related command-line options. + + +File: gcc.info, Node: Bugs, Next: Service, Prev: Trouble, Up: Top + +12 Reporting Bugs +***************** + +Your bug reports play an essential role in making GCC reliable. + + When you encounter a problem, the first thing to do is to see if it is +already known. *Note Trouble::. If it isn't known, then you should +report the problem. + +* Menu: + +* Criteria: Bug Criteria. Have you really found a bug? +* Reporting: Bug Reporting. How to report a bug effectively. + + +File: gcc.info, Node: Bug Criteria, Next: Bug Reporting, Up: Bugs + +12.1 Have You Found a Bug? +========================== + +If you are not sure whether you have found a bug, here are some +guidelines: + + * If the compiler gets a fatal signal, for any input whatever, that + is a compiler bug. Reliable compilers never crash. + + * If the compiler produces invalid assembly code, for any input + whatever (except an 'asm' statement), that is a compiler bug, + unless the compiler reports errors (not just warnings) which would + ordinarily prevent the assembler from being run. + + * If the compiler produces valid assembly code that does not + correctly execute the input source code, that is a compiler bug. + + However, you must double-check to make sure, because you may have a + program whose behavior is undefined, which happened by chance to + give the desired results with another C or C++ compiler. + + For example, in many nonoptimizing compilers, you can write 'x;' at + the end of a function instead of 'return x;', with the same + results. But the value of the function is undefined if 'return' is + omitted; it is not a bug when GCC produces different results. + + Problems often result from expressions with two increment + operators, as in 'f (*p++, *p++)'. Your previous compiler might + have interpreted that expression the way you intended; GCC might + interpret it another way. Neither compiler is wrong. The bug is + in your code. + + After you have localized the error to a single source line, it + should be easy to check for these things. If your program is + correct and well defined, you have found a compiler bug. + + * If the compiler produces an error message for valid input, that is + a compiler bug. + + * If the compiler does not produce an error message for invalid + input, that is a compiler bug. However, you should note that your + idea of "invalid input" might be someone else's idea of "an + extension" or "support for traditional practice". + + * If you are an experienced user of one of the languages GCC + supports, your suggestions for improvement of GCC are welcome in + any case. + + +File: gcc.info, Node: Bug Reporting, Prev: Bug Criteria, Up: Bugs + +12.2 How and where to Report Bugs +================================= + +Bugs should be reported to the bug database at +<http://gcc.gnu.org/bugs.html>. + + +File: gcc.info, Node: Service, Next: Contributing, Prev: Bugs, Up: Top + +13 How To Get Help with GCC +*************************** + +If you need help installing, using or changing GCC, there are two ways +to find it: + + * Send a message to a suitable network mailing list. First try + <gcc-help@gcc.gnu.org> (for help installing or using GCC), and if + that brings no response, try <gcc@gcc.gnu.org>. For help changing + GCC, ask <gcc@gcc.gnu.org>. If you think you have found a bug in + GCC, please report it following the instructions at *note Bug + Reporting::. + + * Look in the service directory for someone who might help you for a + fee. The service directory is found at + <http://www.fsf.org/resources/service>. + + For further information, see <http://gcc.gnu.org/faq.html#support>. + + +File: gcc.info, Node: Contributing, Next: Funding, Prev: Service, Up: Top + +14 Contributing to GCC Development +********************************** + +If you would like to help pretest GCC releases to assure they work well, +current development sources are available by SVN (see +<http://gcc.gnu.org/svn.html>). Source and binary snapshots are also +available for FTP; see <http://gcc.gnu.org/snapshots.html>. + + If you would like to work on improvements to GCC, please read the +advice at these URLs: + + <http://gcc.gnu.org/contribute.html> + <http://gcc.gnu.org/contributewhy.html> + +for information on how to make useful contributions and avoid +duplication of effort. Suggested projects are listed at +<http://gcc.gnu.org/projects/>. + + +File: gcc.info, Node: Funding, Next: GNU Project, Prev: Contributing, Up: Top + +Funding Free Software +********************* + +If you want to have more free software a few years from now, it makes +sense for you to help encourage people to contribute funds for its +development. The most effective approach known is to encourage +commercial redistributors to donate. + + Users of free software systems can boost the pace of development by +encouraging for-a-fee distributors to donate part of their selling price +to free software developers--the Free Software Foundation, and others. + + The way to convince distributors to do this is to demand it and expect +it from them. So when you compare distributors, judge them partly by +how much they give to free software development. Show distributors they +must compete to be the one who gives the most. + + To make this approach work, you must insist on numbers that you can +compare, such as, "We will donate ten dollars to the Frobnitz project +for each disk sold." Don't be satisfied with a vague promise, such as +"A portion of the profits are donated," since it doesn't give a basis +for comparison. + + Even a precise fraction "of the profits from this disk" is not very +meaningful, since creative accounting and unrelated business decisions +can greatly alter what fraction of the sales price counts as profit. If +the price you pay is $50, ten percent of the profit is probably less +than a dollar; it might be a few cents, or nothing at all. + + Some redistributors do development work themselves. This is useful +too; but to keep everyone honest, you need to inquire how much they do, +and what kind. Some kinds of development make much more long-term +difference than others. For example, maintaining a separate version of +a program contributes very little; maintaining the standard version of a +program for the whole community contributes much. Easy new ports +contribute little, since someone else would surely do them; difficult +ports such as adding a new CPU to the GNU Compiler Collection contribute +more; major new features or packages contribute the most. + + By establishing the idea that supporting further development is "the +proper thing to do" when distributing free software for a fee, we can +assure a steady flow of resources into making more free software. + + Copyright (C) 1994 Free Software Foundation, Inc. + Verbatim copying and redistribution of this section is permitted + without royalty; alteration is not permitted. + + +File: gcc.info, Node: GNU Project, Next: Copying, Prev: Funding, Up: Top + +The GNU Project and GNU/Linux +***************************** + +The GNU Project was launched in 1984 to develop a complete Unix-like +operating system which is free software: the GNU system. (GNU is a +recursive acronym for "GNU's Not Unix"; it is pronounced "guh-NEW".) +Variants of the GNU operating system, which use the kernel Linux, are +now widely used; though these systems are often referred to as "Linux", +they are more accurately called GNU/Linux systems. + + For more information, see: + <http://www.gnu.org/> + <http://www.gnu.org/gnu/linux-and-gnu.html> + + +File: gcc.info, Node: Copying, Next: GNU Free Documentation License, Prev: GNU Project, Up: Top + +GNU General Public License +************************** + + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies of this + license document, but changing it is not allowed. + +Preamble +======== + +The GNU General Public License is a free, copyleft license for software +and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program-to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not price. +Our General Public Licenses are designed to make sure that you have the +freedom to distribute copies of free software (and charge for them if +you wish), that you receive source code or can get it if you want it, +that you can change the software or use pieces of it in new free +programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether gratis +or for a fee, you must pass on to the recipients the same freedoms that +you received. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + Developers that use the GNU GPL protect your rights with two steps: (1) +assert copyright on the software, and (2) offer you this License giving +you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + +TERMS AND CONDITIONS +==================== + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public + License. + + "Copyright" also means copyright-like laws that apply to other + kinds of works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this + License. Each licensee is addressed as "you". "Licensees" and + "recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the + work in a fashion requiring copyright permission, other than the + making of an exact copy. The resulting work is called a "modified + version" of the earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work + based on the Program. + + To "propagate" a work means to do anything with it that, without + permission, would make you directly or secondarily liable for + infringement under applicable copyright law, except executing it on + a computer or modifying a private copy. Propagation includes + copying, distribution (with or without modification), making + available to the public, and in some countries other activities as + well. + + To "convey" a work means any kind of propagation that enables other + parties to make or receive copies. Mere interaction with a user + through a computer network, with no transfer of a copy, is not + conveying. + + An interactive user interface displays "Appropriate Legal Notices" + to the extent that it includes a convenient and prominently visible + feature that (1) displays an appropriate copyright notice, and (2) + tells the user that there is no warranty for the work (except to + the extent that warranties are provided), that licensees may convey + the work under this License, and how to view a copy of this + License. If the interface presents a list of user commands or + options, such as a menu, a prominent item in the list meets this + criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work + for making modifications to it. "Object code" means any non-source + form of a work. + + A "Standard Interface" means an interface that either is an + official standard defined by a recognized standards body, or, in + the case of interfaces specified for a particular programming + language, one that is widely used among developers working in that + language. + + The "System Libraries" of an executable work include anything, + other than the work as a whole, that (a) is included in the normal + form of packaging a Major Component, but which is not part of that + Major Component, and (b) serves only to enable use of the work with + that Major Component, or to implement a Standard Interface for + which an implementation is available to the public in source code + form. A "Major Component", in this context, means a major + essential component (kernel, window system, and so on) of the + specific operating system (if any) on which the executable work + runs, or a compiler used to produce the work, or an object code + interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all + the source code needed to generate, install, and (for an executable + work) run the object code and to modify the work, including scripts + to control those activities. However, it does not include the + work's System Libraries, or general-purpose tools or generally + available free programs which are used unmodified in performing + those activities but which are not part of the work. For example, + Corresponding Source includes interface definition files associated + with source files for the work, and the source code for shared + libraries and dynamically linked subprograms that the work is + specifically designed to require, such as by intimate data + communication or control flow between those subprograms and other + parts of the work. + + The Corresponding Source need not include anything that users can + regenerate automatically from other parts of the Corresponding + Source. + + The Corresponding Source for a work in source code form is that + same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of + copyright on the Program, and are irrevocable provided the stated + conditions are met. This License explicitly affirms your unlimited + permission to run the unmodified Program. The output from running + a covered work is covered by this License only if the output, given + its content, constitutes a covered work. This License acknowledges + your rights of fair use or other equivalent, as provided by + copyright law. + + You may make, run and propagate covered works that you do not + convey, without conditions so long as your license otherwise + remains in force. You may convey covered works to others for the + sole purpose of having them make modifications exclusively for you, + or provide you with facilities for running those works, provided + that you comply with the terms of this License in conveying all + material for which you do not control copyright. Those thus making + or running the covered works for you must do so exclusively on your + behalf, under your direction and control, on terms that prohibit + them from making any copies of your copyrighted material outside + their relationship with you. + + Conveying under any other circumstances is permitted solely under + the conditions stated below. Sublicensing is not allowed; section + 10 makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological + measure under any applicable law fulfilling obligations under + article 11 of the WIPO copyright treaty adopted on 20 December + 1996, or similar laws prohibiting or restricting circumvention of + such measures. + + When you convey a covered work, you waive any legal power to forbid + circumvention of technological measures to the extent such + circumvention is effected by exercising rights under this License + with respect to the covered work, and you disclaim any intention to + limit operation or modification of the work as a means of + enforcing, against the work's users, your or third parties' legal + rights to forbid circumvention of technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you + receive it, in any medium, provided that you conspicuously and + appropriately publish on each copy an appropriate copyright notice; + keep intact all notices stating that this License and any + non-permissive terms added in accord with section 7 apply to the + code; keep intact all notices of the absence of any warranty; and + give all recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, + and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to + produce it from the Program, in the form of source code under the + terms of section 4, provided that you also meet all of these + conditions: + + a. The work must carry prominent notices stating that you + modified it, and giving a relevant date. + + b. The work must carry prominent notices stating that it is + released under this License and any conditions added under + section 7. This requirement modifies the requirement in + section 4 to "keep intact all notices". + + c. You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable + section 7 additional terms, to the whole of the work, and all + its parts, regardless of how they are packaged. This License + gives no permission to license the work in any other way, but + it does not invalidate such permission if you have separately + received it. + + d. If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has + interactive interfaces that do not display Appropriate Legal + Notices, your work need not make them do so. + + A compilation of a covered work with other separate and independent + works, which are not by their nature extensions of the covered + work, and which are not combined with it such as to form a larger + program, in or on a volume of a storage or distribution medium, is + called an "aggregate" if the compilation and its resulting + copyright are not used to limit the access or legal rights of the + compilation's users beyond what the individual works permit. + Inclusion of a covered work in an aggregate does not cause this + License to apply to the other parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms + of sections 4 and 5, provided that you also convey the + machine-readable Corresponding Source under the terms of this + License, in one of these ways: + + a. Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b. Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that + product model, to give anyone who possesses the object code + either (1) a copy of the Corresponding Source for all the + software in the product that is covered by this License, on a + durable physical medium customarily used for software + interchange, for a price no more than your reasonable cost of + physically performing this conveying of source, or (2) access + to copy the Corresponding Source from a network server at no + charge. + + c. Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, + and only if you received the object code with such an offer, + in accord with subsection 6b. + + d. Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to + the Corresponding Source in the same way through the same + place at no further charge. You need not require recipients + to copy the Corresponding Source along with the object code. + If the place to copy the object code is a network server, the + Corresponding Source may be on a different server (operated by + you or a third party) that supports equivalent copying + facilities, provided you maintain clear directions next to the + object code saying where to find the Corresponding Source. + Regardless of what server hosts the Corresponding Source, you + remain obligated to ensure that it is available for as long as + needed to satisfy these requirements. + + e. Convey the object code using peer-to-peer transmission, + provided you inform other peers where the object code and + Corresponding Source of the work are being offered to the + general public at no charge under subsection 6d. + + A separable portion of the object code, whose source code is + excluded from the Corresponding Source as a System Library, need + not be included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means + any tangible personal property which is normally used for personal, + family, or household purposes, or (2) anything designed or sold for + incorporation into a dwelling. In determining whether a product is + a consumer product, doubtful cases shall be resolved in favor of + coverage. For a particular product received by a particular user, + "normally used" refers to a typical or common use of that class of + product, regardless of the status of the particular user or of the + way in which the particular user actually uses, or expects or is + expected to use, the product. A product is a consumer product + regardless of whether the product has substantial commercial, + industrial or non-consumer uses, unless such uses represent the + only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, + procedures, authorization keys, or other information required to + install and execute modified versions of a covered work in that + User Product from a modified version of its Corresponding Source. + The information must suffice to ensure that the continued + functioning of the modified object code is in no case prevented or + interfered with solely because modification has been made. + + If you convey an object code work under this section in, or with, + or specifically for use in, a User Product, and the conveying + occurs as part of a transaction in which the right of possession + and use of the User Product is transferred to the recipient in + perpetuity or for a fixed term (regardless of how the transaction + is characterized), the Corresponding Source conveyed under this + section must be accompanied by the Installation Information. But + this requirement does not apply if neither you nor any third party + retains the ability to install modified object code on the User + Product (for example, the work has been installed in ROM). + + The requirement to provide Installation Information does not + include a requirement to continue to provide support service, + warranty, or updates for a work that has been modified or installed + by the recipient, or for the User Product in which it has been + modified or installed. Access to a network may be denied when the + modification itself materially and adversely affects the operation + of the network or violates the rules and protocols for + communication across the network. + + Corresponding Source conveyed, and Installation Information + provided, in accord with this section must be in a format that is + publicly documented (and with an implementation available to the + public in source code form), and must require no special password + or key for unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of + this License by making exceptions from one or more of its + conditions. Additional permissions that are applicable to the + entire Program shall be treated as though they were included in + this License, to the extent that they are valid under applicable + law. If additional permissions apply only to part of the Program, + that part may be used separately under those permissions, but the + entire Program remains governed by this License without regard to + the additional permissions. + + When you convey a copy of a covered work, you may at your option + remove any additional permissions from that copy, or from any part + of it. (Additional permissions may be written to require their own + removal in certain cases when you modify the work.) You may place + additional permissions on material, added by you to a covered work, + for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material + you add to a covered work, you may (if authorized by the copyright + holders of that material) supplement the terms of this License with + terms: + + a. Disclaiming warranty or limiting liability differently from + the terms of sections 15 and 16 of this License; or + + b. Requiring preservation of specified reasonable legal notices + or author attributions in that material or in the Appropriate + Legal Notices displayed by works containing it; or + + c. Prohibiting misrepresentation of the origin of that material, + or requiring that modified versions of such material be marked + in reasonable ways as different from the original version; or + + d. Limiting the use for publicity purposes of names of licensors + or authors of the material; or + + e. Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f. Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified + versions of it) with contractual assumptions of liability to + the recipient, for any liability that these contractual + assumptions directly impose on those licensors and authors. + + All other non-permissive additional terms are considered "further + restrictions" within the meaning of section 10. If the Program as + you received it, or any part of it, contains a notice stating that + it is governed by this License along with a term that is a further + restriction, you may remove that term. If a license document + contains a further restriction but permits relicensing or conveying + under this License, you may add to a covered work material governed + by the terms of that license document, provided that the further + restriction does not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you + must place, in the relevant source files, a statement of the + additional terms that apply to those files, or a notice indicating + where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in + the form of a separately written license, or stated as exceptions; + the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly + provided under this License. Any attempt otherwise to propagate or + modify it is void, and will automatically terminate your rights + under this License (including any patent licenses granted under the + third paragraph of section 11). + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, you do not qualify to receive new licenses + for the same material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or + run a copy of the Program. Ancillary propagation of a covered work + occurring solely as a consequence of using peer-to-peer + transmission to receive a copy likewise does not require + acceptance. However, nothing other than this License grants you + permission to propagate or modify any covered work. These actions + infringe copyright if you do not accept this License. Therefore, + by modifying or propagating a covered work, you indicate your + acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically + receives a license from the original licensors, to run, modify and + propagate that work, subject to this License. You are not + responsible for enforcing compliance by third parties with this + License. + + An "entity transaction" is a transaction transferring control of an + organization, or substantially all assets of one, or subdividing an + organization, or merging organizations. If propagation of a + covered work results from an entity transaction, each party to that + transaction who receives a copy of the work also receives whatever + licenses to the work the party's predecessor in interest had or + could give under the previous paragraph, plus a right to possession + of the Corresponding Source of the work from the predecessor in + interest, if the predecessor has it or can get it with reasonable + efforts. + + You may not impose any further restrictions on the exercise of the + rights granted or affirmed under this License. For example, you + may not impose a license fee, royalty, or other charge for exercise + of rights granted under this License, and you may not initiate + litigation (including a cross-claim or counterclaim in a lawsuit) + alleging that any patent claim is infringed by making, using, + selling, offering for sale, or importing the Program or any portion + of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this + License of the Program or a work on which the Program is based. + The work thus licensed is called the contributor's "contributor + version". + + A contributor's "essential patent claims" are all patent claims + owned or controlled by the contributor, whether already acquired or + hereafter acquired, that would be infringed by some manner, + permitted by this License, of making, using, or selling its + contributor version, but do not include claims that would be + infringed only as a consequence of further modification of the + contributor version. For purposes of this definition, "control" + includes the right to grant patent sublicenses in a manner + consistent with the requirements of this License. + + Each contributor grants you a non-exclusive, worldwide, + royalty-free patent license under the contributor's essential + patent claims, to make, use, sell, offer for sale, import and + otherwise run, modify and propagate the contents of its contributor + version. + + In the following three paragraphs, a "patent license" is any + express agreement or commitment, however denominated, not to + enforce a patent (such as an express permission to practice a + patent or covenant not to sue for patent infringement). To "grant" + such a patent license to a party means to make such an agreement or + commitment not to enforce a patent against the party. + + If you convey a covered work, knowingly relying on a patent + license, and the Corresponding Source of the work is not available + for anyone to copy, free of charge and under the terms of this + License, through a publicly available network server or other + readily accessible means, then you must either (1) cause the + Corresponding Source to be so available, or (2) arrange to deprive + yourself of the benefit of the patent license for this particular + work, or (3) arrange, in a manner consistent with the requirements + of this License, to extend the patent license to downstream + recipients. "Knowingly relying" means you have actual knowledge + that, but for the patent license, your conveying the covered work + in a country, or your recipient's use of the covered work in a + country, would infringe one or more identifiable patents in that + country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or + arrangement, you convey, or propagate by procuring conveyance of, a + covered work, and grant a patent license to some of the parties + receiving the covered work authorizing them to use, propagate, + modify or convey a specific copy of the covered work, then the + patent license you grant is automatically extended to all + recipients of the covered work and works based on it. + + A patent license is "discriminatory" if it does not include within + the scope of its coverage, prohibits the exercise of, or is + conditioned on the non-exercise of one or more of the rights that + are specifically granted under this License. You may not convey a + covered work if you are a party to an arrangement with a third + party that is in the business of distributing software, under which + you make payment to the third party based on the extent of your + activity of conveying the work, and under which the third party + grants, to any of the parties who would receive the covered work + from you, a discriminatory patent license (a) in connection with + copies of the covered work conveyed by you (or copies made from + those copies), or (b) primarily for and in connection with specific + products or compilations that contain the covered work, unless you + entered into that arrangement, or that patent license was granted, + prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting + any implied license or other defenses to infringement that may + otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement + or otherwise) that contradict the conditions of this License, they + do not excuse you from the conditions of this License. If you + cannot convey a covered work so as to satisfy simultaneously your + obligations under this License and any other pertinent obligations, + then as a consequence you may not convey it at all. For example, + if you agree to terms that obligate you to collect a royalty for + further conveying from those to whom you convey the Program, the + only way you could satisfy both those terms and this License would + be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have + permission to link or combine any covered work with a work licensed + under version 3 of the GNU Affero General Public License into a + single combined work, and to convey the resulting work. The terms + of this License will continue to apply to the part which is the + covered work, but the special requirements of the GNU Affero + General Public License, section 13, concerning interaction through + a network will apply to the combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new + versions of the GNU General Public License from time to time. Such + new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies that a certain numbered version of the GNU + General Public License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that numbered version or of any later version published by the Free + Software Foundation. If the Program does not specify a version + number of the GNU General Public License, you may choose any + version ever published by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future + versions of the GNU General Public License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Program. + + Later license versions may give you additional or different + permissions. However, no additional obligations are imposed on any + author or copyright holder as a result of your choosing to follow a + later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE + COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" + WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE + RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. + SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL + NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES + AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR + DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR + CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE + THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA + BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER + PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF + THE POSSIBILITY OF SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided + above cannot be given local legal effect according to their terms, + reviewing courts shall apply local law that most closely + approximates an absolute waiver of all civil liability in + connection with the Program, unless a warranty or assumption of + liability accompanies a copy of the Program in return for a fee. + +END OF TERMS AND CONDITIONS +=========================== + +How to Apply These Terms to Your New Programs +============================================= + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively state +the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YEAR NAME OF AUTHOR + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at + your option) any later version. + + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. + + Also add information on how to contact you by electronic and paper +mail. + + If the program does terminal interaction, make it output a short notice +like this when it starts in an interactive mode: + + PROGRAM Copyright (C) YEAR NAME OF AUTHOR + This program comes with ABSOLUTELY NO WARRANTY; for details type 'show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type 'show c' for details. + + The hypothetical commands 'show w' and 'show c' should show the +appropriate parts of the General Public License. Of course, your +program's commands might be different; for a GUI interface, you would +use an "about box". + + You should also get your employer (if you work as a programmer) or +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. For more information on this, and how to apply and follow +the GNU GPL, see <http://www.gnu.org/licenses/>. + + The GNU General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Lesser General Public License instead of this License. But first, +please read <http://www.gnu.org/philosophy/why-not-lgpl.html>. + + +File: gcc.info, Node: GNU Free Documentation License, Next: Contributors, Prev: Copying, Up: Top + +GNU Free Documentation License +****************************** + + Version 1.3, 3 November 2008 + + Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc. + <http://fsf.org/> + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. We + recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it can + be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You accept + the license if you copy, modify or distribute the work in a way + requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in the + notice that says that the Document is released under this License. + If a section does not fit the above definition of Secondary then it + is not allowed to be designated as Invariant. The Document may + contain zero Invariant Sections. If the Document does not identify + any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images composed + of pixels) generic paint programs or (for drawings) some widely + available drawing editor, and that is suitable for input to text + formatters or for automatic translation to a variety of formats + suitable for input to text formatters. A copy made in an otherwise + Transparent file format whose markup, or absence of markup, has + been arranged to thwart or discourage subsequent modification by + readers is not Transparent. An image format is not Transparent if + used for any substantial amount of text. A copy that is not + "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and standard-conforming + simple HTML, PostScript or PDF designed for human modification. + Examples of transparent image formats include PNG, XCF and JPG. + Opaque formats include proprietary formats that can be read and + edited only by proprietary word processors, SGML or XML for which + the DTD and/or processing tools are not generally available, and + the machine-generated HTML, PostScript or PDF produced by some word + processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + The "publisher" means any person or entity that distributes copies + of the Document to the public. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow the + conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the title + equally prominent and visible. You may add other material on the + covers in addition. Copying with changes limited to the covers, as + long as they preserve the title of the Document and satisfy these + conditions, can be treated as verbatim copying in other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a machine-readable + Transparent copy along with each Opaque copy, or state in or with + each Opaque copy a computer-network location from which the general + network-using public has access to download using public-standard + network protocols a complete Transparent copy of the Document, free + of added material. If you use the latter option, you must take + reasonably prudent steps, when you begin distribution of Opaque + copies in quantity, to ensure that this Transparent copy will + remain thus accessible at the stated location until at least one + year after the last time you distribute an Opaque copy (directly or + through your agents or retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of copies, + to give them a chance to provide you with an updated version of the + Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with the + Modified Version filling the role of the Document, thus licensing + distribution and modification of the Modified Version to whoever + possesses a copy of it. In addition, you must do these things in + the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of previous + versions (which should, if there were any, be listed in the + History section of the Document). You may use the same title + as a previous version if the original publisher of that + version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on the + Title Page. If there is no section Entitled "History" in the + Document, create one stating the title, year, authors, and + publisher of the Document as given on its Title Page, then add + an item describing the Modified Version as stated in the + previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in the + "History" section. You may omit a network location for a work + that was published at least four years before the Document + itself, or if the original publisher of the version it refers + to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the section + all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, unaltered + in their text and in their titles. Section numbers or the + equivalent are not considered part of the section titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option designate + some or all of these sections as invariant. To do this, add their + titles to the list of Invariant Sections in the Modified Version's + license notice. These titles must be distinct from any other + section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end of + the list of Cover Texts in the Modified Version. Only one passage + of Front-Cover Text and one of Back-Cover Text may be added by (or + through arrangements made by) any one entity. If the Document + already includes a cover text for the same cover, previously added + by you or by arrangement made by the same entity you are acting on + behalf of, you may not add another; but you may replace the old + one, on explicit permission from the previous publisher that added + the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination all + of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the documents + in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow this + License in all other respects regarding verbatim copying of that + document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of a + storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense, or distribute it is void, + and will automatically terminate your rights under this License. + + However, if you cease all violation of this License, then your + license from a particular copyright holder is reinstated (a) + provisionally, unless and until the copyright holder explicitly and + finally terminates your license, and (b) permanently, if the + copyright holder fails to notify you of the violation by some + reasonable means prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is + reinstated permanently if the copyright holder notifies you of the + violation by some reasonable means, this is the first time you have + received notice of violation of this License (for any work) from + that copyright holder, and you cure the violation prior to 30 days + after your receipt of the notice. + + Termination of your rights under this section does not terminate + the licenses of parties who have received copies or rights from you + under this License. If your rights have been terminated and not + permanently reinstated, receipt of a copy of some or all of the + same material does not give you any rights to use it. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + <http://www.gnu.org/copyleft/>. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If the + Document does not specify a version number of this License, you may + choose any version ever published (not as a draft) by the Free + Software Foundation. If the Document specifies that a proxy can + decide which future versions of this License can be used, that + proxy's public statement of acceptance of a version permanently + authorizes you to choose that version for the Document. + + 11. RELICENSING + + "Massive Multiauthor Collaboration Site" (or "MMC Site") means any + World Wide Web server that publishes copyrightable works and also + provides prominent facilities for anybody to edit those works. A + public wiki that anybody can edit is an example of such a server. + A "Massive Multiauthor Collaboration" (or "MMC") contained in the + site means any set of copyrightable works thus published on the MMC + site. + + "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0 + license published by Creative Commons Corporation, a not-for-profit + corporation with a principal place of business in San Francisco, + California, as well as future copyleft versions of that license + published by that same organization. + + "Incorporate" means to publish or republish a Document, in whole or + in part, as part of another Document. + + An MMC is "eligible for relicensing" if it is licensed under this + License, and if all works that were first published under this + License somewhere other than this MMC, and subsequently + incorporated in whole or in part into the MMC, (1) had no cover + texts or invariant sections, and (2) were thus incorporated prior + to November 1, 2008. + + The operator of an MMC Site may republish an MMC contained in the + site under CC-BY-SA on the same site at any time before August 1, + 2009, provided the MMC is eligible for relicensing. + +ADDENDUM: How to use this License for your documents +==================================================== + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.3 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover + Texts. A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of free +software license, such as the GNU General Public License, to permit +their use in free software. + + +File: gcc.info, Node: Contributors, Next: Option Index, Prev: GNU Free Documentation License, Up: Top + +Contributors to GCC +******************* + +The GCC project would like to thank its many contributors. Without them +the project would not have been nearly as successful as it has been. +Any omissions in this list are accidental. Feel free to contact +<law@redhat.com> or <gerald@pfeifer.com> if you have been left out or +some of your contributions are not listed. Please keep this list in +alphabetical order. + + * Analog Devices helped implement the support for complex data types + and iterators. + + * John David Anglin for threading-related fixes and improvements to + libstdc++-v3, and the HP-UX port. + + * James van Artsdalen wrote the code that makes efficient use of the + Intel 80387 register stack. + + * Abramo and Roberto Bagnara for the SysV68 Motorola 3300 Delta + Series port. + + * Alasdair Baird for various bug fixes. + + * Giovanni Bajo for analyzing lots of complicated C++ problem + reports. + + * Peter Barada for his work to improve code generation for new + ColdFire cores. + + * Gerald Baumgartner added the signature extension to the C++ front + end. + + * Godmar Back for his Java improvements and encouragement. + + * Scott Bambrough for help porting the Java compiler. + + * Wolfgang Bangerth for processing tons of bug reports. + + * Jon Beniston for his Microsoft Windows port of Java and port to + Lattice Mico32. + + * Daniel Berlin for better DWARF2 support, faster/better + optimizations, improved alias analysis, plus migrating GCC to + Bugzilla. + + * Geoff Berry for his Java object serialization work and various + patches. + + * David Binderman tests weekly snapshots of GCC trunk against Fedora + Rawhide for several architectures. + + * Uros Bizjak for the implementation of x87 math built-in functions + and for various middle end and i386 back end improvements and bug + fixes. + + * Eric Blake for helping to make GCJ and libgcj conform to the + specifications. + + * Janne Blomqvist for contributions to GNU Fortran. + + * Segher Boessenkool for various fixes. + + * Hans-J. Boehm for his garbage collector, IA-64 libffi port, and + other Java work. + + * Neil Booth for work on cpplib, lang hooks, debug hooks and other + miscellaneous clean-ups. + + * Steven Bosscher for integrating the GNU Fortran front end into GCC + and for contributing to the tree-ssa branch. + + * Eric Botcazou for fixing middle- and backend bugs left and right. + + * Per Bothner for his direction via the steering committee and + various improvements to the infrastructure for supporting new + languages. Chill front end implementation. Initial + implementations of cpplib, fix-header, config.guess, libio, and + past C++ library (libg++) maintainer. Dreaming up, designing and + implementing much of GCJ. + + * Devon Bowen helped port GCC to the Tahoe. + + * Don Bowman for mips-vxworks contributions. + + * Dave Brolley for work on cpplib and Chill. + + * Paul Brook for work on the ARM architecture and maintaining GNU + Fortran. + + * Robert Brown implemented the support for Encore 32000 systems. + + * Christian Bruel for improvements to local store elimination. + + * Herman A.J. ten Brugge for various fixes. + + * Joerg Brunsmann for Java compiler hacking and help with the GCJ + FAQ. + + * Joe Buck for his direction via the steering committee. + + * Craig Burley for leadership of the G77 Fortran effort. + + * Stephan Buys for contributing Doxygen notes for libstdc++. + + * Paolo Carlini for libstdc++ work: lots of efficiency improvements + to the C++ strings, streambufs and formatted I/O, hard detective + work on the frustrating localization issues, and keeping up with + the problem reports. + + * John Carr for his alias work, SPARC hacking, infrastructure + improvements, previous contributions to the steering committee, + loop optimizations, etc. + + * Stephane Carrez for 68HC11 and 68HC12 ports. + + * Steve Chamberlain for support for the Renesas SH and H8 processors + and the PicoJava processor, and for GCJ config fixes. + + * Glenn Chambers for help with the GCJ FAQ. + + * John-Marc Chandonia for various libgcj patches. + + * Denis Chertykov for contributing and maintaining the AVR port, the + first GCC port for an 8-bit architecture. + + * Scott Christley for his Objective-C contributions. + + * Eric Christopher for his Java porting help and clean-ups. + + * Branko Cibej for more warning contributions. + + * The GNU Classpath project for all of their merged runtime code. + + * Nick Clifton for arm, mcore, fr30, v850, m32r, msp430 rx work, + '--help', and other random hacking. + + * Michael Cook for libstdc++ cleanup patches to reduce warnings. + + * R. Kelley Cook for making GCC buildable from a read-only directory + as well as other miscellaneous build process and documentation + clean-ups. + + * Ralf Corsepius for SH testing and minor bug fixing. + + * Stan Cox for care and feeding of the x86 port and lots of behind + the scenes hacking. + + * Alex Crain provided changes for the 3b1. + + * Ian Dall for major improvements to the NS32k port. + + * Paul Dale for his work to add uClinux platform support to the m68k + backend. + + * Dario Dariol contributed the four varieties of sample programs that + print a copy of their source. + + * Russell Davidson for fstream and stringstream fixes in libstdc++. + + * Bud Davis for work on the G77 and GNU Fortran compilers. + + * Mo DeJong for GCJ and libgcj bug fixes. + + * DJ Delorie for the DJGPP port, build and libiberty maintenance, + various bug fixes, and the M32C, MeP, MSP430, and RL78 ports. + + * Arnaud Desitter for helping to debug GNU Fortran. + + * Gabriel Dos Reis for contributions to G++, contributions and + maintenance of GCC diagnostics infrastructure, libstdc++-v3, + including 'valarray<>', 'complex<>', maintaining the numerics + library (including that pesky '<limits>' :-) and keeping up-to-date + anything to do with numbers. + + * Ulrich Drepper for his work on glibc, testing of GCC using glibc, + ISO C99 support, CFG dumping support, etc., plus support of the C++ + runtime libraries including for all kinds of C interface issues, + contributing and maintaining 'complex<>', sanity checking and + disbursement, configuration architecture, libio maintenance, and + early math work. + + * Franc,ois Dumont for his work on libstdc++-v3, especially + maintaining and improving 'debug-mode' and associative and + unordered containers. + + * Zdenek Dvorak for a new loop unroller and various fixes. + + * Michael Eager for his work on the Xilinx MicroBlaze port. + + * Richard Earnshaw for his ongoing work with the ARM. + + * David Edelsohn for his direction via the steering committee, + ongoing work with the RS6000/PowerPC port, help cleaning up Haifa + loop changes, doing the entire AIX port of libstdc++ with his bare + hands, and for ensuring GCC properly keeps working on AIX. + + * Kevin Ediger for the floating point formatting of num_put::do_put + in libstdc++. + + * Phil Edwards for libstdc++ work including configuration hackery, + documentation maintainer, chief breaker of the web pages, the + occasional iostream bug fix, and work on shared library symbol + versioning. + + * Paul Eggert for random hacking all over GCC. + + * Mark Elbrecht for various DJGPP improvements, and for libstdc++ + configuration support for locales and fstream-related fixes. + + * Vadim Egorov for libstdc++ fixes in strings, streambufs, and + iostreams. + + * Christian Ehrhardt for dealing with bug reports. + + * Ben Elliston for his work to move the Objective-C runtime into its + own subdirectory and for his work on autoconf. + + * Revital Eres for work on the PowerPC 750CL port. + + * Marc Espie for OpenBSD support. + + * Doug Evans for much of the global optimization framework, arc, + m32r, and SPARC work. + + * Christopher Faylor for his work on the Cygwin port and for caring + and feeding the gcc.gnu.org box and saving its users tons of spam. + + * Fred Fish for BeOS support and Ada fixes. + + * Ivan Fontes Garcia for the Portuguese translation of the GCJ FAQ. + + * Peter Gerwinski for various bug fixes and the Pascal front end. + + * Kaveh R. Ghazi for his direction via the steering committee, + amazing work to make '-W -Wall -W* -Werror' useful, and testing GCC + on a plethora of platforms. Kaveh extends his gratitude to the + CAIP Center at Rutgers University for providing him with computing + resources to work on Free Software from the late 1980s to 2010. + + * John Gilmore for a donation to the FSF earmarked improving GNU + Java. + + * Judy Goldberg for c++ contributions. + + * Torbjorn Granlund for various fixes and the c-torture testsuite, + multiply- and divide-by-constant optimization, improved long long + support, improved leaf function register allocation, and his + direction via the steering committee. + + * Anthony Green for his '-Os' contributions, the moxie port, and Java + front end work. + + * Stu Grossman for gdb hacking, allowing GCJ developers to debug Java + code. + + * Michael K. Gschwind contributed the port to the PDP-11. + + * Richard Biener for his ongoing middle-end contributions and bug + fixes and for release management. + + * Ron Guilmette implemented the 'protoize' and 'unprotoize' tools, + the support for Dwarf symbolic debugging information, and much of + the support for System V Release 4. He has also worked heavily on + the Intel 386 and 860 support. + + * Sumanth Gundapaneni for contributing the CR16 port. + + * Mostafa Hagog for Swing Modulo Scheduling (SMS) and post reload + GCSE. + + * Bruno Haible for improvements in the runtime overhead for EH, new + warnings and assorted bug fixes. + + * Andrew Haley for his amazing Java compiler and library efforts. + + * Chris Hanson assisted in making GCC work on HP-UX for the 9000 + series 300. + + * Michael Hayes for various thankless work he's done trying to get + the c30/c40 ports functional. Lots of loop and unroll improvements + and fixes. + + * Dara Hazeghi for wading through myriads of target-specific bug + reports. + + * Kate Hedstrom for staking the G77 folks with an initial testsuite. + + * Richard Henderson for his ongoing SPARC, alpha, ia32, and ia64 + work, loop opts, and generally fixing lots of old problems we've + ignored for years, flow rewrite and lots of further stuff, + including reviewing tons of patches. + + * Aldy Hernandez for working on the PowerPC port, SIMD support, and + various fixes. + + * Nobuyuki Hikichi of Software Research Associates, Tokyo, + contributed the support for the Sony NEWS machine. + + * Kazu Hirata for caring and feeding the Renesas H8/300 port and + various fixes. + + * Katherine Holcomb for work on GNU Fortran. + + * Manfred Hollstein for his ongoing work to keep the m88k alive, lots + of testing and bug fixing, particularly of GCC configury code. + + * Steve Holmgren for MachTen patches. + + * Mat Hostetter for work on the TILE-Gx and TILEPro ports. + + * Jan Hubicka for his x86 port improvements. + + * Falk Hueffner for working on C and optimization bug reports. + + * Bernardo Innocenti for his m68k work, including merging of ColdFire + improvements and uClinux support. + + * Christian Iseli for various bug fixes. + + * Kamil Iskra for general m68k hacking. + + * Lee Iverson for random fixes and MIPS testing. + + * Andreas Jaeger for testing and benchmarking of GCC and various bug + fixes. + + * Jakub Jelinek for his SPARC work and sibling call optimizations as + well as lots of bug fixes and test cases, and for improving the + Java build system. + + * Janis Johnson for ia64 testing and fixes, her quality improvement + sidetracks, and web page maintenance. + + * Kean Johnston for SCO OpenServer support and various fixes. + + * Tim Josling for the sample language treelang based originally on + Richard Kenner's "toy" language. + + * Nicolai Josuttis for additional libstdc++ documentation. + + * Klaus Kaempf for his ongoing work to make alpha-vms a viable + target. + + * Steven G. Kargl for work on GNU Fortran. + + * David Kashtan of SRI adapted GCC to VMS. + + * Ryszard Kabatek for many, many libstdc++ bug fixes and + optimizations of strings, especially member functions, and for + auto_ptr fixes. + + * Geoffrey Keating for his ongoing work to make the PPC work for + GNU/Linux and his automatic regression tester. + + * Brendan Kehoe for his ongoing work with G++ and for a lot of early + work in just about every part of libstdc++. + + * Oliver M. Kellogg of Deutsche Aerospace contributed the port to the + MIL-STD-1750A. + + * Richard Kenner of the New York University Ultracomputer Research + Laboratory wrote the machine descriptions for the AMD 29000, the + DEC Alpha, the IBM RT PC, and the IBM RS/6000 as well as the + support for instruction attributes. He also made changes to better + support RISC processors including changes to common subexpression + elimination, strength reduction, function calling sequence + handling, and condition code support, in addition to generalizing + the code for frame pointer elimination and delay slot scheduling. + Richard Kenner was also the head maintainer of GCC for several + years. + + * Mumit Khan for various contributions to the Cygwin and Mingw32 + ports and maintaining binary releases for Microsoft Windows hosts, + and for massive libstdc++ porting work to Cygwin/Mingw32. + + * Robin Kirkham for cpu32 support. + + * Mark Klein for PA improvements. + + * Thomas Koenig for various bug fixes. + + * Bruce Korb for the new and improved fixincludes code. + + * Benjamin Kosnik for his G++ work and for leading the libstdc++-v3 + effort. + + * Charles LaBrec contributed the support for the Integrated Solutions + 68020 system. + + * Asher Langton and Mike Kumbera for contributing Cray pointer + support to GNU Fortran, and for other GNU Fortran improvements. + + * Jeff Law for his direction via the steering committee, coordinating + the entire egcs project and GCC 2.95, rolling out snapshots and + releases, handling merges from GCC2, reviewing tons of patches that + might have fallen through the cracks else, and random but extensive + hacking. + + * Walter Lee for work on the TILE-Gx and TILEPro ports. + + * Marc Lehmann for his direction via the steering committee and + helping with analysis and improvements of x86 performance. + + * Victor Leikehman for work on GNU Fortran. + + * Ted Lemon wrote parts of the RTL reader and printer. + + * Kriang Lerdsuwanakij for C++ improvements including template as + template parameter support, and many C++ fixes. + + * Warren Levy for tremendous work on libgcj (Java Runtime Library) + and random work on the Java front end. + + * Alain Lichnewsky ported GCC to the MIPS CPU. + + * Oskar Liljeblad for hacking on AWT and his many Java bug reports + and patches. + + * Robert Lipe for OpenServer support, new testsuites, testing, etc. + + * Chen Liqin for various S+core related fixes/improvement, and for + maintaining the S+core port. + + * Weiwen Liu for testing and various bug fixes. + + * Manuel Lo'pez-Iba'n~ez for improving '-Wconversion' and many other + diagnostics fixes and improvements. + + * Dave Love for his ongoing work with the Fortran front end and + runtime libraries. + + * Martin von Lo"wis for internal consistency checking infrastructure, + various C++ improvements including namespace support, and tons of + assistance with libstdc++/compiler merges. + + * H.J. Lu for his previous contributions to the steering committee, + many x86 bug reports, prototype patches, and keeping the GNU/Linux + ports working. + + * Greg McGary for random fixes and (someday) bounded pointers. + + * Andrew MacLeod for his ongoing work in building a real EH system, + various code generation improvements, work on the global optimizer, + etc. + + * Vladimir Makarov for hacking some ugly i960 problems, PowerPC + hacking improvements to compile-time performance, overall knowledge + and direction in the area of instruction scheduling, and design and + implementation of the automaton based instruction scheduler. + + * Bob Manson for his behind the scenes work on dejagnu. + + * Philip Martin for lots of libstdc++ string and vector iterator + fixes and improvements, and string clean up and testsuites. + + * All of the Mauve project contributors, for Java test code. + + * Bryce McKinlay for numerous GCJ and libgcj fixes and improvements. + + * Adam Megacz for his work on the Microsoft Windows port of GCJ. + + * Michael Meissner for LRS framework, ia32, m32r, v850, m88k, MIPS, + powerpc, haifa, ECOFF debug support, and other assorted hacking. + + * Jason Merrill for his direction via the steering committee and + leading the G++ effort. + + * Martin Michlmayr for testing GCC on several architectures using the + entire Debian archive. + + * David Miller for his direction via the steering committee, lots of + SPARC work, improvements in jump.c and interfacing with the Linux + kernel developers. + + * Gary Miller ported GCC to Charles River Data Systems machines. + + * Alfred Minarik for libstdc++ string and ios bug fixes, and turning + the entire libstdc++ testsuite namespace-compatible. + + * Mark Mitchell for his direction via the steering committee, + mountains of C++ work, load/store hoisting out of loops, alias + analysis improvements, ISO C 'restrict' support, and serving as + release manager from 2000 to 2011. + + * Alan Modra for various GNU/Linux bits and testing. + + * Toon Moene for his direction via the steering committee, Fortran + maintenance, and his ongoing work to make us make Fortran run fast. + + * Jason Molenda for major help in the care and feeding of all the + services on the gcc.gnu.org (formerly egcs.cygnus.com) + machine--mail, web services, ftp services, etc etc. Doing all this + work on scrap paper and the backs of envelopes would have been... + difficult. + + * Catherine Moore for fixing various ugly problems we have sent her + way, including the haifa bug which was killing the Alpha & PowerPC + Linux kernels. + + * Mike Moreton for his various Java patches. + + * David Mosberger-Tang for various Alpha improvements, and for the + initial IA-64 port. + + * Stephen Moshier contributed the floating point emulator that + assists in cross-compilation and permits support for floating point + numbers wider than 64 bits and for ISO C99 support. + + * Bill Moyer for his behind the scenes work on various issues. + + * Philippe De Muyter for his work on the m68k port. + + * Joseph S. Myers for his work on the PDP-11 port, format checking + and ISO C99 support, and continuous emphasis on (and contributions + to) documentation. + + * Nathan Myers for his work on libstdc++-v3: architecture and + authorship through the first three snapshots, including + implementation of locale infrastructure, string, shadow C headers, + and the initial project documentation (DESIGN, CHECKLIST, and so + forth). Later, more work on MT-safe string and shadow headers. + + * Felix Natter for documentation on porting libstdc++. + + * Nathanael Nerode for cleaning up the configuration/build process. + + * NeXT, Inc. donated the front end that supports the Objective-C + language. + + * Hans-Peter Nilsson for the CRIS and MMIX ports, improvements to the + search engine setup, various documentation fixes and other small + fixes. + + * Geoff Noer for his work on getting cygwin native builds working. + + * Diego Novillo for his work on Tree SSA, OpenMP, SPEC performance + tracking web pages, GIMPLE tuples, and assorted fixes. + + * David O'Brien for the FreeBSD/alpha, FreeBSD/AMD x86-64, + FreeBSD/ARM, FreeBSD/PowerPC, and FreeBSD/SPARC64 ports and related + infrastructure improvements. + + * Alexandre Oliva for various build infrastructure improvements, + scripts and amazing testing work, including keeping libtool issues + sane and happy. + + * Stefan Olsson for work on mt_alloc. + + * Melissa O'Neill for various NeXT fixes. + + * Rainer Orth for random MIPS work, including improvements to GCC's + o32 ABI support, improvements to dejagnu's MIPS support, Java + configuration clean-ups and porting work, and maintaining the IRIX, + Solaris 2, and Tru64 UNIX ports. + + * Hartmut Penner for work on the s390 port. + + * Paul Petersen wrote the machine description for the Alliant FX/8. + + * Alexandre Petit-Bianco for implementing much of the Java compiler + and continued Java maintainership. + + * Matthias Pfaller for major improvements to the NS32k port. + + * Gerald Pfeifer for his direction via the steering committee, + pointing out lots of problems we need to solve, maintenance of the + web pages, and taking care of documentation maintenance in general. + + * Andrew Pinski for processing bug reports by the dozen. + + * Ovidiu Predescu for his work on the Objective-C front end and + runtime libraries. + + * Jerry Quinn for major performance improvements in C++ formatted + I/O. + + * Ken Raeburn for various improvements to checker, MIPS ports and + various cleanups in the compiler. + + * Rolf W. Rasmussen for hacking on AWT. + + * David Reese of Sun Microsystems contributed to the Solaris on + PowerPC port. + + * Volker Reichelt for keeping up with the problem reports. + + * Joern Rennecke for maintaining the sh port, loop, regmove & reload + hacking and developing and maintaining the Epiphany port. + + * Loren J. Rittle for improvements to libstdc++-v3 including the + FreeBSD port, threading fixes, thread-related configury changes, + critical threading documentation, and solutions to really tricky + I/O problems, as well as keeping GCC properly working on FreeBSD + and continuous testing. + + * Craig Rodrigues for processing tons of bug reports. + + * Ola Ro"nnerup for work on mt_alloc. + + * Gavin Romig-Koch for lots of behind the scenes MIPS work. + + * David Ronis inspired and encouraged Craig to rewrite the G77 + documentation in texinfo format by contributing a first pass at a + translation of the old 'g77-0.5.16/f/DOC' file. + + * Ken Rose for fixes to GCC's delay slot filling code. + + * Paul Rubin wrote most of the preprocessor. + + * Pe'tur Runo'lfsson for major performance improvements in C++ + formatted I/O and large file support in C++ filebuf. + + * Chip Salzenberg for libstdc++ patches and improvements to locales, + traits, Makefiles, libio, libtool hackery, and "long long" support. + + * Juha Sarlin for improvements to the H8 code generator. + + * Greg Satz assisted in making GCC work on HP-UX for the 9000 series + 300. + + * Roger Sayle for improvements to constant folding and GCC's RTL + optimizers as well as for fixing numerous bugs. + + * Bradley Schatz for his work on the GCJ FAQ. + + * Peter Schauer wrote the code to allow debugging to work on the + Alpha. + + * William Schelter did most of the work on the Intel 80386 support. + + * Tobias Schlu"ter for work on GNU Fortran. + + * Bernd Schmidt for various code generation improvements and major + work in the reload pass, serving as release manager for GCC 2.95.3, + and work on the Blackfin and C6X ports. + + * Peter Schmid for constant testing of libstdc++--especially + application testing, going above and beyond what was requested for + the release criteria--and libstdc++ header file tweaks. + + * Jason Schroeder for jcf-dump patches. + + * Andreas Schwab for his work on the m68k port. + + * Lars Segerlund for work on GNU Fortran. + + * Dodji Seketeli for numerous C++ bug fixes and debug info + improvements. + + * Tim Shen for major work on '<regex>'. + + * Joel Sherrill for his direction via the steering committee, RTEMS + contributions and RTEMS testing. + + * Nathan Sidwell for many C++ fixes/improvements. + + * Jeffrey Siegal for helping RMS with the original design of GCC, + some code which handles the parse tree and RTL data structures, + constant folding and help with the original VAX & m68k ports. + + * Kenny Simpson for prompting libstdc++ fixes due to defect reports + from the LWG (thereby keeping GCC in line with updates from the + ISO). + + * Franz Sirl for his ongoing work with making the PPC port stable for + GNU/Linux. + + * Andrey Slepuhin for assorted AIX hacking. + + * Trevor Smigiel for contributing the SPU port. + + * Christopher Smith did the port for Convex machines. + + * Danny Smith for his major efforts on the Mingw (and Cygwin) ports. + + * Randy Smith finished the Sun FPA support. + + * Ed Smith-Rowland for his continuous work on libstdc++-v3, special + functions, '<random>', and various improvements to C++11 features. + + * Scott Snyder for queue, iterator, istream, and string fixes and + libstdc++ testsuite entries. Also for providing the patch to G77 + to add rudimentary support for 'INTEGER*1', 'INTEGER*2', and + 'LOGICAL*1'. + + * Zdenek Sojka for running automated regression testing of GCC and + reporting numerous bugs. + + * Jayant Sonar for contributing the CR16 port. + + * Brad Spencer for contributions to the GLIBCPP_FORCE_NEW technique. + + * Richard Stallman, for writing the original GCC and launching the + GNU project. + + * Jan Stein of the Chalmers Computer Society provided support for + Genix, as well as part of the 32000 machine description. + + * Nigel Stephens for various mips16 related fixes/improvements. + + * Jonathan Stone wrote the machine description for the Pyramid + computer. + + * Graham Stott for various infrastructure improvements. + + * John Stracke for his Java HTTP protocol fixes. + + * Mike Stump for his Elxsi port, G++ contributions over the years and + more recently his vxworks contributions + + * Jeff Sturm for Java porting help, bug fixes, and encouragement. + + * Shigeya Suzuki for this fixes for the bsdi platforms. + + * Ian Lance Taylor for the Go frontend, the initial mips16 and mips64 + support, general configury hacking, fixincludes, etc. + + * Holger Teutsch provided the support for the Clipper CPU. + + * Gary Thomas for his ongoing work to make the PPC work for + GNU/Linux. + + * Philipp Thomas for random bug fixes throughout the compiler + + * Jason Thorpe for thread support in libstdc++ on NetBSD. + + * Kresten Krab Thorup wrote the run time support for the Objective-C + language and the fantastic Java bytecode interpreter. + + * Michael Tiemann for random bug fixes, the first instruction + scheduler, initial C++ support, function integration, NS32k, SPARC + and M88k machine description work, delay slot scheduling. + + * Andreas Tobler for his work porting libgcj to Darwin. + + * Teemu Torma for thread safe exception handling support. + + * Leonard Tower wrote parts of the parser, RTL generator, and RTL + definitions, and of the VAX machine description. + + * Daniel Towner and Hariharan Sandanagobalane contributed and + maintain the picoChip port. + + * Tom Tromey for internationalization support and for his many Java + contributions and libgcj maintainership. + + * Lassi Tuura for improvements to config.guess to determine HP + processor types. + + * Petter Urkedal for libstdc++ CXXFLAGS, math, and algorithms fixes. + + * Andy Vaught for the design and initial implementation of the GNU + Fortran front end. + + * Brent Verner for work with the libstdc++ cshadow files and their + associated configure steps. + + * Todd Vierling for contributions for NetBSD ports. + + * Jonathan Wakely for contributing libstdc++ Doxygen notes and XHTML + guidance. + + * Dean Wakerley for converting the install documentation from HTML to + texinfo in time for GCC 3.0. + + * Krister Walfridsson for random bug fixes. + + * Feng Wang for contributions to GNU Fortran. + + * Stephen M. Webb for time and effort on making libstdc++ shadow + files work with the tricky Solaris 8+ headers, and for pushing the + build-time header tree. Also, for starting and driving the + '<regex>' effort. + + * John Wehle for various improvements for the x86 code generator, + related infrastructure improvements to help x86 code generation, + value range propagation and other work, WE32k port. + + * Ulrich Weigand for work on the s390 port. + + * Zack Weinberg for major work on cpplib and various other bug fixes. + + * Matt Welsh for help with Linux Threads support in GCJ. + + * Urban Widmark for help fixing java.io. + + * Mark Wielaard for new Java library code and his work integrating + with Classpath. + + * Dale Wiles helped port GCC to the Tahoe. + + * Bob Wilson from Tensilica, Inc. for the Xtensa port. + + * Jim Wilson for his direction via the steering committee, tackling + hard problems in various places that nobody else wanted to work on, + strength reduction and other loop optimizations. + + * Paul Woegerer and Tal Agmon for the CRX port. + + * Carlo Wood for various fixes. + + * Tom Wood for work on the m88k port. + + * Chung-Ju Wu for his work on the Andes NDS32 port. + + * Canqun Yang for work on GNU Fortran. + + * Masanobu Yuhara of Fujitsu Laboratories implemented the machine + description for the Tron architecture (specifically, the Gmicro). + + * Kevin Zachmann helped port GCC to the Tahoe. + + * Ayal Zaks for Swing Modulo Scheduling (SMS). + + * Xiaoqiang Zhang for work on GNU Fortran. + + * Gilles Zunino for help porting Java to Irix. + + The following people are recognized for their contributions to GNAT, +the Ada front end of GCC: + * Bernard Banner + + * Romain Berrendonner + + * Geert Bosch + + * Emmanuel Briot + + * Joel Brobecker + + * Ben Brosgol + + * Vincent Celier + + * Arnaud Charlet + + * Chien Chieng + + * Cyrille Comar + + * Cyrille Crozes + + * Robert Dewar + + * Gary Dismukes + + * Robert Duff + + * Ed Falis + + * Ramon Fernandez + + * Sam Figueroa + + * Vasiliy Fofanov + + * Michael Friess + + * Franco Gasperoni + + * Ted Giering + + * Matthew Gingell + + * Laurent Guerby + + * Jerome Guitton + + * Olivier Hainque + + * Jerome Hugues + + * Hristian Kirtchev + + * Jerome Lambourg + + * Bruno Leclerc + + * Albert Lee + + * Sean McNeil + + * Javier Miranda + + * Laurent Nana + + * Pascal Obry + + * Dong-Ik Oh + + * Laurent Pautet + + * Brett Porter + + * Thomas Quinot + + * Nicolas Roche + + * Pat Rogers + + * Jose Ruiz + + * Douglas Rupp + + * Sergey Rybin + + * Gail Schenker + + * Ed Schonberg + + * Nicolas Setton + + * Samuel Tardieu + + The following people are recognized for their contributions of new +features, bug reports, testing and integration of classpath/libgcj for +GCC version 4.1: + * Lillian Angel for 'JTree' implementation and lots Free Swing + additions and bug fixes. + + * Wolfgang Baer for 'GapContent' bug fixes. + + * Anthony Balkissoon for 'JList', Free Swing 1.5 updates and mouse + event fixes, lots of Free Swing work including 'JTable' editing. + + * Stuart Ballard for RMI constant fixes. + + * Goffredo Baroncelli for 'HTTPURLConnection' fixes. + + * Gary Benson for 'MessageFormat' fixes. + + * Daniel Bonniot for 'Serialization' fixes. + + * Chris Burdess for lots of gnu.xml and http protocol fixes, 'StAX' + and 'DOM xml:id' support. + + * Ka-Hing Cheung for 'TreePath' and 'TreeSelection' fixes. + + * Archie Cobbs for build fixes, VM interface updates, + 'URLClassLoader' updates. + + * Kelley Cook for build fixes. + + * Martin Cordova for Suggestions for better 'SocketTimeoutException'. + + * David Daney for 'BitSet' bug fixes, 'HttpURLConnection' rewrite and + improvements. + + * Thomas Fitzsimmons for lots of upgrades to the gtk+ AWT and Cairo + 2D support. Lots of imageio framework additions, lots of AWT and + Free Swing bug fixes. + + * Jeroen Frijters for 'ClassLoader' and nio cleanups, serialization + fixes, better 'Proxy' support, bug fixes and IKVM integration. + + * Santiago Gala for 'AccessControlContext' fixes. + + * Nicolas Geoffray for 'VMClassLoader' and 'AccessController' + improvements. + + * David Gilbert for 'basic' and 'metal' icon and plaf support and + lots of documenting, Lots of Free Swing and metal theme additions. + 'MetalIconFactory' implementation. + + * Anthony Green for 'MIDI' framework, 'ALSA' and 'DSSI' providers. + + * Andrew Haley for 'Serialization' and 'URLClassLoader' fixes, gcj + build speedups. + + * Kim Ho for 'JFileChooser' implementation. + + * Andrew John Hughes for 'Locale' and net fixes, URI RFC2986 updates, + 'Serialization' fixes, 'Properties' XML support and generic branch + work, VMIntegration guide update. + + * Bastiaan Huisman for 'TimeZone' bug fixing. + + * Andreas Jaeger for mprec updates. + + * Paul Jenner for better '-Werror' support. + + * Ito Kazumitsu for 'NetworkInterface' implementation and updates. + + * Roman Kennke for 'BoxLayout', 'GrayFilter' and 'SplitPane', plus + bug fixes all over. Lots of Free Swing work including styled text. + + * Simon Kitching for 'String' cleanups and optimization suggestions. + + * Michael Koch for configuration fixes, 'Locale' updates, bug and + build fixes. + + * Guilhem Lavaux for configuration, thread and channel fixes and + Kaffe integration. JCL native 'Pointer' updates. Logger bug + fixes. + + * David Lichteblau for JCL support library global/local reference + cleanups. + + * Aaron Luchko for JDWP updates and documentation fixes. + + * Ziga Mahkovec for 'Graphics2D' upgraded to Cairo 0.5 and new regex + features. + + * Sven de Marothy for BMP imageio support, CSS and 'TextLayout' + fixes. 'GtkImage' rewrite, 2D, awt, free swing and date/time fixes + and implementing the Qt4 peers. + + * Casey Marshall for crypto algorithm fixes, 'FileChannel' lock, + 'SystemLogger' and 'FileHandler' rotate implementations, NIO + 'FileChannel.map' support, security and policy updates. + + * Bryce McKinlay for RMI work. + + * Audrius Meskauskas for lots of Free Corba, RMI and HTML work plus + testing and documenting. + + * Kalle Olavi Niemitalo for build fixes. + + * Rainer Orth for build fixes. + + * Andrew Overholt for 'File' locking fixes. + + * Ingo Proetel for 'Image', 'Logger' and 'URLClassLoader' updates. + + * Olga Rodimina for 'MenuSelectionManager' implementation. + + * Jan Roehrich for 'BasicTreeUI' and 'JTree' fixes. + + * Julian Scheid for documentation updates and gjdoc support. + + * Christian Schlichtherle for zip fixes and cleanups. + + * Robert Schuster for documentation updates and beans fixes, + 'TreeNode' enumerations and 'ActionCommand' and various fixes, XML + and URL, AWT and Free Swing bug fixes. + + * Keith Seitz for lots of JDWP work. + + * Christian Thalinger for 64-bit cleanups, Configuration and VM + interface fixes and 'CACAO' integration, 'fdlibm' updates. + + * Gael Thomas for 'VMClassLoader' boot packages support suggestions. + + * Andreas Tobler for Darwin and Solaris testing and fixing, 'Qt4' + support for Darwin/OS X, 'Graphics2D' support, 'gtk+' updates. + + * Dalibor Topic for better 'DEBUG' support, build cleanups and Kaffe + integration. 'Qt4' build infrastructure, 'SHA1PRNG' and + 'GdkPixbugDecoder' updates. + + * Tom Tromey for Eclipse integration, generics work, lots of bug + fixes and gcj integration including coordinating The Big Merge. + + * Mark Wielaard for bug fixes, packaging and release management, + 'Clipboard' implementation, system call interrupts and network + timeouts and 'GdkPixpufDecoder' fixes. + + In addition to the above, all of which also contributed time and energy +in testing GCC, we would like to thank the following for their +contributions to testing: + + * Michael Abd-El-Malek + + * Thomas Arend + + * Bonzo Armstrong + + * Steven Ashe + + * Chris Baldwin + + * David Billinghurst + + * Jim Blandy + + * Stephane Bortzmeyer + + * Horst von Brand + + * Frank Braun + + * Rodney Brown + + * Sidney Cadot + + * Bradford Castalia + + * Robert Clark + + * Jonathan Corbet + + * Ralph Doncaster + + * Richard Emberson + + * Levente Farkas + + * Graham Fawcett + + * Mark Fernyhough + + * Robert A. French + + * Jo"rgen Freyh + + * Mark K. Gardner + + * Charles-Antoine Gauthier + + * Yung Shing Gene + + * David Gilbert + + * Simon Gornall + + * Fred Gray + + * John Griffin + + * Patrik Hagglund + + * Phil Hargett + + * Amancio Hasty + + * Takafumi Hayashi + + * Bryan W. Headley + + * Kevin B. Hendricks + + * Joep Jansen + + * Christian Joensson + + * Michel Kern + + * David Kidd + + * Tobias Kuipers + + * Anand Krishnaswamy + + * A. O. V. Le Blanc + + * llewelly + + * Damon Love + + * Brad Lucier + + * Matthias Klose + + * Martin Knoblauch + + * Rick Lutowski + + * Jesse Macnish + + * Stefan Morrell + + * Anon A. Mous + + * Matthias Mueller + + * Pekka Nikander + + * Rick Niles + + * Jon Olson + + * Magnus Persson + + * Chris Pollard + + * Richard Polton + + * Derk Reefman + + * David Rees + + * Paul Reilly + + * Tom Reilly + + * Torsten Rueger + + * Danny Sadinoff + + * Marc Schifer + + * Erik Schnetter + + * Wayne K. Schroll + + * David Schuler + + * Vin Shelton + + * Tim Souder + + * Adam Sulmicki + + * Bill Thorson + + * George Talbot + + * Pedro A. M. Vazquez + + * Gregory Warnes + + * Ian Watson + + * David E. Young + + * And many others + + And finally we'd like to thank everyone who uses the compiler, provides +feedback and generally reminds us why we're doing this work in the first +place. + + +File: gcc.info, Node: Option Index, Next: Keyword Index, Prev: Contributors, Up: Top + +Option Index +************ + +GCC's command line options are indexed here without any initial '-' or +'--'. Where an option has both positive and negative forms (such as +'-fOPTION' and '-fno-OPTION'), relevant entries in the manual are +indexed under the most appropriate form; it may sometimes be useful to +look up both forms. + + +* Menu: + +* ###: Overall Options. (line 209) +* (fvtv-debug): C++ Dialect Options. + (line 362) +* -fno-keep-inline-dllexport: Optimize Options. (line 309) +* -mcpu: RX Options. (line 30) +* -mcpu=: MSP430 Options. (line 35) +* -mpointer-size=SIZE: VMS Options. (line 20) +* 8bit-idiv: i386 and x86-64 Options. + (line 917) +* A: Preprocessor Options. + (line 596) +* allowable_client: Darwin Options. (line 196) +* all_load: Darwin Options. (line 110) +* ansi: Standards. (line 16) +* ansi <1>: C Dialect Options. (line 11) +* ansi <2>: Preprocessor Options. + (line 340) +* ansi <3>: Other Builtins. (line 21) +* ansi <4>: Non-bugs. (line 107) +* arch_errors_fatal: Darwin Options. (line 114) +* aux-info: C Dialect Options. (line 173) +* avx256-split-unaligned-load: i386 and x86-64 Options. + (line 925) +* avx256-split-unaligned-store: i386 and x86-64 Options. + (line 925) +* B: Directory Options. (line 44) +* Bdynamic: VxWorks Options. (line 22) +* bind_at_load: Darwin Options. (line 118) +* Bstatic: VxWorks Options. (line 22) +* bundle: Darwin Options. (line 123) +* bundle_loader: Darwin Options. (line 127) +* c: Overall Options. (line 164) +* C: Preprocessor Options. + (line 653) +* c <1>: Link Options. (line 20) +* client_name: Darwin Options. (line 196) +* compatibility_version: Darwin Options. (line 196) +* coverage: Debugging Options. (line 491) +* current_version: Darwin Options. (line 196) +* d: Debugging Options. (line 622) +* D: Preprocessor Options. + (line 46) +* da: Debugging Options. (line 825) +* dA: Debugging Options. (line 828) +* dD: Debugging Options. (line 832) +* dD <1>: Preprocessor Options. + (line 627) +* dead_strip: Darwin Options. (line 196) +* dependency-file: Darwin Options. (line 196) +* dH: Debugging Options. (line 836) +* dI: Preprocessor Options. + (line 636) +* dM: Preprocessor Options. + (line 612) +* dN: Preprocessor Options. + (line 633) +* dp: Debugging Options. (line 839) +* dP: Debugging Options. (line 844) +* dU: Preprocessor Options. + (line 640) +* dumpmachine: Debugging Options. (line 1410) +* dumpspecs: Debugging Options. (line 1418) +* dumpversion: Debugging Options. (line 1414) +* dx: Debugging Options. (line 848) +* dylib_file: Darwin Options. (line 196) +* dylinker_install_name: Darwin Options. (line 196) +* dynamic: Darwin Options. (line 196) +* dynamiclib: Darwin Options. (line 131) +* E: Overall Options. (line 185) +* E <1>: Link Options. (line 20) +* EB: ARC Options. (line 345) +* EB <1>: MIPS Options. (line 7) +* EL: ARC Options. (line 354) +* EL <1>: MIPS Options. (line 10) +* exported_symbols_list: Darwin Options. (line 196) +* F: Darwin Options. (line 31) +* fabi-version: C++ Dialect Options. + (line 19) +* fada-spec-parent: Overall Options. (line 367) +* faggressive-loop-optimizations: Optimize Options. (line 478) +* falign-functions: Optimize Options. (line 1472) +* falign-jumps: Optimize Options. (line 1521) +* falign-labels: Optimize Options. (line 1490) +* falign-loops: Optimize Options. (line 1508) +* fallow-parameterless-variadic-functions: C Dialect Options. + (line 189) +* fassociative-math: Optimize Options. (line 2000) +* fasynchronous-unwind-tables: Code Gen Options. (line 145) +* fauto-inc-dec: Optimize Options. (line 502) +* fbounds-check: Code Gen Options. (line 15) +* fbranch-probabilities: Optimize Options. (line 2128) +* fbranch-target-load-optimize: Optimize Options. (line 2243) +* fbranch-target-load-optimize2: Optimize Options. (line 2249) +* fbtr-bb-exclusive: Optimize Options. (line 2253) +* fcall-saved: Code Gen Options. (line 355) +* fcall-used: Code Gen Options. (line 341) +* fcaller-saves: Optimize Options. (line 810) +* fcheck-data-deps: Optimize Options. (line 1089) +* fcheck-new: C++ Dialect Options. + (line 54) +* fcilkplus: C Dialect Options. (line 276) +* fcombine-stack-adjustments: Optimize Options. (line 822) +* fcommon: Variable Attributes. + (line 104) +* fcompare-debug: Debugging Options. (line 282) +* fcompare-debug-second: Debugging Options. (line 308) +* fcompare-elim: Optimize Options. (line 1836) +* fcond-mismatch: C Dialect Options. (line 339) +* fconserve-stack: Optimize Options. (line 828) +* fconstant-string-class: Objective-C and Objective-C++ Dialect Options. + (line 30) +* fconstexpr-depth: C++ Dialect Options. + (line 64) +* fcprop-registers: Optimize Options. (line 1854) +* fcrossjumping: Optimize Options. (line 495) +* fcse-follow-jumps: Optimize Options. (line 414) +* fcse-skip-blocks: Optimize Options. (line 423) +* fcx-fortran-rules: Optimize Options. (line 2115) +* fcx-limited-range: Optimize Options. (line 2103) +* fdata-sections: Optimize Options. (line 2224) +* fdbg-cnt: Debugging Options. (line 543) +* fdbg-cnt-list: Debugging Options. (line 540) +* fdce: Optimize Options. (line 508) +* fdebug-cpp: Preprocessor Options. + (line 527) +* fdebug-prefix-map: Debugging Options. (line 402) +* fdebug-types-section: Debugging Options. (line 79) +* fdeclone-ctor-dtor: Optimize Options. (line 531) +* fdeduce-init-list: C++ Dialect Options. + (line 70) +* fdelayed-branch: Optimize Options. (line 657) +* fdelete-dead-exceptions: Code Gen Options. (line 130) +* fdelete-null-pointer-checks: Optimize Options. (line 542) +* fdevirtualize: Optimize Options. (line 560) +* fdevirtualize-speculatively: Optimize Options. (line 567) +* fdiagnostics-color: Language Independent Options. + (line 35) +* fdiagnostics-show-caret: Language Independent Options. + (line 92) +* fdiagnostics-show-location: Language Independent Options. + (line 20) +* fdiagnostics-show-option: Language Independent Options. + (line 86) +* fdirectives-only: Preprocessor Options. + (line 475) +* fdisable-: Debugging Options. (line 553) +* fdollars-in-identifiers: Preprocessor Options. + (line 496) +* fdollars-in-identifiers <1>: Interoperation. (line 141) +* fdse: Optimize Options. (line 512) +* fdump-ada-spec: Overall Options. (line 362) +* fdump-class-hierarchy: Debugging Options. (line 879) +* fdump-final-insns: Debugging Options. (line 276) +* fdump-go-spec: Overall Options. (line 371) +* fdump-ipa: Debugging Options. (line 887) +* fdump-noaddr: Debugging Options. (line 852) +* fdump-passes: Debugging Options. (line 904) +* fdump-rtl-alignments: Debugging Options. (line 643) +* fdump-rtl-all: Debugging Options. (line 825) +* fdump-rtl-asmcons: Debugging Options. (line 646) +* fdump-rtl-auto_inc_dec: Debugging Options. (line 650) +* fdump-rtl-barriers: Debugging Options. (line 654) +* fdump-rtl-bbpart: Debugging Options. (line 657) +* fdump-rtl-bbro: Debugging Options. (line 660) +* fdump-rtl-btl2: Debugging Options. (line 664) +* fdump-rtl-btl2 <1>: Debugging Options. (line 664) +* fdump-rtl-bypass: Debugging Options. (line 668) +* fdump-rtl-ce1: Debugging Options. (line 679) +* fdump-rtl-ce2: Debugging Options. (line 679) +* fdump-rtl-ce3: Debugging Options. (line 679) +* fdump-rtl-combine: Debugging Options. (line 671) +* fdump-rtl-compgotos: Debugging Options. (line 674) +* fdump-rtl-cprop_hardreg: Debugging Options. (line 683) +* fdump-rtl-csa: Debugging Options. (line 686) +* fdump-rtl-cse1: Debugging Options. (line 690) +* fdump-rtl-cse2: Debugging Options. (line 690) +* fdump-rtl-dbr: Debugging Options. (line 697) +* fdump-rtl-dce: Debugging Options. (line 694) +* fdump-rtl-dce1: Debugging Options. (line 701) +* fdump-rtl-dce2: Debugging Options. (line 701) +* fdump-rtl-dfinish: Debugging Options. (line 821) +* fdump-rtl-dfinit: Debugging Options. (line 821) +* fdump-rtl-eh: Debugging Options. (line 705) +* fdump-rtl-eh_ranges: Debugging Options. (line 708) +* fdump-rtl-expand: Debugging Options. (line 711) +* fdump-rtl-fwprop1: Debugging Options. (line 715) +* fdump-rtl-fwprop2: Debugging Options. (line 715) +* fdump-rtl-gcse1: Debugging Options. (line 720) +* fdump-rtl-gcse2: Debugging Options. (line 720) +* fdump-rtl-init-regs: Debugging Options. (line 724) +* fdump-rtl-initvals: Debugging Options. (line 727) +* fdump-rtl-into_cfglayout: Debugging Options. (line 730) +* fdump-rtl-ira: Debugging Options. (line 733) +* fdump-rtl-jump: Debugging Options. (line 736) +* fdump-rtl-loop2: Debugging Options. (line 739) +* fdump-rtl-mach: Debugging Options. (line 743) +* fdump-rtl-mode_sw: Debugging Options. (line 747) +* fdump-rtl-outof_cfglayout: Debugging Options. (line 753) +* fdump-rtl-PASS: Debugging Options. (line 622) +* fdump-rtl-peephole2: Debugging Options. (line 756) +* fdump-rtl-postreload: Debugging Options. (line 759) +* fdump-rtl-pro_and_epilogue: Debugging Options. (line 762) +* fdump-rtl-ree: Debugging Options. (line 770) +* fdump-rtl-regclass: Debugging Options. (line 821) +* fdump-rtl-rnreg: Debugging Options. (line 750) +* fdump-rtl-sched1: Debugging Options. (line 766) +* fdump-rtl-sched2: Debugging Options. (line 766) +* fdump-rtl-seqabstr: Debugging Options. (line 773) +* fdump-rtl-shorten: Debugging Options. (line 776) +* fdump-rtl-sibling: Debugging Options. (line 779) +* fdump-rtl-sms: Debugging Options. (line 791) +* fdump-rtl-split1: Debugging Options. (line 786) +* fdump-rtl-split2: Debugging Options. (line 786) +* fdump-rtl-split3: Debugging Options. (line 786) +* fdump-rtl-split4: Debugging Options. (line 786) +* fdump-rtl-split5: Debugging Options. (line 786) +* fdump-rtl-stack: Debugging Options. (line 795) +* fdump-rtl-subreg1: Debugging Options. (line 801) +* fdump-rtl-subreg2: Debugging Options. (line 801) +* fdump-rtl-subregs_of_mode_finish: Debugging Options. (line 821) +* fdump-rtl-subregs_of_mode_init: Debugging Options. (line 821) +* fdump-rtl-unshare: Debugging Options. (line 805) +* fdump-rtl-vartrack: Debugging Options. (line 808) +* fdump-rtl-vregs: Debugging Options. (line 811) +* fdump-rtl-web: Debugging Options. (line 814) +* fdump-statistics: Debugging Options. (line 908) +* fdump-translation-unit: Debugging Options. (line 870) +* fdump-tree: Debugging Options. (line 920) +* fdump-tree-alias: Debugging Options. (line 1042) +* fdump-tree-all: Debugging Options. (line 1126) +* fdump-tree-ccp: Debugging Options. (line 1046) +* fdump-tree-cfg: Debugging Options. (line 1030) +* fdump-tree-ch: Debugging Options. (line 1034) +* fdump-tree-copyprop: Debugging Options. (line 1062) +* fdump-tree-copyrename: Debugging Options. (line 1102) +* fdump-tree-dce: Debugging Options. (line 1070) +* fdump-tree-dom: Debugging Options. (line 1083) +* fdump-tree-dse: Debugging Options. (line 1088) +* fdump-tree-forwprop: Debugging Options. (line 1097) +* fdump-tree-fre: Debugging Options. (line 1058) +* fdump-tree-gimple: Debugging Options. (line 1025) +* fdump-tree-nrv: Debugging Options. (line 1107) +* fdump-tree-optimized: Debugging Options. (line 1022) +* fdump-tree-original: Debugging Options. (line 1019) +* fdump-tree-phiopt: Debugging Options. (line 1092) +* fdump-tree-pre: Debugging Options. (line 1054) +* fdump-tree-sink: Debugging Options. (line 1079) +* fdump-tree-slp: Debugging Options. (line 1117) +* fdump-tree-sra: Debugging Options. (line 1074) +* fdump-tree-ssa: Debugging Options. (line 1038) +* fdump-tree-storeccp: Debugging Options. (line 1050) +* fdump-tree-store_copyprop: Debugging Options. (line 1066) +* fdump-tree-vect: Debugging Options. (line 1112) +* fdump-tree-vrp: Debugging Options. (line 1122) +* fdump-unnumbered: Debugging Options. (line 858) +* fdump-unnumbered-links: Debugging Options. (line 864) +* fdwarf2-cfi-asm: Debugging Options. (line 406) +* fearly-inlining: Optimize Options. (line 268) +* feliminate-dwarf2-dups: Debugging Options. (line 321) +* feliminate-unused-debug-symbols: Debugging Options. (line 67) +* feliminate-unused-debug-types: Debugging Options. (line 1422) +* femit-struct-debug-baseonly: Debugging Options. (line 326) +* femit-struct-debug-reduced: Debugging Options. (line 339) +* fenable-: Debugging Options. (line 553) +* fexceptions: Code Gen Options. (line 108) +* fexcess-precision: Optimize Options. (line 1927) +* fexec-charset: Preprocessor Options. + (line 554) +* fexpensive-optimizations: Optimize Options. (line 576) +* fext-numeric-literals: C++ Dialect Options. + (line 587) +* fextended-identifiers: Preprocessor Options. + (line 499) +* fextern-tls-init: C++ Dialect Options. + (line 120) +* ffast-math: Optimize Options. (line 1950) +* ffat-lto-objects: Optimize Options. (line 1818) +* ffinite-math-only: Optimize Options. (line 2027) +* ffix-and-continue: Darwin Options. (line 104) +* ffixed: Code Gen Options. (line 329) +* ffloat-store: Optimize Options. (line 1913) +* ffloat-store <1>: Disappointments. (line 77) +* ffor-scope: C++ Dialect Options. + (line 141) +* fforward-propagate: Optimize Options. (line 178) +* ffp-contract: Optimize Options. (line 187) +* ffreestanding: Standards. (line 92) +* ffreestanding <1>: C Dialect Options. (line 252) +* ffreestanding <2>: Warning Options. (line 252) +* ffreestanding <3>: Function Attributes. + (line 493) +* ffriend-injection: C++ Dialect Options. + (line 91) +* ffunction-sections: Optimize Options. (line 2224) +* fgcse: Optimize Options. (line 437) +* fgcse-after-reload: Optimize Options. (line 473) +* fgcse-las: Optimize Options. (line 466) +* fgcse-lm: Optimize Options. (line 448) +* fgcse-sm: Optimize Options. (line 457) +* fgnu-runtime: Objective-C and Objective-C++ Dialect Options. + (line 39) +* fgnu-tm: C Dialect Options. (line 286) +* fgnu89-inline: C Dialect Options. (line 152) +* fgraphite-identity: Optimize Options. (line 1069) +* fhosted: C Dialect Options. (line 244) +* fif-conversion: Optimize Options. (line 516) +* fif-conversion2: Optimize Options. (line 525) +* filelist: Darwin Options. (line 196) +* findirect-data: Darwin Options. (line 104) +* findirect-inlining: Optimize Options. (line 241) +* finhibit-size-directive: Code Gen Options. (line 250) +* finline-functions: Optimize Options. (line 249) +* finline-functions-called-once: Optimize Options. (line 260) +* finline-limit: Optimize Options. (line 284) +* finline-small-functions: Optimize Options. (line 232) +* finput-charset: Preprocessor Options. + (line 567) +* finstrument-functions: Code Gen Options. (line 385) +* finstrument-functions <1>: Function Attributes. + (line 1085) +* finstrument-functions-exclude-file-list: Code Gen Options. (line 420) +* finstrument-functions-exclude-function-list: Code Gen Options. + (line 441) +* fipa-cp: Optimize Options. (line 894) +* fipa-cp-clone: Optimize Options. (line 902) +* fipa-profile: Optimize Options. (line 886) +* fipa-pta: Optimize Options. (line 880) +* fipa-pure-const: Optimize Options. (line 872) +* fipa-reference: Optimize Options. (line 876) +* fipa-sra: Optimize Options. (line 277) +* fira-hoist-pressure: Optimize Options. (line 624) +* fira-loop-pressure: Optimize Options. (line 631) +* fira-verbose: Optimize Options. (line 651) +* fivopts: Optimize Options. (line 1165) +* fkeep-inline-functions: Optimize Options. (line 315) +* fkeep-inline-functions <1>: Inline. (line 51) +* fkeep-static-consts: Optimize Options. (line 322) +* flat_namespace: Darwin Options. (line 196) +* flax-vector-conversions: C Dialect Options. (line 344) +* fleading-underscore: Code Gen Options. (line 523) +* flive-range-shrinkage: Optimize Options. (line 590) +* floop-block: Optimize Options. (line 1040) +* floop-interchange: Optimize Options. (line 995) +* floop-nest-optimize: Optimize Options. (line 1077) +* floop-parallelize-all: Optimize Options. (line 1083) +* floop-strip-mine: Optimize Options. (line 1019) +* flto: Optimize Options. (line 1575) +* flto-partition: Optimize Options. (line 1769) +* fmax-errors: Warning Options. (line 18) +* fmem-report: Debugging Options. (line 430) +* fmem-report-wpa: Debugging Options. (line 434) +* fmerge-all-constants: Optimize Options. (line 341) +* fmerge-constants: Optimize Options. (line 331) +* fmerge-debug-strings: Debugging Options. (line 395) +* fmessage-length: Language Independent Options. + (line 14) +* fmodulo-sched: Optimize Options. (line 352) +* fmodulo-sched-allow-regmoves: Optimize Options. (line 357) +* fmove-loop-invariants: Optimize Options. (line 2214) +* fms-extensions: C Dialect Options. (line 301) +* fms-extensions <1>: C++ Dialect Options. + (line 175) +* fms-extensions <2>: Unnamed Fields. (line 36) +* fnext-runtime: Objective-C and Objective-C++ Dialect Options. + (line 43) +* fno-access-control: C++ Dialect Options. + (line 50) +* fno-asm: C Dialect Options. (line 196) +* fno-branch-count-reg: Optimize Options. (line 364) +* fno-builtin: C Dialect Options. (line 210) +* fno-builtin <1>: Warning Options. (line 252) +* fno-builtin <2>: Function Attributes. + (line 493) +* fno-builtin <3>: Other Builtins. (line 14) +* fno-canonical-system-headers: Preprocessor Options. + (line 504) +* fno-common: Code Gen Options. (line 228) +* fno-common <1>: Variable Attributes. + (line 104) +* fno-compare-debug: Debugging Options. (line 282) +* fno-debug-types-section: Debugging Options. (line 79) +* fno-default-inline: Inline. (line 71) +* fno-defer-pop: Optimize Options. (line 170) +* fno-diagnostics-show-caret: Language Independent Options. + (line 92) +* fno-diagnostics-show-option: Language Independent Options. + (line 86) +* fno-dwarf2-cfi-asm: Debugging Options. (line 406) +* fno-elide-constructors: C++ Dialect Options. + (line 104) +* fno-eliminate-unused-debug-types: Debugging Options. (line 1422) +* fno-enforce-eh-specs: C++ Dialect Options. + (line 110) +* fno-ext-numeric-literals: C++ Dialect Options. + (line 587) +* fno-extern-tls-init: C++ Dialect Options. + (line 120) +* fno-for-scope: C++ Dialect Options. + (line 141) +* fno-function-cse: Optimize Options. (line 374) +* fno-gnu-keywords: C++ Dialect Options. + (line 153) +* fno-gnu-unique: Code Gen Options. (line 151) +* fno-guess-branch-probability: Optimize Options. (line 1342) +* fno-ident: Code Gen Options. (line 247) +* fno-implement-inlines: C++ Dialect Options. + (line 170) +* fno-implement-inlines <1>: C++ Interface. (line 75) +* fno-implicit-inline-templates: C++ Dialect Options. + (line 164) +* fno-implicit-templates: C++ Dialect Options. + (line 158) +* fno-implicit-templates <1>: Template Instantiation. + (line 78) +* fno-inline: Optimize Options. (line 224) +* fno-ira-share-save-slots: Optimize Options. (line 639) +* fno-ira-share-spill-slots: Optimize Options. (line 645) +* fno-jump-tables: Code Gen Options. (line 321) +* fno-math-errno: Optimize Options. (line 1964) +* fno-merge-debug-strings: Debugging Options. (line 395) +* fno-nil-receivers: Objective-C and Objective-C++ Dialect Options. + (line 49) +* fno-nonansi-builtins: C++ Dialect Options. + (line 180) +* fno-operator-names: C++ Dialect Options. + (line 196) +* fno-optional-diags: C++ Dialect Options. + (line 200) +* fno-peephole: Optimize Options. (line 1333) +* fno-peephole2: Optimize Options. (line 1333) +* fno-pretty-templates: C++ Dialect Options. + (line 210) +* fno-rtti: C++ Dialect Options. + (line 227) +* fno-sched-interblock: Optimize Options. (line 683) +* fno-sched-spec: Optimize Options. (line 688) +* fno-set-stack-executable: i386 and x86-64 Windows Options. + (line 46) +* fno-show-column: Preprocessor Options. + (line 591) +* fno-signed-bitfields: C Dialect Options. (line 377) +* fno-signed-zeros: Optimize Options. (line 2039) +* fno-stack-limit: Code Gen Options. (line 491) +* fno-threadsafe-statics: C++ Dialect Options. + (line 264) +* fno-toplevel-reorder: Optimize Options. (line 1541) +* fno-trapping-math: Optimize Options. (line 2049) +* fno-unsigned-bitfields: C Dialect Options. (line 377) +* fno-use-cxa-get-exception-ptr: C++ Dialect Options. + (line 277) +* fno-var-tracking-assignments: Debugging Options. (line 1330) +* fno-var-tracking-assignments-toggle: Debugging Options. (line 1339) +* fno-weak: C++ Dialect Options. + (line 389) +* fno-working-directory: Preprocessor Options. + (line 577) +* fno-writable-relocated-rdata: i386 and x86-64 Windows Options. + (line 53) +* fno-zero-initialized-in-bss: Optimize Options. (line 385) +* fnon-call-exceptions: Code Gen Options. (line 122) +* fnothrow-opt: C++ Dialect Options. + (line 185) +* fobjc-abi-version: Objective-C and Objective-C++ Dialect Options. + (line 56) +* fobjc-call-cxx-cdtors: Objective-C and Objective-C++ Dialect Options. + (line 67) +* fobjc-direct-dispatch: Objective-C and Objective-C++ Dialect Options. + (line 92) +* fobjc-exceptions: Objective-C and Objective-C++ Dialect Options. + (line 96) +* fobjc-gc: Objective-C and Objective-C++ Dialect Options. + (line 105) +* fobjc-nilcheck: Objective-C and Objective-C++ Dialect Options. + (line 111) +* fobjc-std: Objective-C and Objective-C++ Dialect Options. + (line 120) +* fomit-frame-pointer: Optimize Options. (line 198) +* fopenmp: C Dialect Options. (line 263) +* fopenmp-simd: C Dialect Options. (line 272) +* fopt-info: Debugging Options. (line 1132) +* foptimize-sibling-calls: Optimize Options. (line 219) +* force_cpusubtype_ALL: Darwin Options. (line 135) +* force_flat_namespace: Darwin Options. (line 196) +* fpack-struct: Code Gen Options. (line 372) +* fpartial-inlining: Optimize Options. (line 1308) +* fpcc-struct-return: Code Gen Options. (line 164) +* fpcc-struct-return <1>: Incompatibilities. (line 170) +* fpch-deps: Preprocessor Options. + (line 296) +* fpch-preprocess: Preprocessor Options. + (line 304) +* fpeel-loops: Optimize Options. (line 2206) +* fpermissive: C++ Dialect Options. + (line 205) +* fpic: Code Gen Options. (line 278) +* fPIC: Code Gen Options. (line 299) +* fpie: Code Gen Options. (line 312) +* fPIE: Code Gen Options. (line 312) +* fplan9-extensions: Unnamed Fields. (line 43) +* fplugin: Overall Options. (line 351) +* fplugin-arg: Overall Options. (line 358) +* fpost-ipa-mem-report: Debugging Options. (line 439) +* fpre-ipa-mem-report: Debugging Options. (line 438) +* fpredictive-commoning: Optimize Options. (line 1315) +* fprefetch-loop-arrays: Optimize Options. (line 1322) +* fpreprocessed: Preprocessor Options. + (line 508) +* fprofile-arcs: Debugging Options. (line 476) +* fprofile-arcs <1>: Other Builtins. (line 253) +* fprofile-correction: Optimize Options. (line 1861) +* fprofile-dir: Optimize Options. (line 1868) +* fprofile-generate: Optimize Options. (line 1879) +* fprofile-reorder-functions: Optimize Options. (line 2156) +* fprofile-report: Debugging Options. (line 443) +* fprofile-use: Optimize Options. (line 1893) +* fprofile-values: Optimize Options. (line 2147) +* fpu: RX Options. (line 17) +* frandom-seed: Debugging Options. (line 1224) +* freciprocal-math: Optimize Options. (line 2017) +* frecord-gcc-switches: Code Gen Options. (line 266) +* free: Optimize Options. (line 582) +* freg-struct-return: Code Gen Options. (line 182) +* frename-registers: Optimize Options. (line 2173) +* freorder-blocks: Optimize Options. (line 1359) +* freorder-blocks-and-partition: Optimize Options. (line 1365) +* freorder-functions: Optimize Options. (line 1378) +* freplace-objc-classes: Objective-C and Objective-C++ Dialect Options. + (line 131) +* frepo: C++ Dialect Options. + (line 222) +* frepo <1>: Template Instantiation. + (line 54) +* frerun-cse-after-loop: Optimize Options. (line 431) +* freschedule-modulo-scheduled-loops: Optimize Options. (line 782) +* frounding-math: Optimize Options. (line 2064) +* fsanitize=address: Debugging Options. (line 187) +* fsanitize=integer-divide-by-zero: Debugging Options. (line 228) +* fsanitize=leak: Debugging Options. (line 206) +* fsanitize=null: Debugging Options. (line 247) +* fsanitize=return: Debugging Options. (line 255) +* fsanitize=shift: Debugging Options. (line 221) +* fsanitize=signed-integer-overflow: Debugging Options. (line 262) +* fsanitize=thread: Debugging Options. (line 197) +* fsanitize=undefined: Debugging Options. (line 216) +* fsanitize=unreachable: Debugging Options. (line 233) +* fsanitize=vla-bound: Debugging Options. (line 240) +* fsched-critical-path-heuristic: Optimize Options. (line 748) +* fsched-dep-count-heuristic: Optimize Options. (line 775) +* fsched-group-heuristic: Optimize Options. (line 742) +* fsched-last-insn-heuristic: Optimize Options. (line 768) +* fsched-pressure: Optimize Options. (line 693) +* fsched-rank-heuristic: Optimize Options. (line 761) +* fsched-spec-insn-heuristic: Optimize Options. (line 754) +* fsched-spec-load: Optimize Options. (line 702) +* fsched-spec-load-dangerous: Optimize Options. (line 707) +* fsched-stalled-insns: Optimize Options. (line 713) +* fsched-stalled-insns-dep: Optimize Options. (line 723) +* fsched-verbose: Debugging Options. (line 1234) +* fsched2-use-superblocks: Optimize Options. (line 732) +* fschedule-insns: Optimize Options. (line 664) +* fschedule-insns2: Optimize Options. (line 674) +* fsection-anchors: Optimize Options. (line 2274) +* fsel-sched-pipelining: Optimize Options. (line 795) +* fsel-sched-pipelining-outer-loops: Optimize Options. (line 800) +* fselective-scheduling: Optimize Options. (line 787) +* fselective-scheduling2: Optimize Options. (line 791) +* fshort-double: Code Gen Options. (line 210) +* fshort-enums: Code Gen Options. (line 200) +* fshort-enums <1>: Structures unions enumerations and bit-fields implementation. + (line 48) +* fshort-enums <2>: Type Attributes. (line 113) +* fshort-enums <3>: Non-bugs. (line 42) +* fshort-wchar: Code Gen Options. (line 218) +* fshrink-wrap: Optimize Options. (line 805) +* fsignaling-nans: Optimize Options. (line 2084) +* fsigned-bitfields: C Dialect Options. (line 377) +* fsigned-bitfields <1>: Non-bugs. (line 57) +* fsigned-char: C Dialect Options. (line 367) +* fsigned-char <1>: Characters implementation. + (line 31) +* fsimd-cost-model: Optimize Options. (line 1256) +* fsingle-precision-constant: Optimize Options. (line 2099) +* fsplit-ivs-in-unroller: Optimize Options. (line 1289) +* fsplit-stack: Code Gen Options. (line 505) +* fsplit-stack <1>: Function Attributes. + (line 1090) +* fsplit-wide-types: Optimize Options. (line 406) +* fstack-check: Code Gen Options. (line 453) +* fstack-limit-register: Code Gen Options. (line 491) +* fstack-limit-symbol: Code Gen Options. (line 491) +* fstack-protector: Optimize Options. (line 2257) +* fstack-protector-all: Optimize Options. (line 2266) +* fstack-protector-strong: Optimize Options. (line 2269) +* fstack-usage: Debugging Options. (line 447) +* fstack_reuse: Code Gen Options. (line 21) +* fstats: C++ Dialect Options. + (line 237) +* fstrict-aliasing: Optimize Options. (line 1391) +* fstrict-enums: C++ Dialect Options. + (line 242) +* fstrict-overflow: Optimize Options. (line 1437) +* fstrict-volatile-bitfields: Code Gen Options. (line 611) +* fsync-libcalls: Code Gen Options. (line 643) +* fsyntax-only: Warning Options. (line 14) +* ftabstop: Preprocessor Options. + (line 521) +* ftemplate-backtrace-limit: C++ Dialect Options. + (line 251) +* ftemplate-depth: C++ Dialect Options. + (line 255) +* ftest-coverage: Debugging Options. (line 531) +* fthread-jumps: Optimize Options. (line 397) +* ftime-report: Debugging Options. (line 426) +* ftls-model: Code Gen Options. (line 534) +* ftracer: Optimize Options. (line 1272) +* ftracer <1>: Optimize Options. (line 2183) +* ftrack-macro-expansion: Preprocessor Options. + (line 536) +* ftrapv: Code Gen Options. (line 96) +* ftree-bit-ccp: Optimize Options. (line 930) +* ftree-builtin-call-dce: Optimize Options. (line 958) +* ftree-ccp: Optimize Options. (line 936) +* ftree-ch: Optimize Options. (line 978) +* ftree-coalesce-inlined-vars: Optimize Options. (line 1196) +* ftree-coalesce-vars: Optimize Options. (line 1206) +* ftree-copy-prop: Optimize Options. (line 867) +* ftree-copyrename: Optimize Options. (line 1189) +* ftree-dce: Optimize Options. (line 954) +* ftree-dominator-opts: Optimize Options. (line 964) +* ftree-dse: Optimize Options. (line 971) +* ftree-forwprop: Optimize Options. (line 846) +* ftree-fre: Optimize Options. (line 850) +* ftree-loop-im: Optimize Options. (line 1150) +* ftree-loop-ivcanon: Optimize Options. (line 1159) +* ftree-loop-linear: Optimize Options. (line 989) +* ftree-loop-optimize: Optimize Options. (line 985) +* ftree-loop-vectorize: Optimize Options. (line 1234) +* ftree-parallelize-loops: Optimize Options. (line 1170) +* ftree-partial-pre: Optimize Options. (line 842) +* ftree-phiprop: Optimize Options. (line 857) +* ftree-pre: Optimize Options. (line 838) +* ftree-pta: Optimize Options. (line 1179) +* ftree-reassoc: Optimize Options. (line 834) +* ftree-sink: Optimize Options. (line 926) +* ftree-slp-vectorize: Optimize Options. (line 1238) +* ftree-slsr: Optimize Options. (line 1223) +* ftree-sra: Optimize Options. (line 1183) +* ftree-ter: Optimize Options. (line 1215) +* ftree-vectorize: Optimize Options. (line 1229) +* ftree-vrp: Optimize Options. (line 1263) +* funit-at-a-time: Optimize Options. (line 1534) +* funroll-all-loops: Optimize Options. (line 1283) +* funroll-all-loops <1>: Optimize Options. (line 2200) +* funroll-loops: Optimize Options. (line 1277) +* funroll-loops <1>: Optimize Options. (line 2190) +* funsafe-loop-optimizations: Optimize Options. (line 487) +* funsafe-math-optimizations: Optimize Options. (line 1982) +* funsigned-bitfields: C Dialect Options. (line 377) +* funsigned-bitfields <1>: Structures unions enumerations and bit-fields implementation. + (line 17) +* funsigned-bitfields <2>: Non-bugs. (line 57) +* funsigned-char: C Dialect Options. (line 349) +* funsigned-char <1>: Characters implementation. + (line 31) +* funswitch-loops: Optimize Options. (line 2218) +* funwind-tables: Code Gen Options. (line 138) +* fuse-cxa-atexit: C++ Dialect Options. + (line 270) +* fuse-ld=bfd: Optimize Options. (line 1848) +* fuse-ld=gold: Optimize Options. (line 1851) +* fvar-tracking: Debugging Options. (line 1320) +* fvar-tracking-assignments: Debugging Options. (line 1330) +* fvar-tracking-assignments-toggle: Debugging Options. (line 1339) +* fvariable-expansion-in-unroller: Optimize Options. (line 1303) +* fvect-cost-model: Optimize Options. (line 1242) +* fverbose-asm: Code Gen Options. (line 257) +* fvisibility: Code Gen Options. (line 545) +* fvisibility-inlines-hidden: C++ Dialect Options. + (line 282) +* fvisibility-ms-compat: C++ Dialect Options. + (line 310) +* fvpt: Optimize Options. (line 2163) +* fvtable-verify: C++ Dialect Options. + (line 339) +* fvtv-counts: C++ Dialect Options. + (line 374) +* fweb: Optimize Options. (line 1553) +* fwhole-program: Optimize Options. (line 1564) +* fwide-exec-charset: Preprocessor Options. + (line 559) +* fworking-directory: Preprocessor Options. + (line 577) +* fwrapv: Code Gen Options. (line 100) +* fzero-link: Objective-C and Objective-C++ Dialect Options. + (line 141) +* g: Debugging Options. (line 10) +* G: M32R/D Options. (line 57) +* G <1>: MIPS Options. (line 393) +* G <2>: Nios II Options. (line 9) +* G <3>: RS/6000 and PowerPC Options. + (line 739) +* G <4>: System V Options. (line 10) +* gcoff: Debugging Options. (line 94) +* gdwarf-VERSION: Debugging Options. (line 112) +* gen-decls: Objective-C and Objective-C++ Dialect Options. + (line 153) +* gfull: Darwin Options. (line 69) +* ggdb: Debugging Options. (line 45) +* ggnu-pubnames: Debugging Options. (line 54) +* gno-record-gcc-switches: Debugging Options. (line 132) +* gno-strict-dwarf: Debugging Options. (line 142) +* gpubnames: Debugging Options. (line 51) +* grecord-gcc-switches: Debugging Options. (line 123) +* gsplit-dwarf: Debugging Options. (line 38) +* gstabs: Debugging Options. (line 59) +* gstabs+: Debugging Options. (line 88) +* gstrict-dwarf: Debugging Options. (line 136) +* gtoggle: Debugging Options. (line 179) +* gused: Darwin Options. (line 64) +* gvms: Debugging Options. (line 146) +* gxcoff: Debugging Options. (line 99) +* gxcoff+: Debugging Options. (line 104) +* H: Preprocessor Options. + (line 707) +* headerpad_max_install_names: Darwin Options. (line 196) +* help: Overall Options. (line 221) +* help <1>: Preprocessor Options. + (line 699) +* hoist-adjacent-loads: Optimize Options. (line 861) +* I: Preprocessor Options. + (line 77) +* I <1>: Directory Options. (line 10) +* I-: Preprocessor Options. + (line 389) +* I- <1>: Directory Options. (line 116) +* idirafter: Preprocessor Options. + (line 431) +* iframework: Darwin Options. (line 57) +* imacros: Preprocessor Options. + (line 422) +* image_base: Darwin Options. (line 196) +* imultilib: Preprocessor Options. + (line 456) +* include: Preprocessor Options. + (line 411) +* init: Darwin Options. (line 196) +* install_name: Darwin Options. (line 196) +* iplugindir=: Directory Options. (line 29) +* iprefix: Preprocessor Options. + (line 438) +* iquote: Preprocessor Options. + (line 468) +* iquote <1>: Directory Options. (line 34) +* isysroot: Preprocessor Options. + (line 450) +* isystem: Preprocessor Options. + (line 460) +* iwithprefix: Preprocessor Options. + (line 444) +* iwithprefixbefore: Preprocessor Options. + (line 444) +* keep_private_externs: Darwin Options. (line 196) +* l: Link Options. (line 26) +* L: Directory Options. (line 40) +* lobjc: Link Options. (line 53) +* M: Preprocessor Options. + (line 185) +* m: RS/6000 and PowerPC Options. + (line 581) +* m1: SH Options. (line 9) +* m10: PDP-11 Options. (line 29) +* m128bit-long-double: i386 and x86-64 Options. + (line 381) +* m16: i386 and x86-64 Options. + (line 940) +* m16-bit: CRIS Options. (line 64) +* m16-bit <1>: NDS32 Options. (line 39) +* m1reg-: Adapteva Epiphany Options. + (line 131) +* m2: SH Options. (line 12) +* m210: MCore Options. (line 43) +* m2a: SH Options. (line 30) +* m2a-nofpu: SH Options. (line 18) +* m2a-single: SH Options. (line 26) +* m2a-single-only: SH Options. (line 22) +* m3: SH Options. (line 34) +* m31: S/390 and zSeries Options. + (line 86) +* m32: i386 and x86-64 Options. + (line 940) +* m32 <1>: RS/6000 and PowerPC Options. + (line 274) +* m32 <2>: SPARC Options. (line 250) +* m32 <3>: TILE-Gx Options. (line 23) +* m32 <4>: TILEPro Options. (line 13) +* m32-bit: CRIS Options. (line 64) +* m32bit-doubles: RX Options. (line 10) +* m32r: M32R/D Options. (line 15) +* m32r2: M32R/D Options. (line 9) +* m32rx: M32R/D Options. (line 12) +* m340: MCore Options. (line 43) +* m3dnow: i386 and x86-64 Options. + (line 629) +* m3e: SH Options. (line 37) +* m4: SH Options. (line 51) +* m4-nofpu: SH Options. (line 40) +* m4-single: SH Options. (line 47) +* m4-single-only: SH Options. (line 43) +* m40: PDP-11 Options. (line 23) +* m45: PDP-11 Options. (line 26) +* m4a: SH Options. (line 66) +* m4a-nofpu: SH Options. (line 54) +* m4a-single: SH Options. (line 62) +* m4a-single-only: SH Options. (line 58) +* m4al: SH Options. (line 69) +* m4byte-functions: MCore Options. (line 27) +* m5200: M680x0 Options. (line 144) +* m5206e: M680x0 Options. (line 153) +* m528x: M680x0 Options. (line 157) +* m5307: M680x0 Options. (line 161) +* m5407: M680x0 Options. (line 165) +* m64: i386 and x86-64 Options. + (line 940) +* m64 <1>: RS/6000 and PowerPC Options. + (line 274) +* m64 <2>: S/390 and zSeries Options. + (line 86) +* m64 <3>: SPARC Options. (line 250) +* m64 <4>: TILE-Gx Options. (line 23) +* m64bit-doubles: RX Options. (line 10) +* m68000: M680x0 Options. (line 93) +* m68010: M680x0 Options. (line 101) +* m68020: M680x0 Options. (line 107) +* m68020-40: M680x0 Options. (line 175) +* m68020-60: M680x0 Options. (line 184) +* m68030: M680x0 Options. (line 112) +* m68040: M680x0 Options. (line 117) +* m68060: M680x0 Options. (line 126) +* m68881: M680x0 Options. (line 194) +* m8-bit: CRIS Options. (line 64) +* m8byte-align: V850 Options. (line 170) +* m96bit-long-double: i386 and x86-64 Options. + (line 381) +* mA6: ARC Options. (line 19) +* mA7: ARC Options. (line 26) +* mabi: AArch64 Options. (line 9) +* mabi <1>: ARM Options. (line 10) +* mabi <2>: i386 and x86-64 Options. + (line 799) +* mabi <3>: RS/6000 and PowerPC Options. + (line 608) +* mabi=32: MIPS Options. (line 138) +* mabi=64: MIPS Options. (line 138) +* mabi=eabi: MIPS Options. (line 138) +* mabi=elfv1: RS/6000 and PowerPC Options. + (line 629) +* mabi=elfv2: RS/6000 and PowerPC Options. + (line 635) +* mabi=gnu: MMIX Options. (line 20) +* mabi=ibmlongdouble: RS/6000 and PowerPC Options. + (line 621) +* mabi=ieeelongdouble: RS/6000 and PowerPC Options. + (line 625) +* mabi=mmixware: MMIX Options. (line 20) +* mabi=n32: MIPS Options. (line 138) +* mabi=no-spe: RS/6000 and PowerPC Options. + (line 618) +* mabi=o64: MIPS Options. (line 138) +* mabi=spe: RS/6000 and PowerPC Options. + (line 613) +* mabicalls: MIPS Options. (line 162) +* mabort-on-noreturn: ARM Options. (line 196) +* mabs=2008: MIPS Options. (line 260) +* mabs=legacy: MIPS Options. (line 260) +* mabsdiff: MeP Options. (line 7) +* mabshi: PDP-11 Options. (line 55) +* mac0: PDP-11 Options. (line 16) +* macc-4: FRV Options. (line 139) +* macc-8: FRV Options. (line 143) +* maccumulate-args: AVR Options. (line 137) +* maccumulate-outgoing-args: i386 and x86-64 Options. + (line 822) +* maccumulate-outgoing-args <1>: SH Options. (line 325) +* maddress-mode=long: i386 and x86-64 Options. + (line 987) +* maddress-mode=short: i386 and x86-64 Options. + (line 992) +* maddress-space-conversion: SPU Options. (line 68) +* mads: RS/6000 and PowerPC Options. + (line 663) +* maix-struct-return: RS/6000 and PowerPC Options. + (line 601) +* maix32: RS/6000 and PowerPC Options. + (line 312) +* maix64: RS/6000 and PowerPC Options. + (line 312) +* malign-300: H8/300 Options. (line 41) +* malign-call: ARC Options. (line 192) +* malign-double: i386 and x86-64 Options. + (line 366) +* malign-int: M680x0 Options. (line 263) +* malign-labels: FRV Options. (line 128) +* malign-loops: M32R/D Options. (line 73) +* malign-natural: RS/6000 and PowerPC Options. + (line 350) +* malign-power: RS/6000 and PowerPC Options. + (line 350) +* mall-opts: MeP Options. (line 11) +* malloc-cc: FRV Options. (line 31) +* maltivec: RS/6000 and PowerPC Options. + (line 132) +* maltivec=be: RS/6000 and PowerPC Options. + (line 148) +* maltivec=le: RS/6000 and PowerPC Options. + (line 158) +* mam33: MN10300 Options. (line 17) +* mam33-2: MN10300 Options. (line 24) +* mam34: MN10300 Options. (line 27) +* mandroid: GNU/Linux Options. (line 21) +* mannotate-align: ARC Options. (line 133) +* mapcs: ARM Options. (line 22) +* mapcs-frame: ARM Options. (line 14) +* mapp-regs: SPARC Options. (line 10) +* mapp-regs <1>: V850 Options. (line 181) +* mARC600: ARC Options. (line 19) +* mARC601: ARC Options. (line 23) +* mARC700: ARC Options. (line 26) +* march: AArch64 Options. (line 66) +* march <1>: ARM Options. (line 75) +* march <2>: C6X Options. (line 7) +* march <3>: CRIS Options. (line 10) +* march <4>: HPPA Options. (line 9) +* march <5>: HPPA Options. (line 156) +* march <6>: i386 and x86-64 Options. + (line 10) +* march <7>: M680x0 Options. (line 12) +* march <8>: MIPS Options. (line 14) +* march <9>: NDS32 Options. (line 58) +* march <10>: S/390 and zSeries Options. + (line 114) +* marclinux: ARC Options. (line 139) +* marclinux_prof: ARC Options. (line 146) +* margonaut: ARC Options. (line 341) +* marm: ARM Options. (line 266) +* mas100-syntax: RX Options. (line 76) +* masm-hex: MSP430 Options. (line 9) +* masm=DIALECT: i386 and x86-64 Options. + (line 322) +* matomic-model=MODEL: SH Options. (line 144) +* matomic-updates: SPU Options. (line 83) +* mauto-modify-reg: ARC Options. (line 195) +* mauto-pic: IA-64 Options. (line 50) +* maverage: MeP Options. (line 16) +* mavoid-indexed-addresses: RS/6000 and PowerPC Options. + (line 420) +* max-vect-align: Adapteva Epiphany Options. + (line 119) +* mb: SH Options. (line 74) +* mbackchain: S/390 and zSeries Options. + (line 35) +* mbarrel-shift-enabled: LM32 Options. (line 9) +* mbarrel-shifter: ARC Options. (line 10) +* mbarrel_shifter: ARC Options. (line 361) +* mbase-addresses: MMIX Options. (line 53) +* mbased=: MeP Options. (line 20) +* mbbit-peephole: ARC Options. (line 198) +* mbcopy: PDP-11 Options. (line 36) +* mbcopy-builtin: PDP-11 Options. (line 32) +* mbig: RS/6000 and PowerPC Options. + (line 500) +* mbig-endian: AArch64 Options. (line 20) +* mbig-endian <1>: ARC Options. (line 344) +* mbig-endian <2>: ARM Options. (line 62) +* mbig-endian <3>: C6X Options. (line 13) +* mbig-endian <4>: IA-64 Options. (line 9) +* mbig-endian <5>: MCore Options. (line 39) +* mbig-endian <6>: MicroBlaze Options. (line 57) +* mbig-endian <7>: NDS32 Options. (line 9) +* mbig-endian <8>: RS/6000 and PowerPC Options. + (line 500) +* mbig-endian <9>: TILE-Gx Options. (line 29) +* mbig-endian-data: RX Options. (line 42) +* mbig-switch: V850 Options. (line 176) +* mbigtable: SH Options. (line 89) +* mbionic: GNU/Linux Options. (line 17) +* mbit-align: RS/6000 and PowerPC Options. + (line 452) +* mbit-ops: CR16 Options. (line 25) +* mbitfield: M680x0 Options. (line 231) +* mbitops: MeP Options. (line 26) +* mbitops <1>: SH Options. (line 93) +* mblock-move-inline-limit: RS/6000 and PowerPC Options. + (line 733) +* mbranch-cheap: PDP-11 Options. (line 65) +* mbranch-cost: Adapteva Epiphany Options. + (line 18) +* mbranch-cost <1>: AVR Options. (line 152) +* mbranch-cost <2>: MIPS Options. (line 701) +* mbranch-cost=NUM: SH Options. (line 389) +* mbranch-cost=NUMBER: M32R/D Options. (line 82) +* mbranch-expensive: PDP-11 Options. (line 61) +* mbranch-hints: SPU Options. (line 29) +* mbranch-likely: MIPS Options. (line 708) +* mbranch-predict: MMIX Options. (line 48) +* mbss-plt: RS/6000 and PowerPC Options. + (line 185) +* mbuild-constants: DEC Alpha Options. (line 141) +* mbwx: DEC Alpha Options. (line 163) +* mbypass-cache: Nios II Options. (line 34) +* mc68000: M680x0 Options. (line 93) +* mc68020: M680x0 Options. (line 107) +* mc=: MeP Options. (line 31) +* mcache-block-size: NDS32 Options. (line 54) +* mcache-size: SPU Options. (line 75) +* mcache-volatile: Nios II Options. (line 40) +* mcall-eabi: RS/6000 and PowerPC Options. + (line 575) +* mcall-freebsd: RS/6000 and PowerPC Options. + (line 589) +* mcall-linux: RS/6000 and PowerPC Options. + (line 585) +* mcall-netbsd: RS/6000 and PowerPC Options. + (line 593) +* mcall-netbsd <1>: RS/6000 and PowerPC Options. + (line 597) +* mcall-prologues: AVR Options. (line 157) +* mcall-sysv: RS/6000 and PowerPC Options. + (line 567) +* mcall-sysv-eabi: RS/6000 and PowerPC Options. + (line 575) +* mcall-sysv-noeabi: RS/6000 and PowerPC Options. + (line 578) +* mcallee-super-interworking: ARM Options. (line 285) +* mcaller-super-interworking: ARM Options. (line 292) +* mcallgraph-data: MCore Options. (line 31) +* mcase-vector-pcrel: ARC Options. (line 206) +* mcbcond: SPARC Options. (line 217) +* mcc-init: CRIS Options. (line 42) +* mcfv4e: M680x0 Options. (line 169) +* mcheck-zero-division: MIPS Options. (line 503) +* mcix: DEC Alpha Options. (line 163) +* mcld: i386 and x86-64 Options. + (line 672) +* mclip: MeP Options. (line 35) +* mcmodel: SPARC Options. (line 255) +* mcmodel=kernel: i386 and x86-64 Options. + (line 971) +* mcmodel=large: AArch64 Options. (line 44) +* mcmodel=large <1>: i386 and x86-64 Options. + (line 983) +* mcmodel=large <2>: RS/6000 and PowerPC Options. + (line 126) +* mcmodel=large <3>: TILE-Gx Options. (line 14) +* mcmodel=medium: i386 and x86-64 Options. + (line 976) +* mcmodel=medium <1>: RS/6000 and PowerPC Options. + (line 122) +* mcmodel=small: AArch64 Options. (line 38) +* mcmodel=small <1>: i386 and x86-64 Options. + (line 965) +* mcmodel=small <2>: RS/6000 and PowerPC Options. + (line 118) +* mcmodel=small <3>: TILE-Gx Options. (line 9) +* mcmodel=tiny: AArch64 Options. (line 31) +* mcmov: NDS32 Options. (line 21) +* mcmove: Adapteva Epiphany Options. + (line 23) +* mcmpb: RS/6000 and PowerPC Options. + (line 27) +* mcode-readable: MIPS Options. (line 463) +* mcompact-casesi: ARC Options. (line 210) +* mcompat-align-parm: RS/6000 and PowerPC Options. + (line 889) +* mcond-exec: FRV Options. (line 187) +* mcond-move: FRV Options. (line 159) +* mconfig=: MeP Options. (line 39) +* mconsole: i386 and x86-64 Windows Options. + (line 9) +* mconst-align: CRIS Options. (line 55) +* mconst16: Xtensa Options. (line 10) +* mconstant-gp: IA-64 Options. (line 46) +* mcop: MeP Options. (line 48) +* mcop32: MeP Options. (line 53) +* mcop64: MeP Options. (line 56) +* mcorea: Blackfin Options. (line 156) +* mcoreb: Blackfin Options. (line 163) +* mcpu: AArch64 Options. (line 98) +* mcpu <1>: ARC Options. (line 14) +* mcpu <2>: ARM Options. (line 136) +* mcpu <3>: CRIS Options. (line 10) +* mcpu <4>: DEC Alpha Options. (line 215) +* mcpu <5>: FRV Options. (line 258) +* mcpu <6>: i386 and x86-64 Options. + (line 270) +* mcpu <7>: M680x0 Options. (line 28) +* mcpu <8>: picoChip Options. (line 9) +* mcpu <9>: RS/6000 and PowerPC Options. + (line 68) +* mcpu <10>: SPARC Options. (line 95) +* mcpu <11>: TILE-Gx Options. (line 18) +* mcpu <12>: TILEPro Options. (line 9) +* mcpu32: M680x0 Options. (line 135) +* mcpu=: Blackfin Options. (line 7) +* mcpu= <1>: M32C Options. (line 7) +* mcpu= <2>: MicroBlaze Options. (line 20) +* mcr16c: CR16 Options. (line 14) +* mcr16cplus: CR16 Options. (line 14) +* mcrc32: i386 and x86-64 Options. + (line 719) +* mcrypto: RS/6000 and PowerPC Options. + (line 220) +* mcsync-anomaly: Blackfin Options. (line 59) +* mctor-dtor: NDS32 Options. (line 73) +* mcustom-fpu-cfg: Nios II Options. (line 175) +* mcustom-INSN: Nios II Options. (line 61) +* mcx16: i386 and x86-64 Options. + (line 696) +* MD: Preprocessor Options. + (line 276) +* mdalign: SH Options. (line 80) +* mdata-align: CRIS Options. (line 55) +* mdata-model: CR16 Options. (line 28) +* mdc: MeP Options. (line 62) +* mdebug: M32R/D Options. (line 69) +* mdebug <1>: S/390 and zSeries Options. + (line 110) +* mdebug-main=PREFIX: VMS Options. (line 13) +* mdec-asm: PDP-11 Options. (line 72) +* mdirect-move: RS/6000 and PowerPC Options. + (line 226) +* mdisable-callt: V850 Options. (line 92) +* mdisable-fpregs: HPPA Options. (line 28) +* mdisable-indexing: HPPA Options. (line 34) +* mdiv: M680x0 Options. (line 206) +* mdiv <1>: MCore Options. (line 15) +* mdiv <2>: MeP Options. (line 65) +* mdiv=STRATEGY: SH Options. (line 236) +* mdivide-breaks: MIPS Options. (line 509) +* mdivide-enabled: LM32 Options. (line 12) +* mdivide-traps: MIPS Options. (line 509) +* mdivsi3_libfunc=NAME: SH Options. (line 331) +* mdll: i386 and x86-64 Windows Options. + (line 16) +* mdlmzb: RS/6000 and PowerPC Options. + (line 445) +* mdmx: MIPS Options. (line 336) +* mdouble: FRV Options. (line 48) +* mdouble-float: MIPS Options. (line 255) +* mdouble-float <1>: RS/6000 and PowerPC Options. + (line 368) +* mdpfp: ARC Options. (line 30) +* mdpfp-compact: ARC Options. (line 31) +* mdpfp-fast: ARC Options. (line 35) +* mdpfp_compact: ARC Options. (line 364) +* mdpfp_fast: ARC Options. (line 367) +* mdsp: MIPS Options. (line 313) +* mdsp-packa: ARC Options. (line 88) +* mdspr2: MIPS Options. (line 319) +* mdsp_packa: ARC Options. (line 370) +* mdual-nops: SPU Options. (line 95) +* mdump-tune-features: i386 and x86-64 Options. + (line 653) +* mdvbf: ARC Options. (line 92) +* mdwarf2-asm: IA-64 Options. (line 94) +* mdword: FRV Options. (line 40) +* mdynamic-no-pic: RS/6000 and PowerPC Options. + (line 505) +* mea: ARC Options. (line 43) +* mEA: ARC Options. (line 373) +* mea32: SPU Options. (line 60) +* mea64: SPU Options. (line 60) +* meabi: RS/6000 and PowerPC Options. + (line 682) +* mearly-cbranchsi: ARC Options. (line 229) +* mearly-stop-bits: IA-64 Options. (line 100) +* meb: MeP Options. (line 68) +* meb <1>: Moxie Options. (line 7) +* meb <2>: Nios II Options. (line 29) +* meb <3>: Score Options. (line 9) +* mel: MeP Options. (line 71) +* mel <1>: Moxie Options. (line 11) +* mel <2>: Nios II Options. (line 29) +* mel <3>: Score Options. (line 12) +* melf: CRIS Options. (line 87) +* melf <1>: MMIX Options. (line 43) +* memb: RS/6000 and PowerPC Options. + (line 677) +* membedded-data: MIPS Options. (line 450) +* memregs=: M32C Options. (line 21) +* mep: V850 Options. (line 16) +* mepilogue-cfi: ARC Options. (line 155) +* mepsilon: MMIX Options. (line 15) +* merror-reloc: SPU Options. (line 10) +* mesa: S/390 and zSeries Options. + (line 94) +* metrax100: CRIS Options. (line 27) +* metrax4: CRIS Options. (line 27) +* meva: MIPS Options. (line 363) +* mex9: NDS32 Options. (line 70) +* mexpand-adddi: ARC Options. (line 232) +* mexplicit-relocs: DEC Alpha Options. (line 176) +* mexplicit-relocs <1>: MIPS Options. (line 494) +* mexr: H8/300 Options. (line 28) +* mextern-sdata: MIPS Options. (line 413) +* MF: Preprocessor Options. + (line 220) +* mfast-fp: Blackfin Options. (line 132) +* mfast-indirect-calls: HPPA Options. (line 46) +* mfast-sw-div: Nios II Options. (line 46) +* mfaster-structs: SPARC Options. (line 85) +* mfdpic: FRV Options. (line 72) +* mfentry: i386 and x86-64 Options. + (line 910) +* mfix: DEC Alpha Options. (line 163) +* mfix-24k: MIPS Options. (line 567) +* mfix-and-continue: Darwin Options. (line 104) +* mfix-at697f: SPARC Options. (line 237) +* mfix-cortex-m3-ldrd: ARM Options. (line 325) +* mfix-r10000: MIPS Options. (line 589) +* mfix-r4000: MIPS Options. (line 573) +* mfix-r4400: MIPS Options. (line 583) +* mfix-rm7000: MIPS Options. (line 600) +* mfix-sb1: MIPS Options. (line 625) +* mfix-ut699: SPARC Options. (line 242) +* mfix-vr4120: MIPS Options. (line 605) +* mfix-vr4130: MIPS Options. (line 618) +* mfixed-cc: FRV Options. (line 35) +* mfixed-range: HPPA Options. (line 53) +* mfixed-range <1>: IA-64 Options. (line 105) +* mfixed-range <2>: SH Options. (line 338) +* mfixed-range <3>: SPU Options. (line 52) +* mflat: SPARC Options. (line 22) +* mflip-mips16: MIPS Options. (line 110) +* mfloat-abi: ARM Options. (line 42) +* mfloat-gprs: RS/6000 and PowerPC Options. + (line 257) +* mfloat-ieee: DEC Alpha Options. (line 171) +* mfloat-vax: DEC Alpha Options. (line 171) +* mfloat32: PDP-11 Options. (line 52) +* mfloat64: PDP-11 Options. (line 48) +* mflush-func: MIPS Options. (line 692) +* mflush-func=NAME: M32R/D Options. (line 93) +* mflush-trap=NUMBER: M32R/D Options. (line 86) +* mfmaf: SPARC Options. (line 231) +* mfmovd: SH Options. (line 96) +* mforbid-fp-as-gp: NDS32 Options. (line 65) +* mforce-fp-as-gp: NDS32 Options. (line 61) +* mforce-no-pic: Xtensa Options. (line 41) +* mfp-exceptions: MIPS Options. (line 719) +* mfp-mode: Adapteva Epiphany Options. + (line 71) +* mfp-reg: DEC Alpha Options. (line 25) +* mfp-rounding-mode: DEC Alpha Options. (line 85) +* mfp-trap-mode: DEC Alpha Options. (line 63) +* mfp16-format: ARM Options. (line 176) +* mfp32: MIPS Options. (line 228) +* mfp64: MIPS Options. (line 231) +* mfpmath: Optimize Options. (line 1942) +* mfpmath <1>: i386 and x86-64 Options. + (line 273) +* mfpr-32: FRV Options. (line 15) +* mfpr-64: FRV Options. (line 19) +* mfprnd: RS/6000 and PowerPC Options. + (line 27) +* mfpu: ARM Options. (line 156) +* mfpu <1>: PDP-11 Options. (line 9) +* mfpu <2>: RS/6000 and PowerPC Options. + (line 376) +* mfpu <3>: SPARC Options. (line 34) +* mfriz: RS/6000 and PowerPC Options. + (line 860) +* mfsca: SH Options. (line 414) +* mfsrra: SH Options. (line 423) +* mfull-regs: NDS32 Options. (line 18) +* mfull-toc: RS/6000 and PowerPC Options. + (line 285) +* mfused-madd: IA-64 Options. (line 88) +* mfused-madd <1>: MIPS Options. (line 550) +* mfused-madd <2>: RS/6000 and PowerPC Options. + (line 429) +* mfused-madd <3>: S/390 and zSeries Options. + (line 135) +* mfused-madd <4>: SH Options. (line 405) +* mfused-madd <5>: Xtensa Options. (line 19) +* MG: Preprocessor Options. + (line 229) +* mg: VAX Options. (line 17) +* mgas: HPPA Options. (line 69) +* mgcc-abi: V850 Options. (line 148) +* mgen-cell-microcode: RS/6000 and PowerPC Options. + (line 173) +* mgeneral-regs-only: AArch64 Options. (line 24) +* mgettrcost=NUMBER: SH Options. (line 355) +* mghs: V850 Options. (line 127) +* mglibc: GNU/Linux Options. (line 9) +* mgnu: VAX Options. (line 13) +* mgnu-as: IA-64 Options. (line 18) +* mgnu-ld: HPPA Options. (line 105) +* mgnu-ld <1>: IA-64 Options. (line 23) +* mgotplt: CRIS Options. (line 81) +* mgp-direct: NDS32 Options. (line 45) +* mgp32: MIPS Options. (line 222) +* mgp64: MIPS Options. (line 225) +* mgpopt: MIPS Options. (line 435) +* mgpopt <1>: Nios II Options. (line 15) +* mgpr-32: FRV Options. (line 7) +* mgpr-64: FRV Options. (line 11) +* mgprel-ro: FRV Options. (line 99) +* mh: H8/300 Options. (line 14) +* mhal: Nios II Options. (line 220) +* mhalf-reg-file: Adapteva Epiphany Options. + (line 9) +* mhard-dfp: RS/6000 and PowerPC Options. + (line 27) +* mhard-dfp <1>: S/390 and zSeries Options. + (line 20) +* mhard-float: FRV Options. (line 23) +* mhard-float <1>: M680x0 Options. (line 194) +* mhard-float <2>: MicroBlaze Options. (line 10) +* mhard-float <3>: MIPS Options. (line 234) +* mhard-float <4>: RS/6000 and PowerPC Options. + (line 362) +* mhard-float <5>: S/390 and zSeries Options. + (line 11) +* mhard-float <6>: SPARC Options. (line 34) +* mhard-float <7>: V850 Options. (line 113) +* mhard-quad-float: SPARC Options. (line 55) +* mhardlit: MCore Options. (line 10) +* mhint-max-distance: SPU Options. (line 107) +* mhint-max-nops: SPU Options. (line 101) +* mhitachi: SH Options. (line 100) +* mhitachi <1>: SH Options. (line 103) +* mhitachi <2>: SH Options. (line 106) +* mhotpatch: S/390 and zSeries Options. + (line 171) +* mhp-ld: HPPA Options. (line 117) +* mhw-div: Nios II Options. (line 55) +* mhw-mul: Nios II Options. (line 55) +* mhw-mulx: Nios II Options. (line 55) +* micplb: Blackfin Options. (line 177) +* mid-shared-library: Blackfin Options. (line 80) +* mieee: DEC Alpha Options. (line 39) +* mieee <1>: SH Options. (line 116) +* mieee-conformant: DEC Alpha Options. (line 134) +* mieee-fp: i386 and x86-64 Options. + (line 328) +* mieee-with-inexact: DEC Alpha Options. (line 52) +* milp32: IA-64 Options. (line 121) +* mimadd: MIPS Options. (line 543) +* mimpure-text: Solaris 2 Options. (line 9) +* mincoming-stack-boundary: i386 and x86-64 Options. + (line 535) +* mindexed-addressing: SH Options. (line 345) +* mindexed-loads: ARC Options. (line 236) +* minline-all-stringops: i386 and x86-64 Options. + (line 842) +* minline-float-divide-max-throughput: IA-64 Options. (line 58) +* minline-float-divide-min-latency: IA-64 Options. (line 54) +* minline-ic_invalidate: SH Options. (line 125) +* minline-int-divide-max-throughput: IA-64 Options. (line 69) +* minline-int-divide-min-latency: IA-64 Options. (line 65) +* minline-plt: Blackfin Options. (line 137) +* minline-plt <1>: FRV Options. (line 81) +* minline-sqrt-max-throughput: IA-64 Options. (line 80) +* minline-sqrt-min-latency: IA-64 Options. (line 76) +* minline-stringops-dynamically: i386 and x86-64 Options. + (line 849) +* minsert-sched-nops: RS/6000 and PowerPC Options. + (line 545) +* mint-register: RX Options. (line 100) +* mint16: PDP-11 Options. (line 40) +* mint32: CR16 Options. (line 22) +* mint32 <1>: H8/300 Options. (line 38) +* mint32 <2>: PDP-11 Options. (line 44) +* mint8: AVR Options. (line 161) +* minterlink-compressed: MIPS Options. (line 117) +* minterlink-mips16: MIPS Options. (line 129) +* minvalid-symbols: SH Options. (line 379) +* mio-volatile: MeP Options. (line 74) +* mips1: MIPS Options. (line 77) +* mips16: MIPS Options. (line 102) +* mips2: MIPS Options. (line 80) +* mips3: MIPS Options. (line 83) +* mips32: MIPS Options. (line 89) +* mips32r2: MIPS Options. (line 92) +* mips3d: MIPS Options. (line 342) +* mips4: MIPS Options. (line 86) +* mips64: MIPS Options. (line 95) +* mips64r2: MIPS Options. (line 98) +* misel: RS/6000 and PowerPC Options. + (line 191) +* misize: ARC Options. (line 130) +* misize <1>: SH Options. (line 137) +* misr-vector-size: NDS32 Options. (line 51) +* missue-rate=NUMBER: M32R/D Options. (line 79) +* mivc2: MeP Options. (line 59) +* mjump-in-delay: HPPA Options. (line 23) +* mkernel: Darwin Options. (line 82) +* mknuthdiv: MMIX Options. (line 32) +* ml: MeP Options. (line 78) +* ml <1>: SH Options. (line 77) +* mlarge: MSP430 Options. (line 45) +* mlarge-data: DEC Alpha Options. (line 187) +* mlarge-data-threshold: i386 and x86-64 Options. + (line 421) +* mlarge-mem: SPU Options. (line 38) +* mlarge-text: DEC Alpha Options. (line 205) +* mleadz: MeP Options. (line 81) +* mleaf-id-shared-library: Blackfin Options. (line 91) +* mlibfuncs: MMIX Options. (line 10) +* mlibrary-pic: FRV Options. (line 135) +* mlinked-fp: FRV Options. (line 116) +* mlinker-opt: HPPA Options. (line 79) +* mlinux: CRIS Options. (line 91) +* mlittle: RS/6000 and PowerPC Options. + (line 494) +* mlittle-endian: AArch64 Options. (line 27) +* mlittle-endian <1>: ARC Options. (line 353) +* mlittle-endian <2>: ARM Options. (line 58) +* mlittle-endian <3>: C6X Options. (line 16) +* mlittle-endian <4>: IA-64 Options. (line 13) +* mlittle-endian <5>: MCore Options. (line 39) +* mlittle-endian <6>: MicroBlaze Options. (line 60) +* mlittle-endian <7>: NDS32 Options. (line 12) +* mlittle-endian <8>: RS/6000 and PowerPC Options. + (line 494) +* mlittle-endian <9>: TILE-Gx Options. (line 29) +* mlittle-endian-data: RX Options. (line 42) +* mliw: MN10300 Options. (line 54) +* mllsc: MIPS Options. (line 299) +* mlocal-sdata: MIPS Options. (line 401) +* mlock: ARC Options. (line 96) +* mlong-calls: Adapteva Epiphany Options. + (line 55) +* mlong-calls <1>: ARC Options. (line 161) +* mlong-calls <2>: ARM Options. (line 201) +* mlong-calls <3>: Blackfin Options. (line 120) +* mlong-calls <4>: FRV Options. (line 122) +* mlong-calls <5>: MIPS Options. (line 529) +* mlong-calls <6>: V850 Options. (line 10) +* mlong-double-128: i386 and x86-64 Options. + (line 407) +* mlong-double-128 <1>: S/390 and zSeries Options. + (line 29) +* mlong-double-64: i386 and x86-64 Options. + (line 407) +* mlong-double-64 <1>: S/390 and zSeries Options. + (line 29) +* mlong-double-80: i386 and x86-64 Options. + (line 407) +* mlong-jumps: V850 Options. (line 108) +* mlong-load-store: HPPA Options. (line 60) +* mlong32: MIPS Options. (line 376) +* mlong64: MIPS Options. (line 371) +* mlongcall: RS/6000 and PowerPC Options. + (line 753) +* mlongcalls: Xtensa Options. (line 72) +* mloop: V850 Options. (line 121) +* mlow-64k: Blackfin Options. (line 69) +* mlp64: IA-64 Options. (line 121) +* mlra: ARC Options. (line 241) +* mlra-priority-compact: ARC Options. (line 249) +* mlra-priority-noncompact: ARC Options. (line 252) +* mlra-priority-none: ARC Options. (line 246) +* MM: Preprocessor Options. + (line 210) +* mm: MeP Options. (line 84) +* mmac: CR16 Options. (line 9) +* mmac <1>: Score Options. (line 21) +* mmac-24: ARC Options. (line 105) +* mmac-d16: ARC Options. (line 101) +* mmac_24: ARC Options. (line 376) +* mmac_d16: ARC Options. (line 379) +* mmad: MIPS Options. (line 538) +* mmalloc64: VMS Options. (line 17) +* mmax: DEC Alpha Options. (line 163) +* mmax-constant-size: RX Options. (line 82) +* mmax-stack-frame: CRIS Options. (line 23) +* mmcount-ra-address: MIPS Options. (line 768) +* mmcu: AVR Options. (line 9) +* mmcu <1>: MIPS Options. (line 359) +* mmcu=: MSP430 Options. (line 14) +* MMD: Preprocessor Options. + (line 292) +* mmedia: FRV Options. (line 56) +* mmedium-calls: ARC Options. (line 165) +* mmemcpy: MicroBlaze Options. (line 13) +* mmemcpy <1>: MIPS Options. (line 523) +* mmemcpy-strategy=STRATEGY: i386 and x86-64 Options. + (line 871) +* mmemory-latency: DEC Alpha Options. (line 268) +* mmemory-model: SPARC Options. (line 283) +* mmemset-strategy=STRATEGY: i386 and x86-64 Options. + (line 883) +* mmfcrf: RS/6000 and PowerPC Options. + (line 27) +* mmfpgpr: RS/6000 and PowerPC Options. + (line 27) +* mmicromips: MIPS Options. (line 347) +* mminimal-toc: RS/6000 and PowerPC Options. + (line 285) +* mminmax: MeP Options. (line 87) +* mmixed-code: ARC Options. (line 264) +* mmmx: i386 and x86-64 Options. + (line 629) +* mmodel=large: M32R/D Options. (line 33) +* mmodel=medium: M32R/D Options. (line 27) +* mmodel=small: M32R/D Options. (line 18) +* mmovbe: i386 and x86-64 Options. + (line 715) +* mmt: MIPS Options. (line 355) +* mmul: RL78 Options. (line 13) +* mmul-bug-workaround: CRIS Options. (line 32) +* mmul32x16: ARC Options. (line 51) +* mmul64: ARC Options. (line 54) +* mmuladd: FRV Options. (line 64) +* mmulhw: RS/6000 and PowerPC Options. + (line 438) +* mmult: MeP Options. (line 90) +* mmult-bug: MN10300 Options. (line 9) +* mmultcost: ARC Options. (line 326) +* mmulti-cond-exec: FRV Options. (line 215) +* mmulticore: Blackfin Options. (line 141) +* mmultiple: RS/6000 and PowerPC Options. + (line 388) +* mmvcle: S/390 and zSeries Options. + (line 104) +* mmvme: RS/6000 and PowerPC Options. + (line 658) +* mn: H8/300 Options. (line 20) +* mnan=2008: MIPS Options. (line 280) +* mnan=legacy: MIPS Options. (line 280) +* mneon-for-64bits: ARM Options. (line 345) +* mnested-cond-exec: FRV Options. (line 230) +* mnhwloop: Score Options. (line 15) +* mno-16-bit: NDS32 Options. (line 42) +* mno-3dnow: i386 and x86-64 Options. + (line 629) +* mno-4byte-functions: MCore Options. (line 27) +* mno-8byte-align: V850 Options. (line 170) +* mno-abicalls: MIPS Options. (line 162) +* mno-abshi: PDP-11 Options. (line 58) +* mno-ac0: PDP-11 Options. (line 20) +* mno-address-space-conversion: SPU Options. (line 68) +* mno-align-double: i386 and x86-64 Options. + (line 366) +* mno-align-int: M680x0 Options. (line 263) +* mno-align-loops: M32R/D Options. (line 76) +* mno-align-stringops: i386 and x86-64 Options. + (line 837) +* mno-altivec: RS/6000 and PowerPC Options. + (line 132) +* mno-am33: MN10300 Options. (line 20) +* mno-app-regs: SPARC Options. (line 10) +* mno-app-regs <1>: V850 Options. (line 185) +* mno-as100-syntax: RX Options. (line 76) +* mno-atomic-updates: SPU Options. (line 83) +* mno-avoid-indexed-addresses: RS/6000 and PowerPC Options. + (line 420) +* mno-backchain: S/390 and zSeries Options. + (line 35) +* mno-base-addresses: MMIX Options. (line 53) +* mno-bit-align: RS/6000 and PowerPC Options. + (line 452) +* mno-bitfield: M680x0 Options. (line 227) +* mno-branch-likely: MIPS Options. (line 708) +* mno-branch-predict: MMIX Options. (line 48) +* mno-brcc: ARC Options. (line 201) +* mno-bwx: DEC Alpha Options. (line 163) +* mno-bypass-cache: Nios II Options. (line 34) +* mno-cache-volatile: Nios II Options. (line 40) +* mno-callgraph-data: MCore Options. (line 31) +* mno-cbcond: SPARC Options. (line 217) +* mno-check-zero-division: MIPS Options. (line 503) +* mno-cix: DEC Alpha Options. (line 163) +* mno-clearbss: MicroBlaze Options. (line 16) +* mno-cmov: NDS32 Options. (line 24) +* mno-cmpb: RS/6000 and PowerPC Options. + (line 27) +* mno-cond-exec: ARC Options. (line 213) +* mno-cond-exec <1>: FRV Options. (line 194) +* mno-cond-move: FRV Options. (line 166) +* mno-const-align: CRIS Options. (line 55) +* mno-const16: Xtensa Options. (line 10) +* mno-crt0: MN10300 Options. (line 43) +* mno-crt0 <1>: Moxie Options. (line 14) +* mno-crypto: RS/6000 and PowerPC Options. + (line 220) +* mno-csync-anomaly: Blackfin Options. (line 65) +* mno-custom-INSN: Nios II Options. (line 61) +* mno-data-align: CRIS Options. (line 55) +* mno-debug: S/390 and zSeries Options. + (line 110) +* mno-default: i386 and x86-64 Options. + (line 668) +* mno-direct-move: RS/6000 and PowerPC Options. + (line 226) +* mno-disable-callt: V850 Options. (line 92) +* mno-div: M680x0 Options. (line 206) +* mno-div <1>: MCore Options. (line 15) +* mno-dlmzb: RS/6000 and PowerPC Options. + (line 445) +* mno-double: FRV Options. (line 52) +* mno-dpfp-lrsr: ARC Options. (line 39) +* mno-dsp: MIPS Options. (line 313) +* mno-dspr2: MIPS Options. (line 319) +* mno-dwarf2-asm: IA-64 Options. (line 94) +* mno-dword: FRV Options. (line 44) +* mno-eabi: RS/6000 and PowerPC Options. + (line 682) +* mno-early-stop-bits: IA-64 Options. (line 100) +* mno-eflags: FRV Options. (line 155) +* mno-embedded-data: MIPS Options. (line 450) +* mno-ep: V850 Options. (line 16) +* mno-epilogue-cfi: ARC Options. (line 158) +* mno-epsilon: MMIX Options. (line 15) +* mno-eva: MIPS Options. (line 363) +* mno-explicit-relocs: DEC Alpha Options. (line 176) +* mno-explicit-relocs <1>: MIPS Options. (line 494) +* mno-exr: H8/300 Options. (line 33) +* mno-extern-sdata: MIPS Options. (line 413) +* mno-fancy-math-387: i386 and x86-64 Options. + (line 356) +* mno-fast-sw-div: Nios II Options. (line 46) +* mno-faster-structs: SPARC Options. (line 85) +* mno-fix: DEC Alpha Options. (line 163) +* mno-fix-24k: MIPS Options. (line 567) +* mno-fix-r10000: MIPS Options. (line 589) +* mno-fix-r4000: MIPS Options. (line 573) +* mno-fix-r4400: MIPS Options. (line 583) +* mno-flat: SPARC Options. (line 22) +* mno-float: MIPS Options. (line 241) +* mno-float32: PDP-11 Options. (line 48) +* mno-float64: PDP-11 Options. (line 52) +* mno-flush-func: M32R/D Options. (line 98) +* mno-flush-trap: M32R/D Options. (line 90) +* mno-fmaf: SPARC Options. (line 231) +* mno-fp-in-toc: RS/6000 and PowerPC Options. + (line 285) +* mno-fp-regs: DEC Alpha Options. (line 25) +* mno-fp-ret-in-387: i386 and x86-64 Options. + (line 346) +* mno-fprnd: RS/6000 and PowerPC Options. + (line 27) +* mno-fpu: SPARC Options. (line 39) +* mno-fsca: SH Options. (line 414) +* mno-fsrra: SH Options. (line 423) +* mno-fused-madd: IA-64 Options. (line 88) +* mno-fused-madd <1>: MIPS Options. (line 550) +* mno-fused-madd <2>: RS/6000 and PowerPC Options. + (line 429) +* mno-fused-madd <3>: S/390 and zSeries Options. + (line 135) +* mno-fused-madd <4>: SH Options. (line 405) +* mno-fused-madd <5>: Xtensa Options. (line 19) +* mno-gnu-as: IA-64 Options. (line 18) +* mno-gnu-ld: IA-64 Options. (line 23) +* mno-gotplt: CRIS Options. (line 81) +* mno-gp-direct: NDS32 Options. (line 48) +* mno-gpopt: MIPS Options. (line 435) +* mno-gpopt <1>: Nios II Options. (line 15) +* mno-hard-dfp: RS/6000 and PowerPC Options. + (line 27) +* mno-hard-dfp <1>: S/390 and zSeries Options. + (line 20) +* mno-hardlit: MCore Options. (line 10) +* mno-hw-div: Nios II Options. (line 55) +* mno-hw-mul: Nios II Options. (line 55) +* mno-hw-mulx: Nios II Options. (line 55) +* mno-id-shared-library: Blackfin Options. (line 87) +* mno-ieee-fp: i386 and x86-64 Options. + (line 328) +* mno-imadd: MIPS Options. (line 543) +* mno-inline-float-divide: IA-64 Options. (line 62) +* mno-inline-int-divide: IA-64 Options. (line 73) +* mno-inline-sqrt: IA-64 Options. (line 84) +* mno-int16: PDP-11 Options. (line 44) +* mno-int32: PDP-11 Options. (line 40) +* mno-interlink-compressed: MIPS Options. (line 117) +* mno-interlink-mips16: MIPS Options. (line 129) +* mno-interrupts: AVR Options. (line 167) +* mno-isel: RS/6000 and PowerPC Options. + (line 191) +* mno-knuthdiv: MMIX Options. (line 32) +* mno-leaf-id-shared-library: Blackfin Options. (line 97) +* mno-libfuncs: MMIX Options. (line 10) +* mno-llsc: MIPS Options. (line 299) +* mno-local-sdata: MIPS Options. (line 401) +* mno-long-calls: ARM Options. (line 201) +* mno-long-calls <1>: Blackfin Options. (line 120) +* mno-long-calls <2>: HPPA Options. (line 130) +* mno-long-calls <3>: MIPS Options. (line 529) +* mno-long-calls <4>: V850 Options. (line 10) +* mno-long-jumps: V850 Options. (line 108) +* mno-longcall: RS/6000 and PowerPC Options. + (line 753) +* mno-longcalls: Xtensa Options. (line 72) +* mno-low-64k: Blackfin Options. (line 73) +* mno-lsim: FR30 Options. (line 14) +* mno-lsim <1>: MCore Options. (line 46) +* mno-mad: MIPS Options. (line 538) +* mno-max: DEC Alpha Options. (line 163) +* mno-mcount-ra-address: MIPS Options. (line 768) +* mno-mcu: MIPS Options. (line 359) +* mno-mdmx: MIPS Options. (line 336) +* mno-media: FRV Options. (line 60) +* mno-memcpy: MIPS Options. (line 523) +* mno-mfcrf: RS/6000 and PowerPC Options. + (line 27) +* mno-mfpgpr: RS/6000 and PowerPC Options. + (line 27) +* mno-millicode: ARC Options. (line 255) +* mno-mips16: MIPS Options. (line 102) +* mno-mips3d: MIPS Options. (line 342) +* mno-mmicromips: MIPS Options. (line 347) +* mno-mmx: i386 and x86-64 Options. + (line 629) +* mno-mpy: ARC Options. (line 48) +* mno-mt: MIPS Options. (line 355) +* mno-mul-bug-workaround: CRIS Options. (line 32) +* mno-muladd: FRV Options. (line 68) +* mno-mulhw: RS/6000 and PowerPC Options. + (line 438) +* mno-mult-bug: MN10300 Options. (line 13) +* mno-multi-cond-exec: FRV Options. (line 223) +* mno-multiple: RS/6000 and PowerPC Options. + (line 388) +* mno-mvcle: S/390 and zSeries Options. + (line 104) +* mno-nested-cond-exec: FRV Options. (line 237) +* mno-omit-leaf-frame-pointer: AArch64 Options. (line 54) +* mno-optimize-membar: FRV Options. (line 249) +* mno-opts: MeP Options. (line 93) +* mno-pack: FRV Options. (line 151) +* mno-packed-stack: S/390 and zSeries Options. + (line 54) +* mno-paired: RS/6000 and PowerPC Options. + (line 205) +* mno-paired-single: MIPS Options. (line 330) +* mno-perf-ext: NDS32 Options. (line 30) +* mno-pic: IA-64 Options. (line 26) +* mno-pid: RX Options. (line 117) +* mno-plt: MIPS Options. (line 189) +* mno-popc: SPARC Options. (line 224) +* mno-popcntb: RS/6000 and PowerPC Options. + (line 27) +* mno-popcntd: RS/6000 and PowerPC Options. + (line 27) +* mno-postinc: Adapteva Epiphany Options. + (line 109) +* mno-postmodify: Adapteva Epiphany Options. + (line 109) +* mno-power8-fusion: RS/6000 and PowerPC Options. + (line 232) +* mno-power8-vector: RS/6000 and PowerPC Options. + (line 238) +* mno-powerpc-gfxopt: RS/6000 and PowerPC Options. + (line 27) +* mno-powerpc-gpopt: RS/6000 and PowerPC Options. + (line 27) +* mno-powerpc64: RS/6000 and PowerPC Options. + (line 27) +* mno-prolog-function: V850 Options. (line 23) +* mno-prologue-epilogue: CRIS Options. (line 71) +* mno-prototype: RS/6000 and PowerPC Options. + (line 642) +* mno-push-args: i386 and x86-64 Options. + (line 815) +* mno-quad-memory: RS/6000 and PowerPC Options. + (line 245) +* mno-quad-memory-atomic: RS/6000 and PowerPC Options. + (line 251) +* mno-red-zone: i386 and x86-64 Options. + (line 957) +* mno-register-names: IA-64 Options. (line 37) +* mno-regnames: RS/6000 and PowerPC Options. + (line 747) +* mno-relax: V850 Options. (line 103) +* mno-relax-immediate: MCore Options. (line 19) +* mno-relocatable: RS/6000 and PowerPC Options. + (line 468) +* mno-relocatable-lib: RS/6000 and PowerPC Options. + (line 479) +* mno-round-nearest: Adapteva Epiphany Options. + (line 51) +* mno-rtd: M680x0 Options. (line 258) +* mno-scc: FRV Options. (line 180) +* mno-sched-ar-data-spec: IA-64 Options. (line 134) +* mno-sched-ar-in-data-spec: IA-64 Options. (line 155) +* mno-sched-br-data-spec: IA-64 Options. (line 128) +* mno-sched-br-in-data-spec: IA-64 Options. (line 148) +* mno-sched-control-spec: IA-64 Options. (line 140) +* mno-sched-count-spec-in-critical-path: IA-64 Options. (line 182) +* mno-sched-in-control-spec: IA-64 Options. (line 162) +* mno-sched-prefer-non-control-spec-insns: IA-64 Options. (line 175) +* mno-sched-prefer-non-data-spec-insns: IA-64 Options. (line 168) +* mno-sched-prolog: ARM Options. (line 33) +* mno-sdata: ARC Options. (line 174) +* mno-sdata <1>: IA-64 Options. (line 42) +* mno-sdata <2>: RS/6000 and PowerPC Options. + (line 728) +* mno-sep-data: Blackfin Options. (line 115) +* mno-serialize-volatile: Xtensa Options. (line 35) +* mno-short: M680x0 Options. (line 222) +* mno-side-effects: CRIS Options. (line 46) +* mno-sim: RX Options. (line 71) +* mno-single-exit: MMIX Options. (line 65) +* mno-slow-bytes: MCore Options. (line 35) +* mno-small-exec: S/390 and zSeries Options. + (line 79) +* mno-smartmips: MIPS Options. (line 326) +* mno-soft-cmpsf: Adapteva Epiphany Options. + (line 29) +* mno-soft-float: DEC Alpha Options. (line 10) +* mno-space-regs: HPPA Options. (line 39) +* mno-spe: RS/6000 and PowerPC Options. + (line 200) +* mno-specld-anomaly: Blackfin Options. (line 55) +* mno-split-addresses: MIPS Options. (line 488) +* mno-sse: i386 and x86-64 Options. + (line 629) +* mno-stack-align: CRIS Options. (line 55) +* mno-stack-bias: SPARC Options. (line 307) +* mno-strict-align: M680x0 Options. (line 283) +* mno-strict-align <1>: RS/6000 and PowerPC Options. + (line 463) +* mno-string: RS/6000 and PowerPC Options. + (line 399) +* mno-sum-in-toc: RS/6000 and PowerPC Options. + (line 285) +* mno-sym32: MIPS Options. (line 386) +* mno-target-align: Xtensa Options. (line 59) +* mno-text-section-literals: Xtensa Options. (line 47) +* mno-tls-markers: RS/6000 and PowerPC Options. + (line 785) +* mno-toc: RS/6000 and PowerPC Options. + (line 488) +* mno-toplevel-symbols: MMIX Options. (line 39) +* mno-tpf-trace: S/390 and zSeries Options. + (line 129) +* mno-unaligned-access: ARM Options. (line 332) +* mno-unaligned-doubles: SPARC Options. (line 73) +* mno-uninit-const-in-rodata: MIPS Options. (line 458) +* mno-update: RS/6000 and PowerPC Options. + (line 410) +* mno-v3push: NDS32 Options. (line 36) +* mno-v8plus: SPARC Options. (line 188) +* mno-vect-double: Adapteva Epiphany Options. + (line 115) +* mno-virt: MIPS Options. (line 367) +* mno-vis: SPARC Options. (line 195) +* mno-vis2: SPARC Options. (line 201) +* mno-vis3: SPARC Options. (line 209) +* mno-vliw-branch: FRV Options. (line 208) +* mno-volatile-asm-stop: IA-64 Options. (line 32) +* mno-volatile-cache: ARC Options. (line 188) +* mno-vrsave: RS/6000 and PowerPC Options. + (line 170) +* mno-vsx: RS/6000 and PowerPC Options. + (line 214) +* mno-warn-multiple-fast-interrupts: RX Options. (line 143) +* mno-wide-bitfields: MCore Options. (line 23) +* mno-xgot: M680x0 Options. (line 315) +* mno-xgot <1>: MIPS Options. (line 199) +* mno-xl-compat: RS/6000 and PowerPC Options. + (line 320) +* mno-zdcbranch: SH Options. (line 396) +* mno-zero-extend: MMIX Options. (line 26) +* mnobitfield: M680x0 Options. (line 227) +* mnoieee: SH Options. (line 116) +* mnoliw: MN10300 Options. (line 59) +* mnomacsave: SH Options. (line 111) +* mnop-fun-dllimport: i386 and x86-64 Windows Options. + (line 22) +* mnops: Adapteva Epiphany Options. + (line 26) +* mnorm: ARC Options. (line 58) +* mnosetlb: MN10300 Options. (line 69) +* mnosplit-lohi: Adapteva Epiphany Options. + (line 109) +* momit-leaf-frame-pointer: AArch64 Options. (line 54) +* momit-leaf-frame-pointer <1>: Blackfin Options. (line 43) +* momit-leaf-frame-pointer <2>: i386 and x86-64 Options. + (line 887) +* mone-byte-bool: Darwin Options. (line 90) +* moptimize-membar: FRV Options. (line 244) +* MP: Preprocessor Options. + (line 239) +* mpa-risc-1-0: HPPA Options. (line 19) +* mpa-risc-1-1: HPPA Options. (line 19) +* mpa-risc-2-0: HPPA Options. (line 19) +* mpack: FRV Options. (line 147) +* mpacked-stack: S/390 and zSeries Options. + (line 54) +* mpadstruct: SH Options. (line 140) +* mpaired: RS/6000 and PowerPC Options. + (line 205) +* mpaired-single: MIPS Options. (line 330) +* mpc32: i386 and x86-64 Options. + (line 484) +* mpc64: i386 and x86-64 Options. + (line 484) +* mpc80: i386 and x86-64 Options. + (line 484) +* mpcrel: M680x0 Options. (line 275) +* mpdebug: CRIS Options. (line 36) +* mpe: RS/6000 and PowerPC Options. + (line 339) +* mpe-aligned-commons: i386 and x86-64 Windows Options. + (line 59) +* mperf-ext: NDS32 Options. (line 27) +* mpic-data-is-text-relative: ARM Options. (line 238) +* mpic-register: ARM Options. (line 231) +* mpid: RX Options. (line 117) +* mplt: MIPS Options. (line 189) +* mpointers-to-nested-functions: RS/6000 and PowerPC Options. + (line 868) +* mpoke-function-name: ARM Options. (line 244) +* mpopc: SPARC Options. (line 224) +* mpopcntb: RS/6000 and PowerPC Options. + (line 27) +* mpopcntd: RS/6000 and PowerPC Options. + (line 27) +* mportable-runtime: HPPA Options. (line 65) +* mpower8-fusion: RS/6000 and PowerPC Options. + (line 232) +* mpower8-vector: RS/6000 and PowerPC Options. + (line 238) +* mpowerpc-gfxopt: RS/6000 and PowerPC Options. + (line 27) +* mpowerpc-gpopt: RS/6000 and PowerPC Options. + (line 27) +* mpowerpc64: RS/6000 and PowerPC Options. + (line 27) +* mprefer-avx128: i386 and x86-64 Options. + (line 692) +* mprefer-short-insn-regs: Adapteva Epiphany Options. + (line 13) +* mprefergot: SH Options. (line 223) +* mpreferred-stack-boundary: i386 and x86-64 Options. + (line 514) +* mpretend-cmove: SH Options. (line 432) +* mprioritize-restricted-insns: RS/6000 and PowerPC Options. + (line 517) +* mprolog-function: V850 Options. (line 23) +* mprologue-epilogue: CRIS Options. (line 71) +* mprototype: RS/6000 and PowerPC Options. + (line 642) +* mpt-fixed: SH Options. (line 359) +* mpush-args: i386 and x86-64 Options. + (line 815) +* MQ: Preprocessor Options. + (line 266) +* mq-class: ARC Options. (line 269) +* mquad-memory: RS/6000 and PowerPC Options. + (line 245) +* mquad-memory-atomic: RS/6000 and PowerPC Options. + (line 251) +* mr10k-cache-barrier: MIPS Options. (line 630) +* mRcq: ARC Options. (line 273) +* mRcw: ARC Options. (line 277) +* mrecip: i386 and x86-64 Options. + (line 725) +* mrecip <1>: RS/6000 and PowerPC Options. + (line 797) +* mrecip-precision: RS/6000 and PowerPC Options. + (line 832) +* mrecip=opt: i386 and x86-64 Options. + (line 747) +* mrecip=opt <1>: RS/6000 and PowerPC Options. + (line 810) +* mreduced-regs: NDS32 Options. (line 15) +* mregister-names: IA-64 Options. (line 37) +* mregnames: RS/6000 and PowerPC Options. + (line 747) +* mregparm: i386 and x86-64 Options. + (line 451) +* mrelax: AVR Options. (line 171) +* mrelax <1>: H8/300 Options. (line 9) +* mrelax <2>: MN10300 Options. (line 46) +* mrelax <3>: MSP430 Options. (line 51) +* mrelax <4>: NDS32 Options. (line 76) +* mrelax <5>: RX Options. (line 95) +* mrelax <6>: SH Options. (line 85) +* mrelax <7>: V850 Options. (line 103) +* mrelax-immediate: MCore Options. (line 19) +* mrelax-pic-calls: MIPS Options. (line 755) +* mrelocatable: RS/6000 and PowerPC Options. + (line 468) +* mrelocatable-lib: RS/6000 and PowerPC Options. + (line 479) +* mrepeat: MeP Options. (line 96) +* mrestrict-it: ARM Options. (line 356) +* mreturn-pointer-on-d0: MN10300 Options. (line 36) +* mrh850-abi: V850 Options. (line 127) +* mrtd: i386 and x86-64 Options. + (line 427) +* mrtd <1>: M680x0 Options. (line 236) +* mrtd <2>: Function Attributes. + (line 209) +* mrtp: VxWorks Options. (line 11) +* mrtsc: ARC Options. (line 109) +* ms: H8/300 Options. (line 17) +* ms <1>: MeP Options. (line 100) +* ms2600: H8/300 Options. (line 24) +* msafe-dma: SPU Options. (line 18) +* msafe-hints: SPU Options. (line 112) +* msahf: i386 and x86-64 Options. + (line 705) +* msatur: MeP Options. (line 105) +* msave-acc-in-interrupts: RX Options. (line 109) +* msave-toc-indirect: RS/6000 and PowerPC Options. + (line 880) +* mscc: FRV Options. (line 173) +* msched-ar-data-spec: IA-64 Options. (line 134) +* msched-ar-in-data-spec: IA-64 Options. (line 155) +* msched-br-data-spec: IA-64 Options. (line 128) +* msched-br-in-data-spec: IA-64 Options. (line 148) +* msched-control-spec: IA-64 Options. (line 140) +* msched-costly-dep: RS/6000 and PowerPC Options. + (line 524) +* msched-count-spec-in-critical-path: IA-64 Options. (line 182) +* msched-fp-mem-deps-zero-cost: IA-64 Options. (line 198) +* msched-in-control-spec: IA-64 Options. (line 162) +* msched-max-memory-insns: IA-64 Options. (line 207) +* msched-max-memory-insns-hard-limit: IA-64 Options. (line 213) +* msched-prefer-non-control-spec-insns: IA-64 Options. (line 175) +* msched-prefer-non-data-spec-insns: IA-64 Options. (line 168) +* msched-spec-ldc: IA-64 Options. (line 187) +* msched-spec-ldc <1>: IA-64 Options. (line 190) +* msched-stop-bits-after-every-cycle: IA-64 Options. (line 194) +* mschedule: HPPA Options. (line 72) +* mscore5: Score Options. (line 25) +* mscore5u: Score Options. (line 28) +* mscore7: Score Options. (line 31) +* mscore7d: Score Options. (line 35) +* msda: V850 Options. (line 40) +* msdata: IA-64 Options. (line 42) +* msdata <1>: RS/6000 and PowerPC Options. + (line 715) +* msdata=all: C6X Options. (line 30) +* msdata=data: RS/6000 and PowerPC Options. + (line 720) +* msdata=default: C6X Options. (line 22) +* msdata=default <1>: RS/6000 and PowerPC Options. + (line 715) +* msdata=eabi: RS/6000 and PowerPC Options. + (line 696) +* msdata=none: C6X Options. (line 35) +* msdata=none <1>: M32R/D Options. (line 40) +* msdata=none <2>: RS/6000 and PowerPC Options. + (line 728) +* msdata=sdata: M32R/D Options. (line 49) +* msdata=sysv: RS/6000 and PowerPC Options. + (line 706) +* msdata=use: M32R/D Options. (line 53) +* msdram: Blackfin Options. (line 171) +* msdram <1>: MeP Options. (line 110) +* msecure-plt: RS/6000 and PowerPC Options. + (line 180) +* msel-sched-dont-check-control-spec: IA-64 Options. (line 203) +* msep-data: Blackfin Options. (line 109) +* mserialize-volatile: Xtensa Options. (line 35) +* msetlb: MN10300 Options. (line 64) +* mshared-library-id: Blackfin Options. (line 102) +* mshort: M680x0 Options. (line 216) +* msign-extend-enabled: LM32 Options. (line 18) +* msim: Blackfin Options. (line 36) +* msim <1>: C6X Options. (line 19) +* msim <2>: CR16 Options. (line 18) +* msim <3>: M32C Options. (line 13) +* msim <4>: MeP Options. (line 114) +* msim <5>: MSP430 Options. (line 40) +* msim <6>: RL78 Options. (line 7) +* msim <7>: RS/6000 and PowerPC Options. + (line 652) +* msim <8>: RX Options. (line 71) +* msim <9>: Xstormy16 Options. (line 9) +* msimd: ARC Options. (line 71) +* msimnovec: MeP Options. (line 117) +* msimple-fpu: RS/6000 and PowerPC Options. + (line 372) +* msingle-exit: MMIX Options. (line 65) +* msingle-float: MIPS Options. (line 251) +* msingle-float <1>: RS/6000 and PowerPC Options. + (line 368) +* msingle-pic-base: ARM Options. (line 225) +* msingle-pic-base <1>: RS/6000 and PowerPC Options. + (line 511) +* msio: HPPA Options. (line 99) +* msize-level: ARC Options. (line 281) +* mslow-bytes: MCore Options. (line 35) +* mslow-flash-data: ARM Options. (line 350) +* msmall: MSP430 Options. (line 48) +* msmall-data: DEC Alpha Options. (line 187) +* msmall-data-limit: RX Options. (line 47) +* msmall-divides: MicroBlaze Options. (line 39) +* msmall-exec: S/390 and zSeries Options. + (line 79) +* msmall-mem: SPU Options. (line 38) +* msmall-model: FR30 Options. (line 9) +* msmall-text: DEC Alpha Options. (line 205) +* msmall16: Adapteva Epiphany Options. + (line 66) +* msmallc: Nios II Options. (line 226) +* msmartmips: MIPS Options. (line 326) +* msoft-float: ARC Options. (line 75) +* msoft-float <1>: DEC Alpha Options. (line 10) +* msoft-float <2>: FRV Options. (line 27) +* msoft-float <3>: HPPA Options. (line 85) +* msoft-float <4>: i386 and x86-64 Options. + (line 333) +* msoft-float <5>: M680x0 Options. (line 200) +* msoft-float <6>: MicroBlaze Options. (line 7) +* msoft-float <7>: MIPS Options. (line 237) +* msoft-float <8>: PDP-11 Options. (line 13) +* msoft-float <9>: RS/6000 and PowerPC Options. + (line 362) +* msoft-float <10>: S/390 and zSeries Options. + (line 11) +* msoft-float <11>: SPARC Options. (line 39) +* msoft-float <12>: V850 Options. (line 113) +* msoft-quad-float: SPARC Options. (line 59) +* msp8: AVR Options. (line 185) +* mspace: SH Options. (line 220) +* mspace <1>: V850 Options. (line 30) +* mspe: RS/6000 and PowerPC Options. + (line 200) +* mspecld-anomaly: Blackfin Options. (line 50) +* mspfp: ARC Options. (line 62) +* mspfp-compact: ARC Options. (line 63) +* mspfp-fast: ARC Options. (line 67) +* mspfp_compact: ARC Options. (line 382) +* mspfp_fast: ARC Options. (line 385) +* msplit-addresses: MIPS Options. (line 488) +* msplit-vecmove-early: Adapteva Epiphany Options. + (line 126) +* msse: i386 and x86-64 Options. + (line 629) +* msse2avx: i386 and x86-64 Options. + (line 905) +* msseregparm: i386 and x86-64 Options. + (line 462) +* mstack-align: CRIS Options. (line 55) +* mstack-bias: SPARC Options. (line 307) +* mstack-check-l1: Blackfin Options. (line 76) +* mstack-guard: S/390 and zSeries Options. + (line 154) +* mstack-increment: MCore Options. (line 50) +* mstack-offset: Adapteva Epiphany Options. + (line 37) +* mstack-protector-guard=GUARD: i386 and x86-64 Options. + (line 928) +* mstack-size: S/390 and zSeries Options. + (line 154) +* mstackrealign: i386 and x86-64 Options. + (line 505) +* mstdmain: SPU Options. (line 44) +* mstrict-align: AArch64 Options. (line 49) +* mstrict-align <1>: M680x0 Options. (line 283) +* mstrict-align <2>: RS/6000 and PowerPC Options. + (line 463) +* mstrict-X: AVR Options. (line 198) +* mstring: RS/6000 and PowerPC Options. + (line 399) +* mstringop-strategy=ALG: i386 and x86-64 Options. + (line 853) +* mstructure-size-boundary: ARM Options. (line 182) +* msvr4-struct-return: RS/6000 and PowerPC Options. + (line 604) +* mswap: ARC Options. (line 82) +* mswape: ARC Options. (line 114) +* msym32: MIPS Options. (line 386) +* msynci: MIPS Options. (line 740) +* msys-crt0: Nios II Options. (line 230) +* msys-lib: Nios II Options. (line 234) +* MT: Preprocessor Options. + (line 251) +* mtarget-align: Xtensa Options. (line 59) +* mtas: SH Options. (line 211) +* mtda: V850 Options. (line 34) +* mtelephony: ARC Options. (line 119) +* mtext-section-literals: Xtensa Options. (line 47) +* mtf: MeP Options. (line 121) +* mthread: i386 and x86-64 Windows Options. + (line 26) +* mthreads: i386 and x86-64 Options. + (line 830) +* mthumb: ARM Options. (line 266) +* mthumb-interwork: ARM Options. (line 25) +* mtiny-stack: AVR Options. (line 212) +* mtiny=: MeP Options. (line 125) +* mTLS: FRV Options. (line 90) +* mtls: FRV Options. (line 94) +* mtls-dialect: ARM Options. (line 308) +* mtls-dialect <1>: i386 and x86-64 Options. + (line 808) +* mtls-dialect=desc: AArch64 Options. (line 58) +* mtls-dialect=traditional: AArch64 Options. (line 62) +* mtls-direct-seg-refs: i386 and x86-64 Options. + (line 895) +* mtls-markers: RS/6000 and PowerPC Options. + (line 785) +* mtls-size: IA-64 Options. (line 112) +* mtoc: RS/6000 and PowerPC Options. + (line 488) +* mtomcat-stats: FRV Options. (line 254) +* mtoplevel-symbols: MMIX Options. (line 39) +* mtp: ARM Options. (line 300) +* mtpcs-frame: ARM Options. (line 273) +* mtpcs-leaf-frame: ARM Options. (line 279) +* mtpf-trace: S/390 and zSeries Options. + (line 129) +* mtrap-precision: DEC Alpha Options. (line 109) +* mtune: AArch64 Options. (line 83) +* mtune <1>: ARC Options. (line 302) +* mtune <2>: ARC Options. (line 388) +* mtune <3>: ARM Options. (line 97) +* mtune <4>: CRIS Options. (line 17) +* mtune <5>: DEC Alpha Options. (line 259) +* mtune <6>: i386 and x86-64 Options. + (line 216) +* mtune <7>: IA-64 Options. (line 116) +* mtune <8>: M680x0 Options. (line 68) +* mtune <9>: MIPS Options. (line 63) +* mtune <10>: MN10300 Options. (line 30) +* mtune <11>: RS/6000 and PowerPC Options. + (line 110) +* mtune <12>: S/390 and zSeries Options. + (line 122) +* mtune <13>: SPARC Options. (line 174) +* mtune-ctrl=FEATURE-LIST: i386 and x86-64 Options. + (line 658) +* mucb-mcount: ARC Options. (line 179) +* muclibc: GNU/Linux Options. (line 13) +* muls: Score Options. (line 18) +* multcost: ARC Options. (line 393) +* multcost=NUMBER: SH Options. (line 233) +* multilib-library-pic: FRV Options. (line 110) +* multiply-enabled: LM32 Options. (line 15) +* multiply_defined: Darwin Options. (line 196) +* multiply_defined_unused: Darwin Options. (line 196) +* multi_module: Darwin Options. (line 196) +* munalign-prob-threshold: ARC Options. (line 330) +* munaligned-access: ARM Options. (line 332) +* munaligned-doubles: SPARC Options. (line 73) +* municode: i386 and x86-64 Windows Options. + (line 30) +* muninit-const-in-rodata: MIPS Options. (line 458) +* munix: VAX Options. (line 9) +* munix-asm: PDP-11 Options. (line 68) +* munsafe-dma: SPU Options. (line 18) +* mupdate: RS/6000 and PowerPC Options. + (line 410) +* muser-enabled: LM32 Options. (line 21) +* musermode: SH Options. (line 228) +* mv3push: NDS32 Options. (line 33) +* mv850: V850 Options. (line 49) +* mv850e: V850 Options. (line 79) +* mv850e1: V850 Options. (line 70) +* mv850e2: V850 Options. (line 66) +* mv850e2v3: V850 Options. (line 61) +* mv850e2v4: V850 Options. (line 57) +* mv850e3v5: V850 Options. (line 52) +* mv850es: V850 Options. (line 75) +* mv8plus: SPARC Options. (line 188) +* mveclibabi: i386 and x86-64 Options. + (line 776) +* mveclibabi <1>: RS/6000 and PowerPC Options. + (line 841) +* mvect8-ret-in-mem: i386 and x86-64 Options. + (line 472) +* mvirt: MIPS Options. (line 367) +* mvis: SPARC Options. (line 195) +* mvis2: SPARC Options. (line 201) +* mvis3: SPARC Options. (line 209) +* mvliw-branch: FRV Options. (line 201) +* mvms-return-codes: VMS Options. (line 9) +* mvolatile-asm-stop: IA-64 Options. (line 32) +* mvolatile-cache: ARC Options. (line 184) +* mvr4130-align: MIPS Options. (line 729) +* mvrsave: RS/6000 and PowerPC Options. + (line 170) +* mvsx: RS/6000 and PowerPC Options. + (line 214) +* mvxworks: RS/6000 and PowerPC Options. + (line 673) +* mvzeroupper: i386 and x86-64 Options. + (line 686) +* mwarn-cell-microcode: RS/6000 and PowerPC Options. + (line 176) +* mwarn-dynamicstack: S/390 and zSeries Options. + (line 148) +* mwarn-framesize: S/390 and zSeries Options. + (line 140) +* mwarn-multiple-fast-interrupts: RX Options. (line 143) +* mwarn-reloc: SPU Options. (line 10) +* mwide-bitfields: MCore Options. (line 23) +* mwin32: i386 and x86-64 Windows Options. + (line 35) +* mwindows: i386 and x86-64 Windows Options. + (line 41) +* mword-relocations: ARM Options. (line 319) +* mwords-little-endian: ARM Options. (line 66) +* mx32: i386 and x86-64 Options. + (line 940) +* mxgot: M680x0 Options. (line 315) +* mxgot <1>: MIPS Options. (line 199) +* mxilinx-fpu: RS/6000 and PowerPC Options. + (line 383) +* mxl-barrel-shift: MicroBlaze Options. (line 33) +* mxl-compat: RS/6000 and PowerPC Options. + (line 320) +* mxl-float-convert: MicroBlaze Options. (line 51) +* mxl-float-sqrt: MicroBlaze Options. (line 54) +* mxl-gp-opt: MicroBlaze Options. (line 45) +* mxl-multiply-high: MicroBlaze Options. (line 48) +* mxl-pattern-compare: MicroBlaze Options. (line 36) +* mxl-reorder: MicroBlaze Options. (line 63) +* mxl-soft-div: MicroBlaze Options. (line 30) +* mxl-soft-mul: MicroBlaze Options. (line 27) +* mxl-stack-check: MicroBlaze Options. (line 42) +* mxy: ARC Options. (line 124) +* myellowknife: RS/6000 and PowerPC Options. + (line 668) +* mzarch: S/390 and zSeries Options. + (line 94) +* mzda: V850 Options. (line 45) +* mzdcbranch: SH Options. (line 396) +* mzero-extend: MMIX Options. (line 26) +* no-canonical-prefixes: Overall Options. (line 334) +* no-integrated-cpp: Preprocessor Options. + (line 34) +* no-sysroot-suffix: Directory Options. (line 109) +* noall_load: Darwin Options. (line 196) +* nocpp: MIPS Options. (line 562) +* nodefaultlibs: Link Options. (line 62) +* nofixprebinding: Darwin Options. (line 196) +* nofpu: RX Options. (line 17) +* nolibdld: HPPA Options. (line 182) +* nomultidefs: Darwin Options. (line 196) +* non-static: VxWorks Options. (line 16) +* noprebind: Darwin Options. (line 196) +* noseglinkedit: Darwin Options. (line 196) +* nostartfiles: Link Options. (line 57) +* nostdinc: Preprocessor Options. + (line 401) +* nostdinc++: C++ Dialect Options. + (line 396) +* nostdinc++ <1>: Preprocessor Options. + (line 406) +* nostdlib: Link Options. (line 74) +* no_dead_strip_inits_and_terms: Darwin Options. (line 196) +* o: Overall Options. (line 192) +* O: Optimize Options. (line 39) +* o <1>: Preprocessor Options. + (line 87) +* O0: Optimize Options. (line 129) +* O1: Optimize Options. (line 39) +* O2: Optimize Options. (line 83) +* O3: Optimize Options. (line 121) +* Ofast: Optimize Options. (line 143) +* Og: Optimize Options. (line 149) +* Os: Optimize Options. (line 133) +* p: Debugging Options. (line 410) +* P: Preprocessor Options. + (line 647) +* pagezero_size: Darwin Options. (line 196) +* param: Optimize Options. (line 2298) +* pass-exit-codes: Overall Options. (line 150) +* pedantic: Standards. (line 16) +* pedantic <1>: Warning Options. (line 71) +* pedantic <2>: Preprocessor Options. + (line 175) +* pedantic <3>: C Extensions. (line 6) +* pedantic <4>: Alternate Keywords. (line 30) +* pedantic <5>: Warnings and Errors. + (line 25) +* pedantic-errors: Standards. (line 16) +* pedantic-errors <1>: Warning Options. (line 112) +* pedantic-errors <2>: Preprocessor Options. + (line 180) +* pedantic-errors <3>: Non-bugs. (line 216) +* pedantic-errors <4>: Warnings and Errors. + (line 25) +* pg: Debugging Options. (line 416) +* pie: Link Options. (line 99) +* pipe: Overall Options. (line 215) +* prebind: Darwin Options. (line 196) +* prebind_all_twolevel_modules: Darwin Options. (line 196) +* print-file-name: Debugging Options. (line 1343) +* print-libgcc-file-name: Debugging Options. (line 1377) +* print-multi-directory: Debugging Options. (line 1349) +* print-multi-lib: Debugging Options. (line 1354) +* print-multi-os-directory: Debugging Options. (line 1361) +* print-multiarch: Debugging Options. (line 1370) +* print-objc-runtime-info: Objective-C and Objective-C++ Dialect Options. + (line 203) +* print-prog-name: Debugging Options. (line 1374) +* print-search-dirs: Debugging Options. (line 1385) +* print-sysroot: Debugging Options. (line 1398) +* print-sysroot-headers-suffix: Debugging Options. (line 1405) +* private_bundle: Darwin Options. (line 196) +* pthread: RS/6000 and PowerPC Options. + (line 792) +* pthread <1>: Solaris 2 Options. (line 30) +* pthreads: Solaris 2 Options. (line 24) +* Q: Debugging Options. (line 422) +* Qn: System V Options. (line 18) +* Qy: System V Options. (line 14) +* rdynamic: Link Options. (line 105) +* read_only_relocs: Darwin Options. (line 196) +* remap: Preprocessor Options. + (line 694) +* S: Overall Options. (line 175) +* S <1>: Link Options. (line 20) +* s: Link Options. (line 112) +* save-temps: Debugging Options. (line 1252) +* save-temps=obj: Debugging Options. (line 1278) +* sectalign: Darwin Options. (line 196) +* sectcreate: Darwin Options. (line 196) +* sectobjectsymbols: Darwin Options. (line 196) +* sectobjectsymbols <1>: Darwin Options. (line 196) +* sectorder: Darwin Options. (line 196) +* seg1addr: Darwin Options. (line 196) +* segaddr: Darwin Options. (line 196) +* seglinkedit: Darwin Options. (line 196) +* segprot: Darwin Options. (line 196) +* segs_read_only_addr: Darwin Options. (line 196) +* segs_read_only_addr <1>: Darwin Options. (line 196) +* segs_read_write_addr: Darwin Options. (line 196) +* segs_read_write_addr <1>: Darwin Options. (line 196) +* seg_addr_table: Darwin Options. (line 196) +* seg_addr_table_filename: Darwin Options. (line 196) +* shared: Link Options. (line 120) +* shared-libgcc: Link Options. (line 128) +* short-calls: Adapteva Epiphany Options. + (line 61) +* sim: CRIS Options. (line 95) +* sim2: CRIS Options. (line 101) +* single_module: Darwin Options. (line 196) +* specs: Directory Options. (line 86) +* static: Link Options. (line 116) +* static <1>: Darwin Options. (line 196) +* static <2>: HPPA Options. (line 186) +* static-libasan: Link Options. (line 163) +* static-libgcc: Link Options. (line 128) +* static-liblsan: Link Options. (line 179) +* static-libstdc++: Link Options. (line 196) +* static-libtsan: Link Options. (line 171) +* static-libubsan: Link Options. (line 187) +* std: Standards. (line 16) +* std <1>: C Dialect Options. (line 46) +* std <2>: Other Builtins. (line 21) +* std <3>: Non-bugs. (line 107) +* std=: Preprocessor Options. + (line 340) +* sub_library: Darwin Options. (line 196) +* sub_umbrella: Darwin Options. (line 196) +* symbolic: Link Options. (line 207) +* sysroot: Directory Options. (line 94) +* T: Link Options. (line 213) +* target-help: Overall Options. (line 230) +* target-help <1>: Preprocessor Options. + (line 699) +* threads: HPPA Options. (line 199) +* time: Debugging Options. (line 1293) +* tno-android-cc: GNU/Linux Options. (line 31) +* tno-android-ld: GNU/Linux Options. (line 35) +* traditional: C Dialect Options. (line 333) +* traditional <1>: Incompatibilities. (line 6) +* traditional-cpp: C Dialect Options. (line 333) +* traditional-cpp <1>: Preprocessor Options. + (line 677) +* trigraphs: C Dialect Options. (line 328) +* trigraphs <1>: Preprocessor Options. + (line 681) +* twolevel_namespace: Darwin Options. (line 196) +* U: Preprocessor Options. + (line 69) +* u: Link Options. (line 245) +* umbrella: Darwin Options. (line 196) +* undef: Preprocessor Options. + (line 73) +* undefined: Darwin Options. (line 196) +* unexported_symbols_list: Darwin Options. (line 196) +* v: Overall Options. (line 203) +* v <1>: Preprocessor Options. + (line 703) +* version: Overall Options. (line 338) +* version <1>: Preprocessor Options. + (line 715) +* w: Warning Options. (line 25) +* W: Warning Options. (line 166) +* W <1>: Warning Options. (line 1265) +* W <2>: Warning Options. (line 1349) +* w <1>: Preprocessor Options. + (line 171) +* W <3>: Incompatibilities. (line 64) +* Wa: Assembler Options. (line 9) +* Wabi: C++ Dialect Options. + (line 404) +* Waddr-space-convert: AVR Options. (line 215) +* Waddress: Warning Options. (line 1182) +* Waggregate-return: Warning Options. (line 1200) +* Waggressive-loop-optimizations: Warning Options. (line 1205) +* Wall: Warning Options. (line 116) +* Wall <1>: Preprocessor Options. + (line 93) +* Wall <2>: Standard Libraries. (line 6) +* Warray-bounds: Warning Options. (line 824) +* Wassign-intercept: Objective-C and Objective-C++ Dialect Options. + (line 157) +* Wattributes: Warning Options. (line 1210) +* Wbad-function-cast: Warning Options. (line 1039) +* Wbuiltin-macro-redefined: Warning Options. (line 1216) +* Wcast-align: Warning Options. (line 1070) +* Wcast-qual: Warning Options. (line 1054) +* Wchar-subscripts: Warning Options. (line 204) +* Wclobbered: Warning Options. (line 1089) +* Wcomment: Warning Options. (line 209) +* Wcomment <1>: Preprocessor Options. + (line 101) +* Wcomments: Preprocessor Options. + (line 101) +* Wconditionally-supported: Warning Options. (line 1093) +* Wconversion: Warning Options. (line 1096) +* Wconversion-null: Warning Options. (line 1114) +* Wctor-dtor-privacy: C++ Dialect Options. + (line 511) +* Wdate-time: Warning Options. (line 1122) +* Wdeclaration-after-statement: Warning Options. (line 956) +* Wdelete-incomplete: Warning Options. (line 1127) +* Wdelete-non-virtual-dtor: C++ Dialect Options. + (line 518) +* Wdeprecated: Warning Options. (line 1331) +* Wdeprecated-declarations: Warning Options. (line 1335) +* Wdisabled-optimization: Warning Options. (line 1495) +* Wdiv-by-zero: Warning Options. (line 829) +* Wdouble-promotion: Warning Options. (line 233) +* weak_reference_mismatches: Darwin Options. (line 196) +* Weffc++: C++ Dialect Options. + (line 598) +* Wempty-body: Warning Options. (line 1134) +* Wendif-labels: Warning Options. (line 966) +* Wendif-labels <1>: Preprocessor Options. + (line 148) +* Wenum-compare: Warning Options. (line 1138) +* Werror: Warning Options. (line 28) +* Werror <1>: Preprocessor Options. + (line 161) +* Werror=: Warning Options. (line 31) +* Wextra: Warning Options. (line 166) +* Wextra <1>: Warning Options. (line 1265) +* Wextra <2>: Warning Options. (line 1349) +* Wfatal-errors: Warning Options. (line 48) +* Wfloat-conversion: Warning Options. (line 1168) +* Wfloat-equal: Warning Options. (line 856) +* Wformat: Warning Options. (line 252) +* Wformat <1>: Warning Options. (line 277) +* Wformat <2>: Warning Options. (line 803) +* Wformat <3>: Function Attributes. + (line 453) +* Wformat-contains-nul: Warning Options. (line 286) +* Wformat-extra-args: Warning Options. (line 290) +* Wformat-nonliteral: Warning Options. (line 314) +* Wformat-nonliteral <1>: Function Attributes. + (line 518) +* Wformat-security: Warning Options. (line 319) +* Wformat-y2k: Warning Options. (line 331) +* Wformat-zero-length: Warning Options. (line 304) +* Wformat=: Warning Options. (line 252) +* Wformat=1: Warning Options. (line 277) +* Wformat=2: Warning Options. (line 309) +* Wframe-larger-than: Warning Options. (line 980) +* Wfree-nonheap-object: Warning Options. (line 989) +* whatsloaded: Darwin Options. (line 196) +* whyload: Darwin Options. (line 196) +* Wignored-qualifiers: Warning Options. (line 371) +* Wimplicit: Warning Options. (line 367) +* Wimplicit-function-declaration: Warning Options. (line 361) +* Wimplicit-int: Warning Options. (line 357) +* Winherited-variadic-ctor: Warning Options. (line 1405) +* Winit-self: Warning Options. (line 342) +* Winline: Warning Options. (line 1410) +* Winline <1>: Inline. (line 63) +* Wint-to-pointer-cast: Warning Options. (line 1437) +* Winvalid-offsetof: Warning Options. (line 1423) +* Winvalid-pch: Warning Options. (line 1446) +* Wjump-misses-init: Warning Options. (line 1144) +* Wl: Link Options. (line 237) +* Wlarger-than-LEN: Warning Options. (line 977) +* Wlarger-than=LEN: Warning Options. (line 977) +* Wliteral-suffix: C++ Dialect Options. + (line 525) +* Wlogical-op: Warning Options. (line 1195) +* Wlong-long: Warning Options. (line 1450) +* Wmain: Warning Options. (line 382) +* Wmaybe-uninitialized: Warning Options. (line 640) +* Wmissing-braces: Warning Options. (line 389) +* Wmissing-declarations: Warning Options. (line 1255) +* Wmissing-field-initializers: Warning Options. (line 1265) +* Wmissing-format-attribute: Warning Options. (line 803) +* Wmissing-include-dirs: Warning Options. (line 400) +* Wmissing-parameter-type: Warning Options. (line 1237) +* Wmissing-prototypes: Warning Options. (line 1245) +* Wmultichar: Warning Options. (line 1283) +* Wnarrowing: C++ Dialect Options. + (line 546) +* Wnested-externs: Warning Options. (line 1402) +* Wno-abi: C++ Dialect Options. + (line 404) +* Wno-address: Warning Options. (line 1182) +* Wno-aggregate-return: Warning Options. (line 1200) +* Wno-aggressive-loop-optimizations: Warning Options. (line 1205) +* Wno-all: Warning Options. (line 116) +* Wno-array-bounds: Warning Options. (line 824) +* Wno-assign-intercept: Objective-C and Objective-C++ Dialect Options. + (line 157) +* Wno-attributes: Warning Options. (line 1210) +* Wno-bad-function-cast: Warning Options. (line 1039) +* Wno-builtin-macro-redefined: Warning Options. (line 1216) +* Wno-cast-align: Warning Options. (line 1070) +* Wno-cast-qual: Warning Options. (line 1054) +* Wno-char-subscripts: Warning Options. (line 204) +* Wno-clobbered: Warning Options. (line 1089) +* Wno-comment: Warning Options. (line 209) +* Wno-conditionally-supported: Warning Options. (line 1093) +* Wno-conversion: Warning Options. (line 1096) +* Wno-conversion-null: Warning Options. (line 1114) +* Wno-coverage-mismatch: Warning Options. (line 214) +* Wno-ctor-dtor-privacy: C++ Dialect Options. + (line 511) +* Wno-date-time: Warning Options. (line 1122) +* Wno-declaration-after-statement: Warning Options. (line 956) +* Wno-delete-incomplete: Warning Options. (line 1127) +* Wno-delete-non-virtual-dtor: C++ Dialect Options. + (line 518) +* Wno-deprecated: Warning Options. (line 1331) +* Wno-deprecated-declarations: Warning Options. (line 1335) +* Wno-disabled-optimization: Warning Options. (line 1495) +* Wno-div-by-zero: Warning Options. (line 829) +* Wno-double-promotion: Warning Options. (line 233) +* Wno-effc++: C++ Dialect Options. + (line 598) +* Wno-empty-body: Warning Options. (line 1134) +* Wno-endif-labels: Warning Options. (line 966) +* Wno-enum-compare: Warning Options. (line 1138) +* Wno-error: Warning Options. (line 28) +* Wno-error=: Warning Options. (line 31) +* Wno-extra: Warning Options. (line 166) +* Wno-extra <1>: Warning Options. (line 1265) +* Wno-extra <2>: Warning Options. (line 1349) +* Wno-fatal-errors: Warning Options. (line 48) +* Wno-float-conversion: Warning Options. (line 1168) +* Wno-float-equal: Warning Options. (line 856) +* Wno-format: Warning Options. (line 252) +* Wno-format <1>: Warning Options. (line 803) +* Wno-format-contains-nul: Warning Options. (line 286) +* Wno-format-extra-args: Warning Options. (line 290) +* Wno-format-nonliteral: Warning Options. (line 314) +* Wno-format-security: Warning Options. (line 319) +* Wno-format-y2k: Warning Options. (line 331) +* Wno-format-zero-length: Warning Options. (line 304) +* Wno-free-nonheap-object: Warning Options. (line 989) +* Wno-ignored-qualifiers: Warning Options. (line 371) +* Wno-implicit: Warning Options. (line 367) +* Wno-implicit-function-declaration: Warning Options. (line 361) +* Wno-implicit-int: Warning Options. (line 357) +* Wno-inherited-variadic-ctor: Warning Options. (line 1405) +* Wno-init-self: Warning Options. (line 342) +* Wno-inline: Warning Options. (line 1410) +* Wno-int-to-pointer-cast: Warning Options. (line 1437) +* Wno-invalid-offsetof: Warning Options. (line 1423) +* Wno-invalid-pch: Warning Options. (line 1446) +* Wno-jump-misses-init: Warning Options. (line 1144) +* Wno-literal-suffix: C++ Dialect Options. + (line 525) +* Wno-logical-op: Warning Options. (line 1195) +* Wno-long-long: Warning Options. (line 1450) +* Wno-main: Warning Options. (line 382) +* Wno-maybe-uninitialized: Warning Options. (line 640) +* Wno-missing-braces: Warning Options. (line 389) +* Wno-missing-declarations: Warning Options. (line 1255) +* Wno-missing-field-initializers: Warning Options. (line 1265) +* Wno-missing-format-attribute: Warning Options. (line 803) +* Wno-missing-include-dirs: Warning Options. (line 400) +* Wno-missing-parameter-type: Warning Options. (line 1237) +* Wno-missing-prototypes: Warning Options. (line 1245) +* Wno-multichar: Warning Options. (line 1283) +* Wno-narrowing: C++ Dialect Options. + (line 546) +* Wno-nested-externs: Warning Options. (line 1402) +* Wno-noexcept: C++ Dialect Options. + (line 559) +* Wno-non-template-friend: C++ Dialect Options. + (line 633) +* Wno-non-virtual-dtor: C++ Dialect Options. + (line 565) +* Wno-nonnull: Warning Options. (line 335) +* Wno-old-style-cast: C++ Dialect Options. + (line 649) +* Wno-old-style-declaration: Warning Options. (line 1227) +* Wno-old-style-definition: Warning Options. (line 1233) +* Wno-overflow: Warning Options. (line 1341) +* Wno-overlength-strings: Warning Options. (line 1515) +* Wno-overloaded-virtual: C++ Dialect Options. + (line 655) +* Wno-override-init: Warning Options. (line 1349) +* Wno-packed: Warning Options. (line 1357) +* Wno-packed-bitfield-compat: Warning Options. (line 1374) +* Wno-padded: Warning Options. (line 1391) +* Wno-parentheses: Warning Options. (line 403) +* Wno-pedantic-ms-format: Warning Options. (line 1019) +* Wno-pmf-conversions: C++ Dialect Options. + (line 674) +* Wno-pmf-conversions <1>: Bound member functions. + (line 35) +* Wno-pointer-arith: Warning Options. (line 1025) +* Wno-pointer-sign: Warning Options. (line 1504) +* Wno-pointer-to-int-cast: Warning Options. (line 1442) +* Wno-pragmas: Warning Options. (line 690) +* Wno-protocol: Objective-C and Objective-C++ Dialect Options. + (line 161) +* Wno-redundant-decls: Warning Options. (line 1398) +* Wno-reorder: C++ Dialect Options. + (line 573) +* Wno-return-local-addr: Warning Options. (line 498) +* Wno-return-type: Warning Options. (line 502) +* Wno-selector: Objective-C and Objective-C++ Dialect Options. + (line 171) +* Wno-sequence-point: Warning Options. (line 452) +* Wno-shadow: Warning Options. (line 970) +* Wno-sign-compare: Warning Options. (line 1155) +* Wno-sign-conversion: Warning Options. (line 1162) +* Wno-sign-promo: C++ Dialect Options. + (line 678) +* Wno-sizeof-pointer-memaccess: Warning Options. (line 1174) +* Wno-stack-protector: Warning Options. (line 1510) +* Wno-strict-aliasing: Warning Options. (line 695) +* Wno-strict-null-sentinel: C++ Dialect Options. + (line 626) +* Wno-strict-overflow: Warning Options. (line 734) +* Wno-strict-prototypes: Warning Options. (line 1221) +* Wno-strict-selector-match: Objective-C and Objective-C++ Dialect Options. + (line 183) +* Wno-suggest-attribute=: Warning Options. (line 783) +* Wno-suggest-attribute=const: Warning Options. (line 789) +* Wno-suggest-attribute=format: Warning Options. (line 803) +* Wno-suggest-attribute=noreturn: Warning Options. (line 789) +* Wno-suggest-attribute=pure: Warning Options. (line 789) +* Wno-switch: Warning Options. (line 516) +* Wno-switch-default: Warning Options. (line 524) +* Wno-switch-enum: Warning Options. (line 527) +* Wno-sync-nand: Warning Options. (line 536) +* Wno-system-headers: Warning Options. (line 834) +* Wno-traditional: Warning Options. (line 871) +* Wno-traditional-conversion: Warning Options. (line 948) +* Wno-trampolines: Warning Options. (line 845) +* Wno-trigraphs: Warning Options. (line 541) +* Wno-type-limits: Warning Options. (line 1032) +* Wno-undeclared-selector: Objective-C and Objective-C++ Dialect Options. + (line 191) +* Wno-undef: Warning Options. (line 963) +* Wno-uninitialized: Warning Options. (line 618) +* Wno-unknown-pragmas: Warning Options. (line 683) +* Wno-unsafe-loop-optimizations: Warning Options. (line 1013) +* Wno-unused: Warning Options. (line 611) +* Wno-unused-but-set-parameter: Warning Options. (line 546) +* Wno-unused-but-set-variable: Warning Options. (line 555) +* Wno-unused-function: Warning Options. (line 565) +* Wno-unused-label: Warning Options. (line 570) +* Wno-unused-parameter: Warning Options. (line 581) +* Wno-unused-result: Warning Options. (line 588) +* Wno-unused-value: Warning Options. (line 601) +* Wno-unused-variable: Warning Options. (line 593) +* Wno-useless-cast: Warning Options. (line 1131) +* Wno-varargs: Warning Options. (line 1461) +* Wno-variadic-macros: Warning Options. (line 1455) +* Wno-vector-operation-performance: Warning Options. (line 1466) +* Wno-virtual-move-assign: Warning Options. (line 1476) +* Wno-vla: Warning Options. (line 1485) +* Wno-volatile-register-var: Warning Options. (line 1489) +* Wno-write-strings: Warning Options. (line 1076) +* Wno-zero-as-null-pointer-constant: Warning Options. (line 1118) +* Wnoexcept: C++ Dialect Options. + (line 559) +* Wnon-template-friend: C++ Dialect Options. + (line 633) +* Wnon-virtual-dtor: C++ Dialect Options. + (line 565) +* Wnonnull: Warning Options. (line 335) +* Wnormalized=: Warning Options. (line 1289) +* Wold-style-cast: C++ Dialect Options. + (line 649) +* Wold-style-declaration: Warning Options. (line 1227) +* Wold-style-definition: Warning Options. (line 1233) +* Wopenm-simd: Warning Options. (line 1344) +* Woverflow: Warning Options. (line 1341) +* Woverlength-strings: Warning Options. (line 1515) +* Woverloaded-virtual: C++ Dialect Options. + (line 655) +* Woverride-init: Warning Options. (line 1349) +* Wp: Preprocessor Options. + (line 14) +* Wpacked: Warning Options. (line 1357) +* Wpacked-bitfield-compat: Warning Options. (line 1374) +* Wpadded: Warning Options. (line 1391) +* Wparentheses: Warning Options. (line 403) +* Wpedantic: Warning Options. (line 71) +* Wpedantic-ms-format: Warning Options. (line 1019) +* Wpmf-conversions: C++ Dialect Options. + (line 674) +* Wpointer-arith: Warning Options. (line 1025) +* Wpointer-arith <1>: Pointer Arith. (line 13) +* Wpointer-sign: Warning Options. (line 1504) +* Wpointer-to-int-cast: Warning Options. (line 1442) +* Wpragmas: Warning Options. (line 690) +* Wprotocol: Objective-C and Objective-C++ Dialect Options. + (line 161) +* wrapper: Overall Options. (line 341) +* Wredundant-decls: Warning Options. (line 1398) +* Wreorder: C++ Dialect Options. + (line 573) +* Wreturn-local-addr: Warning Options. (line 498) +* Wreturn-type: Warning Options. (line 502) +* Wselector: Objective-C and Objective-C++ Dialect Options. + (line 171) +* Wsequence-point: Warning Options. (line 452) +* Wshadow: Warning Options. (line 970) +* Wsign-compare: Warning Options. (line 1155) +* Wsign-conversion: Warning Options. (line 1162) +* Wsign-promo: C++ Dialect Options. + (line 678) +* Wsizeof-pointer-memaccess: Warning Options. (line 1174) +* Wstack-protector: Warning Options. (line 1510) +* Wstack-usage: Warning Options. (line 993) +* Wstrict-aliasing: Warning Options. (line 695) +* Wstrict-aliasing=n: Warning Options. (line 702) +* Wstrict-null-sentinel: C++ Dialect Options. + (line 626) +* Wstrict-overflow: Warning Options. (line 734) +* Wstrict-prototypes: Warning Options. (line 1221) +* Wstrict-selector-match: Objective-C and Objective-C++ Dialect Options. + (line 183) +* Wsuggest-attribute=: Warning Options. (line 783) +* Wsuggest-attribute=const: Warning Options. (line 789) +* Wsuggest-attribute=format: Warning Options. (line 803) +* Wsuggest-attribute=noreturn: Warning Options. (line 789) +* Wsuggest-attribute=pure: Warning Options. (line 789) +* Wswitch: Warning Options. (line 516) +* Wswitch-default: Warning Options. (line 524) +* Wswitch-enum: Warning Options. (line 527) +* Wsync-nand: Warning Options. (line 536) +* Wsystem-headers: Warning Options. (line 834) +* Wsystem-headers <1>: Preprocessor Options. + (line 165) +* Wtraditional: Warning Options. (line 871) +* Wtraditional <1>: Preprocessor Options. + (line 118) +* Wtraditional-conversion: Warning Options. (line 948) +* Wtrampolines: Warning Options. (line 845) +* Wtrigraphs: Warning Options. (line 541) +* Wtrigraphs <1>: Preprocessor Options. + (line 106) +* Wtype-limits: Warning Options. (line 1032) +* Wundeclared-selector: Objective-C and Objective-C++ Dialect Options. + (line 191) +* Wundef: Warning Options. (line 963) +* Wundef <1>: Preprocessor Options. + (line 124) +* Wuninitialized: Warning Options. (line 618) +* Wunknown-pragmas: Warning Options. (line 683) +* Wunsafe-loop-optimizations: Warning Options. (line 1013) +* Wunsuffixed-float-constants: Warning Options. (line 1530) +* Wunused: Warning Options. (line 611) +* Wunused-but-set-parameter: Warning Options. (line 546) +* Wunused-but-set-variable: Warning Options. (line 555) +* Wunused-function: Warning Options. (line 565) +* Wunused-label: Warning Options. (line 570) +* Wunused-local-typedefs: Warning Options. (line 577) +* Wunused-macros: Preprocessor Options. + (line 129) +* Wunused-parameter: Warning Options. (line 581) +* Wunused-result: Warning Options. (line 588) +* Wunused-value: Warning Options. (line 601) +* Wunused-variable: Warning Options. (line 593) +* Wuseless-cast: Warning Options. (line 1131) +* Wvarargs: Warning Options. (line 1461) +* Wvariadic-macros: Warning Options. (line 1455) +* Wvector-operation-performance: Warning Options. (line 1466) +* Wvirtual-move-assign: Warning Options. (line 1476) +* Wvla: Warning Options. (line 1485) +* Wvolatile-register-var: Warning Options. (line 1489) +* Wwrite-strings: Warning Options. (line 1076) +* Wzero-as-null-pointer-constant: Warning Options. (line 1118) +* x: Overall Options. (line 126) +* x <1>: Preprocessor Options. + (line 324) +* Xassembler: Assembler Options. (line 13) +* Xbind-lazy: VxWorks Options. (line 26) +* Xbind-now: VxWorks Options. (line 30) +* Xlinker: Link Options. (line 219) +* Xpreprocessor: Preprocessor Options. + (line 25) +* Ym: System V Options. (line 26) +* YP: System V Options. (line 22) + + +File: gcc.info, Node: Keyword Index, Prev: Option Index, Up: Top + +Keyword Index +************* + + +* Menu: + +* '!' in constraint: Multi-Alternative. (line 33) +* '#' in constraint: Modifiers. (line 57) +* '#pragma': Pragmas. (line 6) +* #pragma implementation: C++ Interface. (line 39) +* '#pragma implementation', implied: C++ Interface. (line 46) +* #pragma interface: C++ Interface. (line 20) +* '#pragma', reason for not using: Function Attributes. + (line 2055) +* $: Dollar Signs. (line 6) +* '%' in constraint: Modifiers. (line 45) +* '%include': Spec Files. (line 26) +* '%include_noerr': Spec Files. (line 30) +* '%rename': Spec Files. (line 34) +* '&' in constraint: Modifiers. (line 25) +* ''': Incompatibilities. (line 116) +* '*' in constraint: Modifiers. (line 62) +* *__builtin_assume_aligned: Other Builtins. (line 332) +* '+' in constraint: Modifiers. (line 12) +* '-lgcc', use with '-nodefaultlibs': Link Options. (line 85) +* '-lgcc', use with '-nostdlib': Link Options. (line 85) +* '-march' feature modifiers: AArch64 Options. (line 119) +* '-mcpu' feature modifiers: AArch64 Options. (line 119) +* '-nodefaultlibs' and unresolved references: Link Options. (line 85) +* '-nostdlib' and unresolved references: Link Options. (line 85) +* .sdata/.sdata2 references (PowerPC): RS/6000 and PowerPC Options. + (line 739) +* '//': C++ Comments. (line 6) +* '0' in constraint: Simple Constraints. (line 125) +* '<' in constraint: Simple Constraints. (line 47) +* '=' in constraint: Modifiers. (line 8) +* '>' in constraint: Simple Constraints. (line 59) +* '?' in constraint: Multi-Alternative. (line 27) +* '?:' extensions: Conditionals. (line 6) +* '?:' side effect: Conditionals. (line 20) +* '_' in variables in macros: Typeof. (line 46) +* '_Accum' data type: Fixed-Point. (line 6) +* '_Complex' keyword: Complex. (line 6) +* '_Decimal128' data type: Decimal Float. (line 6) +* '_Decimal32' data type: Decimal Float. (line 6) +* '_Decimal64' data type: Decimal Float. (line 6) +* _Exit: Other Builtins. (line 6) +* _exit: Other Builtins. (line 6) +* '_Fract' data type: Fixed-Point. (line 6) +* _HTM_FIRST_USER_ABORT_CODE: S/390 System z Built-in Functions. + (line 44) +* '_Sat' data type: Fixed-Point. (line 6) +* _xabort: X86 transactional memory intrinsics. + (line 61) +* _xbegin: X86 transactional memory intrinsics. + (line 19) +* _xend: X86 transactional memory intrinsics. + (line 52) +* _xtest: X86 transactional memory intrinsics. + (line 57) +* __atomic_add_fetch: __atomic Builtins. (line 153) +* __atomic_always_lock_free: __atomic Builtins. (line 230) +* __atomic_and_fetch: __atomic Builtins. (line 157) +* __atomic_clear: __atomic Builtins. (line 204) +* __atomic_compare_exchange: __atomic Builtins. (line 145) +* __atomic_compare_exchange_n: __atomic Builtins. (line 124) +* __atomic_exchange: __atomic Builtins. (line 118) +* __atomic_exchange_n: __atomic Builtins. (line 108) +* __atomic_fetch_add: __atomic Builtins. (line 172) +* __atomic_fetch_and: __atomic Builtins. (line 176) +* __atomic_fetch_nand: __atomic Builtins. (line 182) +* __atomic_fetch_or: __atomic Builtins. (line 180) +* __atomic_fetch_sub: __atomic Builtins. (line 174) +* __atomic_fetch_xor: __atomic Builtins. (line 178) +* __atomic_is_lock_free: __atomic Builtins. (line 244) +* __atomic_load: __atomic Builtins. (line 90) +* __atomic_load_n: __atomic Builtins. (line 83) +* __atomic_nand_fetch: __atomic Builtins. (line 163) +* __atomic_or_fetch: __atomic Builtins. (line 161) +* __atomic_signal_fence: __atomic Builtins. (line 223) +* __atomic_store: __atomic Builtins. (line 103) +* __atomic_store_n: __atomic Builtins. (line 95) +* __atomic_sub_fetch: __atomic Builtins. (line 155) +* __atomic_test_and_set: __atomic Builtins. (line 192) +* __atomic_thread_fence: __atomic Builtins. (line 216) +* __atomic_xor_fetch: __atomic Builtins. (line 159) +* __builtin_apply: Constructing Calls. (line 29) +* __builtin_apply_args: Constructing Calls. (line 19) +* __builtin_arc_aligned: ARC Built-in Functions. + (line 18) +* __builtin_arc_brk: ARC Built-in Functions. + (line 28) +* __builtin_arc_core_read: ARC Built-in Functions. + (line 32) +* __builtin_arc_core_write: ARC Built-in Functions. + (line 39) +* __builtin_arc_divaw: ARC Built-in Functions. + (line 46) +* __builtin_arc_flag: ARC Built-in Functions. + (line 53) +* __builtin_arc_lr: ARC Built-in Functions. + (line 57) +* __builtin_arc_mul64: ARC Built-in Functions. + (line 64) +* __builtin_arc_mulu64: ARC Built-in Functions. + (line 68) +* __builtin_arc_nop: ARC Built-in Functions. + (line 73) +* __builtin_arc_norm: ARC Built-in Functions. + (line 77) +* __builtin_arc_normw: ARC Built-in Functions. + (line 84) +* __builtin_arc_rtie: ARC Built-in Functions. + (line 91) +* __builtin_arc_sleep: ARC Built-in Functions. + (line 95) +* __builtin_arc_sr: ARC Built-in Functions. + (line 99) +* __builtin_arc_swap: ARC Built-in Functions. + (line 106) +* __builtin_arc_swi: ARC Built-in Functions. + (line 112) +* __builtin_arc_sync: ARC Built-in Functions. + (line 116) +* __builtin_arc_trap_s: ARC Built-in Functions. + (line 120) +* __builtin_arc_unimp_s: ARC Built-in Functions. + (line 124) +* __builtin_bswap16: Other Builtins. (line 599) +* __builtin_bswap32: Other Builtins. (line 603) +* __builtin_bswap64: Other Builtins. (line 607) +* __builtin_choose_expr: Other Builtins. (line 154) +* __builtin_clrsb: Other Builtins. (line 529) +* __builtin_clrsbl: Other Builtins. (line 551) +* __builtin_clrsbll: Other Builtins. (line 574) +* __builtin_clz: Other Builtins. (line 521) +* __builtin_clzl: Other Builtins. (line 543) +* __builtin_clzll: Other Builtins. (line 566) +* __builtin_complex: Other Builtins. (line 194) +* __builtin_constant_p: Other Builtins. (line 203) +* __builtin_cpu_init: X86 Built-in Functions. + (line 62) +* __builtin_cpu_is: X86 Built-in Functions. + (line 90) +* __builtin_cpu_supports: X86 Built-in Functions. + (line 162) +* __builtin_ctz: Other Builtins. (line 525) +* __builtin_ctzl: Other Builtins. (line 547) +* __builtin_ctzll: Other Builtins. (line 570) +* __builtin_expect: Other Builtins. (line 252) +* __builtin_extract_return_addr: Return Address. (line 35) +* __builtin_ffs: Other Builtins. (line 517) +* __builtin_ffsl: Other Builtins. (line 540) +* __builtin_ffsll: Other Builtins. (line 562) +* __builtin_FILE: Other Builtins. (line 361) +* __builtin_fpclassify: Other Builtins. (line 6) +* __builtin_fpclassify <1>: Other Builtins. (line 431) +* __builtin_frame_address: Return Address. (line 47) +* __builtin_frob_return_address: Return Address. (line 44) +* __builtin_FUNCTION: Other Builtins. (line 356) +* __builtin_huge_val: Other Builtins. (line 419) +* __builtin_huge_valf: Other Builtins. (line 424) +* __builtin_huge_vall: Other Builtins. (line 427) +* __builtin_huge_valq: X86 Built-in Functions. + (line 57) +* __builtin_inf: Other Builtins. (line 442) +* __builtin_infd128: Other Builtins. (line 452) +* __builtin_infd32: Other Builtins. (line 446) +* __builtin_infd64: Other Builtins. (line 449) +* __builtin_inff: Other Builtins. (line 456) +* __builtin_infl: Other Builtins. (line 461) +* __builtin_infq: X86 Built-in Functions. + (line 54) +* __builtin_isfinite: Other Builtins. (line 6) +* __builtin_isgreater: Other Builtins. (line 6) +* __builtin_isgreaterequal: Other Builtins. (line 6) +* __builtin_isinf_sign: Other Builtins. (line 6) +* __builtin_isinf_sign <1>: Other Builtins. (line 465) +* __builtin_isless: Other Builtins. (line 6) +* __builtin_islessequal: Other Builtins. (line 6) +* __builtin_islessgreater: Other Builtins. (line 6) +* __builtin_isnormal: Other Builtins. (line 6) +* __builtin_isunordered: Other Builtins. (line 6) +* __builtin_LINE: Other Builtins. (line 350) +* __builtin_nan: Other Builtins. (line 473) +* __builtin_nand128: Other Builtins. (line 495) +* __builtin_nand32: Other Builtins. (line 489) +* __builtin_nand64: Other Builtins. (line 492) +* __builtin_nanf: Other Builtins. (line 499) +* __builtin_nanl: Other Builtins. (line 502) +* __builtin_nans: Other Builtins. (line 506) +* __builtin_nansf: Other Builtins. (line 510) +* __builtin_nansl: Other Builtins. (line 513) +* __builtin_nds32_isb: NDS32 Built-in Functions. + (line 12) +* __builtin_nds32_isync: NDS32 Built-in Functions. + (line 8) +* __builtin_nds32_mfsr: NDS32 Built-in Functions. + (line 15) +* __builtin_nds32_mfusr: NDS32 Built-in Functions. + (line 18) +* __builtin_nds32_mtsr: NDS32 Built-in Functions. + (line 21) +* __builtin_nds32_mtusr: NDS32 Built-in Functions. + (line 24) +* __builtin_nds32_setgie_dis: NDS32 Built-in Functions. + (line 30) +* __builtin_nds32_setgie_en: NDS32 Built-in Functions. + (line 27) +* __builtin_non_tx_store: S/390 System z Built-in Functions. + (line 98) +* __builtin_object_size: Object Size Checking. + (line 6) +* __builtin_object_size <1>: Object Size Checking. + (line 9) +* __builtin_offsetof: Offsetof. (line 6) +* __builtin_parity: Other Builtins. (line 537) +* __builtin_parityl: Other Builtins. (line 558) +* __builtin_parityll: Other Builtins. (line 582) +* __builtin_popcount: Other Builtins. (line 534) +* __builtin_popcountl: Other Builtins. (line 554) +* __builtin_popcountll: Other Builtins. (line 578) +* __builtin_powi: Other Builtins. (line 6) +* __builtin_powi <1>: Other Builtins. (line 586) +* __builtin_powif: Other Builtins. (line 6) +* __builtin_powif <1>: Other Builtins. (line 591) +* __builtin_powil: Other Builtins. (line 6) +* __builtin_powil <1>: Other Builtins. (line 595) +* __builtin_prefetch: Other Builtins. (line 380) +* __builtin_return: Constructing Calls. (line 47) +* __builtin_return_address: Return Address. (line 9) +* __builtin_rx_brk: RX Built-in Functions. + (line 10) +* __builtin_rx_clrpsw: RX Built-in Functions. + (line 13) +* __builtin_rx_int: RX Built-in Functions. + (line 17) +* __builtin_rx_machi: RX Built-in Functions. + (line 21) +* __builtin_rx_maclo: RX Built-in Functions. + (line 26) +* __builtin_rx_mulhi: RX Built-in Functions. + (line 31) +* __builtin_rx_mullo: RX Built-in Functions. + (line 36) +* __builtin_rx_mvfachi: RX Built-in Functions. + (line 41) +* __builtin_rx_mvfacmi: RX Built-in Functions. + (line 45) +* __builtin_rx_mvfc: RX Built-in Functions. + (line 49) +* __builtin_rx_mvtachi: RX Built-in Functions. + (line 53) +* __builtin_rx_mvtaclo: RX Built-in Functions. + (line 57) +* __builtin_rx_mvtc: RX Built-in Functions. + (line 61) +* __builtin_rx_mvtipl: RX Built-in Functions. + (line 65) +* __builtin_rx_racw: RX Built-in Functions. + (line 69) +* __builtin_rx_revw: RX Built-in Functions. + (line 73) +* __builtin_rx_rmpa: RX Built-in Functions. + (line 78) +* __builtin_rx_round: RX Built-in Functions. + (line 82) +* __builtin_rx_sat: RX Built-in Functions. + (line 87) +* __builtin_rx_setpsw: RX Built-in Functions. + (line 91) +* __builtin_rx_wait: RX Built-in Functions. + (line 95) +* __builtin_set_thread_pointer: SH Built-in Functions. + (line 9) +* __builtin_tabort: S/390 System z Built-in Functions. + (line 82) +* __builtin_tbegin: S/390 System z Built-in Functions. + (line 6) +* __builtin_tbeginc: S/390 System z Built-in Functions. + (line 73) +* __builtin_tbegin_nofloat: S/390 System z Built-in Functions. + (line 54) +* __builtin_tbegin_retry: S/390 System z Built-in Functions. + (line 60) +* __builtin_tbegin_retry_nofloat: S/390 System z Built-in Functions. + (line 67) +* __builtin_tend: S/390 System z Built-in Functions. + (line 77) +* __builtin_thread_pointer: SH Built-in Functions. + (line 18) +* __builtin_trap: Other Builtins. (line 276) +* __builtin_tx_assist: S/390 System z Built-in Functions. + (line 87) +* __builtin_tx_nesting_depth: S/390 System z Built-in Functions. + (line 93) +* __builtin_types_compatible_p: Other Builtins. (line 109) +* __builtin_unreachable: Other Builtins. (line 283) +* __builtin_va_arg_pack: Constructing Calls. (line 52) +* __builtin_va_arg_pack_len: Constructing Calls. (line 75) +* __builtin___clear_cache: Other Builtins. (line 367) +* __builtin___fprintf_chk: Object Size Checking. + (line 6) +* __builtin___memcpy_chk: Object Size Checking. + (line 6) +* __builtin___memmove_chk: Object Size Checking. + (line 6) +* __builtin___mempcpy_chk: Object Size Checking. + (line 6) +* __builtin___memset_chk: Object Size Checking. + (line 6) +* __builtin___printf_chk: Object Size Checking. + (line 6) +* __builtin___snprintf_chk: Object Size Checking. + (line 6) +* __builtin___sprintf_chk: Object Size Checking. + (line 6) +* __builtin___stpcpy_chk: Object Size Checking. + (line 6) +* __builtin___strcat_chk: Object Size Checking. + (line 6) +* __builtin___strcpy_chk: Object Size Checking. + (line 6) +* __builtin___strncat_chk: Object Size Checking. + (line 6) +* __builtin___strncpy_chk: Object Size Checking. + (line 6) +* __builtin___vfprintf_chk: Object Size Checking. + (line 6) +* __builtin___vprintf_chk: Object Size Checking. + (line 6) +* __builtin___vsnprintf_chk: Object Size Checking. + (line 6) +* __builtin___vsprintf_chk: Object Size Checking. + (line 6) +* '__complex__' keyword: Complex. (line 6) +* '__declspec(dllexport)': Function Attributes. + (line 290) +* '__declspec(dllimport)': Function Attributes. + (line 323) +* '__ea' SPU Named Address Spaces: Named Address Spaces. + (line 155) +* __extension__: Alternate Keywords. (line 30) +* '__far' M32C Named Address Spaces: Named Address Spaces. + (line 138) +* '__far' RL78 Named Address Spaces: Named Address Spaces. + (line 147) +* '__flash' AVR Named Address Spaces: Named Address Spaces. + (line 31) +* '__flash1' AVR Named Address Spaces: Named Address Spaces. + (line 40) +* '__flash2' AVR Named Address Spaces: Named Address Spaces. + (line 40) +* '__flash3' AVR Named Address Spaces: Named Address Spaces. + (line 40) +* '__flash4' AVR Named Address Spaces: Named Address Spaces. + (line 40) +* '__flash5' AVR Named Address Spaces: Named Address Spaces. + (line 40) +* '__float128' data type: Floating Types. (line 6) +* '__float80' data type: Floating Types. (line 6) +* '__fp16' data type: Half-Precision. (line 6) +* '__FUNCTION__' identifier: Function Names. (line 6) +* '__func__' identifier: Function Names. (line 6) +* '__imag__' keyword: Complex. (line 27) +* '__int128' data types: __int128. (line 6) +* '__memx' AVR Named Address Spaces: Named Address Spaces. + (line 46) +* '__PRETTY_FUNCTION__' identifier: Function Names. (line 6) +* '__real__' keyword: Complex. (line 27) +* __STDC_HOSTED__: Standards. (line 13) +* __sync_add_and_fetch: __sync Builtins. (line 60) +* __sync_and_and_fetch: __sync Builtins. (line 60) +* __sync_bool_compare_and_swap: __sync Builtins. (line 71) +* __sync_fetch_and_add: __sync Builtins. (line 44) +* __sync_fetch_and_and: __sync Builtins. (line 44) +* __sync_fetch_and_nand: __sync Builtins. (line 44) +* __sync_fetch_and_or: __sync Builtins. (line 44) +* __sync_fetch_and_sub: __sync Builtins. (line 44) +* __sync_fetch_and_xor: __sync Builtins. (line 44) +* __sync_lock_release: __sync Builtins. (line 101) +* __sync_lock_test_and_set: __sync Builtins. (line 83) +* __sync_nand_and_fetch: __sync Builtins. (line 60) +* __sync_or_and_fetch: __sync Builtins. (line 60) +* __sync_sub_and_fetch: __sync Builtins. (line 60) +* __sync_synchronize: __sync Builtins. (line 80) +* __sync_val_compare_and_swap: __sync Builtins. (line 71) +* __sync_xor_and_fetch: __sync Builtins. (line 60) +* '__thread': Thread-Local. (line 6) +* AArch64 Options: AArch64 Options. (line 6) +* ABI: Compatibility. (line 6) +* 'abi_tag' attribute: C++ Attributes. (line 9) +* abort: Other Builtins. (line 6) +* abs: Other Builtins. (line 6) +* accessing volatiles: Volatiles. (line 6) +* accessing volatiles <1>: C++ Volatiles. (line 6) +* acos: Other Builtins. (line 6) +* acosf: Other Builtins. (line 6) +* acosh: Other Builtins. (line 6) +* acoshf: Other Builtins. (line 6) +* acoshl: Other Builtins. (line 6) +* acosl: Other Builtins. (line 6) +* Ada: G++ and GCC. (line 6) +* Ada <1>: G++ and GCC. (line 30) +* additional floating types: Floating Types. (line 6) +* address constraints: Simple Constraints. (line 152) +* address of a label: Labels as Values. (line 6) +* address_operand: Simple Constraints. (line 156) +* 'alias' attribute: Function Attributes. + (line 39) +* 'aligned' attribute: Function Attributes. + (line 52) +* 'aligned' attribute <1>: Variable Attributes. + (line 23) +* 'aligned' attribute <2>: Type Attributes. (line 31) +* alignment: Alignment. (line 6) +* alloca: Other Builtins. (line 6) +* 'alloca' vs variable-length arrays: Variable Length. (line 35) +* 'alloc_align' attribute: Function Attributes. + (line 93) +* 'alloc_size' attribute: Function Attributes. + (line 72) +* Allow nesting in an interrupt handler on the Blackfin processor.: Function Attributes. + (line 1068) +* Altera Nios II options: Nios II Options. (line 6) +* alternate keywords: Alternate Keywords. (line 6) +* 'always_inline' function attribute: Function Attributes. + (line 125) +* AMD x86-64 Options: i386 and x86-64 Options. + (line 6) +* AMD1: Standards. (line 13) +* ANSI C: Standards. (line 13) +* ANSI C standard: Standards. (line 13) +* ANSI C89: Standards. (line 13) +* ANSI support: C Dialect Options. (line 10) +* ANSI X3.159-1989: Standards. (line 13) +* apostrophes: Incompatibilities. (line 116) +* application binary interface: Compatibility. (line 6) +* ARC options: ARC Options. (line 6) +* ARM options: ARM Options. (line 6) +* ARM [Annotated C++ Reference Manual]: Backwards Compatibility. + (line 6) +* arrays of length zero: Zero Length. (line 6) +* arrays of variable length: Variable Length. (line 6) +* arrays, non-lvalue: Subscripting. (line 6) +* 'artificial' function attribute: Function Attributes. + (line 166) +* asin: Other Builtins. (line 6) +* asinf: Other Builtins. (line 6) +* asinh: Other Builtins. (line 6) +* asinhf: Other Builtins. (line 6) +* asinhl: Other Builtins. (line 6) +* asinl: Other Builtins. (line 6) +* 'asm' constraints: Constraints. (line 6) +* 'asm' expressions: Extended Asm. (line 6) +* assembler instructions: Extended Asm. (line 6) +* assembler names for identifiers: Asm Labels. (line 6) +* assembly code, invalid: Bug Criteria. (line 12) +* 'assume_aligned' attribute: Function Attributes. + (line 110) +* atan: Other Builtins. (line 6) +* atan2: Other Builtins. (line 6) +* atan2f: Other Builtins. (line 6) +* atan2l: Other Builtins. (line 6) +* atanf: Other Builtins. (line 6) +* atanh: Other Builtins. (line 6) +* atanhf: Other Builtins. (line 6) +* atanhl: Other Builtins. (line 6) +* atanl: Other Builtins. (line 6) +* attribute of types: Type Attributes. (line 6) +* attribute of variables: Variable Attributes. + (line 6) +* attribute syntax: Attribute Syntax. (line 6) +* autoincrement/decrement addressing: Simple Constraints. (line 30) +* automatic 'inline' for C++ member fns: Inline. (line 71) +* AVR Options: AVR Options. (line 6) +* Backwards Compatibility: Backwards Compatibility. + (line 6) +* base class members: Name lookup. (line 6) +* bcmp: Other Builtins. (line 6) +* 'below100' attribute: Variable Attributes. + (line 578) +* binary compatibility: Compatibility. (line 6) +* Binary constants using the '0b' prefix: Binary constants. (line 6) +* Blackfin Options: Blackfin Options. (line 6) +* bound pointer to member function: Bound member functions. + (line 6) +* bug criteria: Bug Criteria. (line 6) +* bugs: Bugs. (line 6) +* bugs, known: Trouble. (line 6) +* built-in functions: C Dialect Options. (line 210) +* built-in functions <1>: Other Builtins. (line 6) +* bzero: Other Builtins. (line 6) +* C compilation options: Invoking GCC. (line 17) +* C intermediate output, nonexistent: G++ and GCC. (line 35) +* C language extensions: C Extensions. (line 6) +* C language, traditional: C Dialect Options. (line 331) +* C standard: Standards. (line 13) +* C standards: Standards. (line 13) +* c++: Invoking G++. (line 14) +* C++: G++ and GCC. (line 30) +* C++ comments: C++ Comments. (line 6) +* C++ compilation options: Invoking GCC. (line 23) +* C++ interface and implementation headers: C++ Interface. (line 6) +* C++ language extensions: C++ Extensions. (line 6) +* C++ member fns, automatically 'inline': Inline. (line 71) +* C++ misunderstandings: C++ Misunderstandings. + (line 6) +* C++ options, command-line: C++ Dialect Options. + (line 6) +* C++ pragmas, effect on inlining: C++ Interface. (line 66) +* C++ source file suffixes: Invoking G++. (line 6) +* C++ static data, declaring and defining: Static Definitions. + (line 6) +* C11: Standards. (line 13) +* C1X: Standards. (line 13) +* C6X Options: C6X Options. (line 6) +* C89: Standards. (line 13) +* C90: Standards. (line 13) +* C94: Standards. (line 13) +* C95: Standards. (line 13) +* C99: Standards. (line 13) +* C9X: Standards. (line 13) +* cabs: Other Builtins. (line 6) +* cabsf: Other Builtins. (line 6) +* cabsl: Other Builtins. (line 6) +* cacos: Other Builtins. (line 6) +* cacosf: Other Builtins. (line 6) +* cacosh: Other Builtins. (line 6) +* cacoshf: Other Builtins. (line 6) +* cacoshl: Other Builtins. (line 6) +* cacosl: Other Builtins. (line 6) +* 'callee_pop_aggregate_return' attribute: Function Attributes. + (line 1016) +* calling functions through the function vector on H8/300, M16C, M32C and SH2A processors: Function Attributes. + (line 564) +* calloc: Other Builtins. (line 6) +* caret GCC_COLORS capability: Language Independent Options. + (line 76) +* carg: Other Builtins. (line 6) +* cargf: Other Builtins. (line 6) +* cargl: Other Builtins. (line 6) +* case labels in initializers: Designated Inits. (line 6) +* case ranges: Case Ranges. (line 6) +* casin: Other Builtins. (line 6) +* casinf: Other Builtins. (line 6) +* casinh: Other Builtins. (line 6) +* casinhf: Other Builtins. (line 6) +* casinhl: Other Builtins. (line 6) +* casinl: Other Builtins. (line 6) +* cast to a union: Cast to Union. (line 6) +* catan: Other Builtins. (line 6) +* catanf: Other Builtins. (line 6) +* catanh: Other Builtins. (line 6) +* catanhf: Other Builtins. (line 6) +* catanhl: Other Builtins. (line 6) +* catanl: Other Builtins. (line 6) +* cbrt: Other Builtins. (line 6) +* cbrtf: Other Builtins. (line 6) +* cbrtl: Other Builtins. (line 6) +* ccos: Other Builtins. (line 6) +* ccosf: Other Builtins. (line 6) +* ccosh: Other Builtins. (line 6) +* ccoshf: Other Builtins. (line 6) +* ccoshl: Other Builtins. (line 6) +* ccosl: Other Builtins. (line 6) +* ceil: Other Builtins. (line 6) +* ceilf: Other Builtins. (line 6) +* ceill: Other Builtins. (line 6) +* cexp: Other Builtins. (line 6) +* cexpf: Other Builtins. (line 6) +* cexpl: Other Builtins. (line 6) +* character set, execution: Preprocessor Options. + (line 554) +* character set, input: Preprocessor Options. + (line 567) +* character set, input normalization: Warning Options. (line 1289) +* character set, wide execution: Preprocessor Options. + (line 559) +* cimag: Other Builtins. (line 6) +* cimagf: Other Builtins. (line 6) +* cimagl: Other Builtins. (line 6) +* 'cleanup' attribute: Variable Attributes. + (line 89) +* clog: Other Builtins. (line 6) +* clogf: Other Builtins. (line 6) +* clogl: Other Builtins. (line 6) +* COBOL: G++ and GCC. (line 23) +* code generation conventions: Code Gen Options. (line 6) +* code, mixed with declarations: Mixed Declarations. (line 6) +* 'cold' function attribute: Function Attributes. + (line 1307) +* 'cold' label attribute: Function Attributes. + (line 1325) +* command options: Invoking GCC. (line 6) +* comments, C++ style: C++ Comments. (line 6) +* 'common' attribute: Variable Attributes. + (line 104) +* comparison of signed and unsigned values, warning: Warning Options. + (line 1155) +* compiler bugs, reporting: Bug Reporting. (line 6) +* compiler compared to C++ preprocessor: G++ and GCC. (line 35) +* compiler options, C++: C++ Dialect Options. + (line 6) +* compiler options, Objective-C and Objective-C++: Objective-C and Objective-C++ Dialect Options. + (line 6) +* compiler version, specifying: Target Options. (line 6) +* COMPILER_PATH: Environment Variables. + (line 91) +* complex conjugation: Complex. (line 34) +* complex numbers: Complex. (line 6) +* compound literals: Compound Literals. (line 6) +* computed gotos: Labels as Values. (line 6) +* conditional expressions, extensions: Conditionals. (line 6) +* conflicting types: Disappointments. (line 21) +* conj: Other Builtins. (line 6) +* conjf: Other Builtins. (line 6) +* conjl: Other Builtins. (line 6) +* 'const' applied to function: Function Attributes. + (line 6) +* 'const' function attribute: Function Attributes. + (line 215) +* constants in constraints: Simple Constraints. (line 68) +* constraint modifier characters: Modifiers. (line 6) +* constraint, matching: Simple Constraints. (line 137) +* constraints, 'asm': Constraints. (line 6) +* constraints, machine specific: Machine Constraints. + (line 6) +* constructing calls: Constructing Calls. (line 6) +* constructor expressions: Compound Literals. (line 6) +* 'constructor' function attribute: Function Attributes. + (line 243) +* contributors: Contributors. (line 6) +* copysign: Other Builtins. (line 6) +* copysignf: Other Builtins. (line 6) +* copysignl: Other Builtins. (line 6) +* core dump: Bug Criteria. (line 9) +* cos: Other Builtins. (line 6) +* cosf: Other Builtins. (line 6) +* cosh: Other Builtins. (line 6) +* coshf: Other Builtins. (line 6) +* coshl: Other Builtins. (line 6) +* cosl: Other Builtins. (line 6) +* CPATH: Environment Variables. + (line 127) +* CPLUS_INCLUDE_PATH: Environment Variables. + (line 129) +* cpow: Other Builtins. (line 6) +* cpowf: Other Builtins. (line 6) +* cpowl: Other Builtins. (line 6) +* cproj: Other Builtins. (line 6) +* cprojf: Other Builtins. (line 6) +* cprojl: Other Builtins. (line 6) +* CR16 Options: CR16 Options. (line 6) +* creal: Other Builtins. (line 6) +* crealf: Other Builtins. (line 6) +* creall: Other Builtins. (line 6) +* CRIS Options: CRIS Options. (line 6) +* 'critical' attribute: Function Attributes. + (line 717) +* cross compiling: Target Options. (line 6) +* csin: Other Builtins. (line 6) +* csinf: Other Builtins. (line 6) +* csinh: Other Builtins. (line 6) +* csinhf: Other Builtins. (line 6) +* csinhl: Other Builtins. (line 6) +* csinl: Other Builtins. (line 6) +* csqrt: Other Builtins. (line 6) +* csqrtf: Other Builtins. (line 6) +* csqrtl: Other Builtins. (line 6) +* ctan: Other Builtins. (line 6) +* ctanf: Other Builtins. (line 6) +* ctanh: Other Builtins. (line 6) +* ctanhf: Other Builtins. (line 6) +* ctanhl: Other Builtins. (line 6) +* ctanl: Other Builtins. (line 6) +* C_INCLUDE_PATH: Environment Variables. + (line 128) +* Darwin options: Darwin Options. (line 6) +* dcgettext: Other Builtins. (line 6) +* 'dd' integer suffix: Decimal Float. (line 6) +* 'DD' integer suffix: Decimal Float. (line 6) +* deallocating variable length arrays: Variable Length. (line 22) +* debugging information options: Debugging Options. (line 6) +* decimal floating types: Decimal Float. (line 6) +* declaration scope: Incompatibilities. (line 80) +* declarations inside expressions: Statement Exprs. (line 6) +* declarations, mixed with code: Mixed Declarations. (line 6) +* declaring attributes of functions: Function Attributes. + (line 6) +* declaring static data in C++: Static Definitions. (line 6) +* defining static data in C++: Static Definitions. (line 6) +* dependencies for make as output: Environment Variables. + (line 155) +* dependencies for make as output <1>: Environment Variables. + (line 171) +* dependencies, 'make': Preprocessor Options. + (line 185) +* DEPENDENCIES_OUTPUT: Environment Variables. + (line 154) +* dependent name lookup: Name lookup. (line 6) +* 'deprecated' attribute: Variable Attributes. + (line 113) +* 'deprecated' attribute.: Function Attributes. + (line 265) +* designated initializers: Designated Inits. (line 6) +* designator lists: Designated Inits. (line 96) +* designators: Designated Inits. (line 64) +* 'destructor' function attribute: Function Attributes. + (line 243) +* 'df' integer suffix: Decimal Float. (line 6) +* 'DF' integer suffix: Decimal Float. (line 6) +* dgettext: Other Builtins. (line 6) +* diagnostic messages: Language Independent Options. + (line 6) +* dialect options: C Dialect Options. (line 6) +* digits in constraint: Simple Constraints. (line 125) +* directory options: Directory Options. (line 6) +* 'disinterrupt' attribute: Function Attributes. + (line 285) +* 'dl' integer suffix: Decimal Float. (line 6) +* 'DL' integer suffix: Decimal Float. (line 6) +* dollar signs in identifier names: Dollar Signs. (line 6) +* double-word arithmetic: Long Long. (line 6) +* downward funargs: Nested Functions. (line 6) +* drem: Other Builtins. (line 6) +* dremf: Other Builtins. (line 6) +* dreml: Other Builtins. (line 6) +* 'E' in constraint: Simple Constraints. (line 87) +* earlyclobber operand: Modifiers. (line 25) +* eight-bit data on the H8/300, H8/300H, and H8S: Function Attributes. + (line 375) +* 'EIND': AVR Options. (line 222) +* empty structures: Empty Structures. (line 6) +* Enable Cilk Plus: C Dialect Options. (line 276) +* environment variables: Environment Variables. + (line 6) +* erf: Other Builtins. (line 6) +* erfc: Other Builtins. (line 6) +* erfcf: Other Builtins. (line 6) +* erfcl: Other Builtins. (line 6) +* erff: Other Builtins. (line 6) +* erfl: Other Builtins. (line 6) +* 'error' function attribute: Function Attributes. + (line 185) +* error GCC_COLORS capability: Language Independent Options. + (line 67) +* error messages: Warnings and Errors. + (line 6) +* escaped newlines: Escaped Newlines. (line 6) +* exception handler functions: Function Attributes. + (line 385) +* exception handler functions on the Blackfin processor: Function Attributes. + (line 390) +* exclamation point: Multi-Alternative. (line 33) +* exit: Other Builtins. (line 6) +* exp: Other Builtins. (line 6) +* exp10: Other Builtins. (line 6) +* exp10f: Other Builtins. (line 6) +* exp10l: Other Builtins. (line 6) +* exp2: Other Builtins. (line 6) +* exp2f: Other Builtins. (line 6) +* exp2l: Other Builtins. (line 6) +* expf: Other Builtins. (line 6) +* expl: Other Builtins. (line 6) +* explicit register variables: Explicit Reg Vars. (line 6) +* expm1: Other Builtins. (line 6) +* expm1f: Other Builtins. (line 6) +* expm1l: Other Builtins. (line 6) +* expressions containing statements: Statement Exprs. (line 6) +* expressions, constructor: Compound Literals. (line 6) +* extended 'asm': Extended Asm. (line 6) +* extensible constraints: Simple Constraints. (line 161) +* extensions, '?:': Conditionals. (line 6) +* extensions, C language: C Extensions. (line 6) +* extensions, C++ language: C++ Extensions. (line 6) +* external declaration scope: Incompatibilities. (line 80) +* 'externally_visible' attribute.: Function Attributes. + (line 396) +* 'F' in constraint: Simple Constraints. (line 92) +* fabs: Other Builtins. (line 6) +* fabsf: Other Builtins. (line 6) +* fabsl: Other Builtins. (line 6) +* fatal signal: Bug Criteria. (line 9) +* fdim: Other Builtins. (line 6) +* fdimf: Other Builtins. (line 6) +* fdiml: Other Builtins. (line 6) +* FDL, GNU Free Documentation License: GNU Free Documentation License. + (line 6) +* ffs: Other Builtins. (line 6) +* file name suffix: Overall Options. (line 14) +* file names: Link Options. (line 10) +* fixed-point types: Fixed-Point. (line 6) +* 'flatten' function attribute: Function Attributes. + (line 178) +* flexible array members: Zero Length. (line 6) +* 'float' as function value type: Incompatibilities. (line 141) +* floating point precision: Disappointments. (line 68) +* floating-point precision: Optimize Options. (line 1917) +* floor: Other Builtins. (line 6) +* floorf: Other Builtins. (line 6) +* floorl: Other Builtins. (line 6) +* fma: Other Builtins. (line 6) +* fmaf: Other Builtins. (line 6) +* fmal: Other Builtins. (line 6) +* fmax: Other Builtins. (line 6) +* fmaxf: Other Builtins. (line 6) +* fmaxl: Other Builtins. (line 6) +* fmin: Other Builtins. (line 6) +* fminf: Other Builtins. (line 6) +* fminl: Other Builtins. (line 6) +* fmod: Other Builtins. (line 6) +* fmodf: Other Builtins. (line 6) +* fmodl: Other Builtins. (line 6) +* 'force_align_arg_pointer' attribute: Function Attributes. + (line 1384) +* 'format' function attribute: Function Attributes. + (line 453) +* 'format_arg' function attribute: Function Attributes. + (line 518) +* Fortran: G++ and GCC. (line 6) +* 'forwarder_section' attribute: Function Attributes. + (line 756) +* forwarding calls: Constructing Calls. (line 6) +* fprintf: Other Builtins. (line 6) +* fprintf_unlocked: Other Builtins. (line 6) +* fputs: Other Builtins. (line 6) +* fputs_unlocked: Other Builtins. (line 6) +* FR30 Options: FR30 Options. (line 6) +* freestanding environment: Standards. (line 13) +* freestanding implementation: Standards. (line 13) +* frexp: Other Builtins. (line 6) +* frexpf: Other Builtins. (line 6) +* frexpl: Other Builtins. (line 6) +* FRV Options: FRV Options. (line 6) +* fscanf: Other Builtins. (line 6) +* 'fscanf', and constant strings: Incompatibilities. (line 17) +* function addressability on the M32R/D: Function Attributes. + (line 974) +* function attributes: Function Attributes. + (line 6) +* function pointers, arithmetic: Pointer Arith. (line 6) +* function prototype declarations: Function Prototypes. + (line 6) +* function versions: Function Multiversioning. + (line 6) +* function without a prologue/epilogue code: Function Attributes. + (line 1046) +* function, size of pointer to: Pointer Arith. (line 6) +* functions called via pointer on the RS/6000 and PowerPC: Function Attributes. + (line 911) +* functions in arbitrary sections: Function Attributes. + (line 6) +* functions that are dynamically resolved: Function Attributes. + (line 6) +* functions that are passed arguments in registers on the 386: Function Attributes. + (line 6) +* functions that are passed arguments in registers on the 386 <1>: Function Attributes. + (line 1349) +* functions that behave like malloc: Function Attributes. + (line 6) +* functions that do not handle memory bank switching on 68HC11/68HC12: Function Attributes. + (line 1058) +* functions that do not pop the argument stack on the 386: Function Attributes. + (line 6) +* functions that do pop the argument stack on the 386: Function Attributes. + (line 209) +* functions that handle memory bank switching: Function Attributes. + (line 409) +* functions that have different compilation options on the 386: Function Attributes. + (line 6) +* functions that have different optimization options: Function Attributes. + (line 6) +* functions that have no side effects: Function Attributes. + (line 6) +* functions that never return: Function Attributes. + (line 6) +* functions that pop the argument stack on the 386: Function Attributes. + (line 6) +* functions that pop the argument stack on the 386 <1>: Function Attributes. + (line 435) +* functions that pop the argument stack on the 386 <2>: Function Attributes. + (line 443) +* functions that pop the argument stack on the 386 <3>: Function Attributes. + (line 1507) +* functions that return more than once: Function Attributes. + (line 6) +* functions with non-null pointer arguments: Function Attributes. + (line 6) +* functions with 'printf', 'scanf', 'strftime' or 'strfmon' style arguments: Function Attributes. + (line 6) +* 'G' in constraint: Simple Constraints. (line 96) +* 'g' in constraint: Simple Constraints. (line 118) +* g++: Invoking G++. (line 14) +* G++: G++ and GCC. (line 30) +* gamma: Other Builtins. (line 6) +* gammaf: Other Builtins. (line 6) +* gammaf_r: Other Builtins. (line 6) +* gammal: Other Builtins. (line 6) +* gammal_r: Other Builtins. (line 6) +* gamma_r: Other Builtins. (line 6) +* GCC: G++ and GCC. (line 6) +* GCC command options: Invoking GCC. (line 6) +* GCC_COLORS environment variable: Language Independent Options. + (line 35) +* GCC_COMPARE_DEBUG: Environment Variables. + (line 52) +* GCC_EXEC_PREFIX: Environment Variables. + (line 57) +* 'gcc_struct': Type Attributes. (line 323) +* 'gcc_struct' attribute: Variable Attributes. + (line 438) +* 'gcov': Debugging Options. (line 490) +* gettext: Other Builtins. (line 6) +* global offset table: Code Gen Options. (line 278) +* global register after 'longjmp': Global Reg Vars. (line 65) +* global register variables: Global Reg Vars. (line 6) +* GNAT: G++ and GCC. (line 30) +* GNU C Compiler: G++ and GCC. (line 6) +* GNU Compiler Collection: G++ and GCC. (line 6) +* 'gnu_inline' function attribute: Function Attributes. + (line 130) +* Go: G++ and GCC. (line 6) +* goto with computed label: Labels as Values. (line 6) +* 'gprof': Debugging Options. (line 415) +* grouping options: Invoking GCC. (line 26) +* 'H' in constraint: Simple Constraints. (line 96) +* half-precision floating point: Half-Precision. (line 6) +* hardware models and configurations, specifying: Submodel Options. + (line 6) +* hex floats: Hex Floats. (line 6) +* highlight, color, colour: Language Independent Options. + (line 35) +* 'hk' fixed-suffix: Fixed-Point. (line 6) +* 'HK' fixed-suffix: Fixed-Point. (line 6) +* hosted environment: Standards. (line 13) +* hosted environment <1>: C Dialect Options. (line 244) +* hosted environment <2>: C Dialect Options. (line 252) +* hosted implementation: Standards. (line 13) +* 'hot' function attribute: Function Attributes. + (line 1285) +* 'hot' label attribute: Function Attributes. + (line 1297) +* 'hotpatch' attribute: Function Attributes. + (line 1037) +* HPPA Options: HPPA Options. (line 6) +* 'hr' fixed-suffix: Fixed-Point. (line 6) +* 'HR' fixed-suffix: Fixed-Point. (line 6) +* hypot: Other Builtins. (line 6) +* hypotf: Other Builtins. (line 6) +* hypotl: Other Builtins. (line 6) +* 'i' in constraint: Simple Constraints. (line 68) +* 'I' in constraint: Simple Constraints. (line 79) +* i386 and x86-64 Windows Options: i386 and x86-64 Windows Options. + (line 6) +* i386 Options: i386 and x86-64 Options. + (line 6) +* IA-64 Options: IA-64 Options. (line 6) +* IBM RS/6000 and PowerPC Options: RS/6000 and PowerPC Options. + (line 6) +* identifier names, dollar signs in: Dollar Signs. (line 6) +* identifiers, names in assembler code: Asm Labels. (line 6) +* 'ifunc' attribute: Function Attributes. + (line 625) +* ilogb: Other Builtins. (line 6) +* ilogbf: Other Builtins. (line 6) +* ilogbl: Other Builtins. (line 6) +* imaxabs: Other Builtins. (line 6) +* implementation-defined behavior, C language: C Implementation. + (line 6) +* implementation-defined behavior, C++ language: C++ Implementation. + (line 6) +* implied '#pragma implementation': C++ Interface. (line 46) +* incompatibilities of GCC: Incompatibilities. (line 6) +* increment operators: Bug Criteria. (line 17) +* index: Other Builtins. (line 6) +* indirect calls on ARC: Function Attributes. + (line 888) +* indirect calls on ARM: Function Attributes. + (line 888) +* indirect calls on Epiphany: Function Attributes. + (line 888) +* indirect calls on MIPS: Function Attributes. + (line 923) +* initializations in expressions: Compound Literals. (line 6) +* initializers with labeled elements: Designated Inits. (line 6) +* initializers, non-constant: Initializers. (line 6) +* 'init_priority' attribute: C++ Attributes. (line 35) +* 'inline' automatic for C++ member fns: Inline. (line 71) +* inline functions: Inline. (line 6) +* inline functions, omission of: Inline. (line 51) +* inlining and C++ pragmas: C++ Interface. (line 66) +* installation trouble: Trouble. (line 6) +* integrating function code: Inline. (line 6) +* Intel 386 Options: i386 and x86-64 Options. + (line 6) +* interface and implementation headers, C++: C++ Interface. (line 6) +* intermediate C version, nonexistent: G++ and GCC. (line 35) +* interrupt handler functions: Function Attributes. + (line 173) +* interrupt handler functions <1>: Function Attributes. + (line 429) +* interrupt handler functions <2>: Function Attributes. + (line 665) +* interrupt handler functions on the AVR processors: Function Attributes. + (line 1479) +* interrupt handler functions on the Blackfin, m68k, H8/300 and SH processors: Function Attributes. + (line 826) +* interrupt service routines on ARM: Function Attributes. + (line 840) +* interrupt thread functions on fido: Function Attributes. + (line 832) +* introduction: Top. (line 6) +* invalid assembly code: Bug Criteria. (line 12) +* invalid input: Bug Criteria. (line 42) +* invoking 'g++': Invoking G++. (line 22) +* isalnum: Other Builtins. (line 6) +* isalpha: Other Builtins. (line 6) +* isascii: Other Builtins. (line 6) +* isblank: Other Builtins. (line 6) +* iscntrl: Other Builtins. (line 6) +* isdigit: Other Builtins. (line 6) +* isgraph: Other Builtins. (line 6) +* islower: Other Builtins. (line 6) +* ISO 9899: Standards. (line 13) +* ISO C: Standards. (line 13) +* ISO C standard: Standards. (line 13) +* ISO C11: Standards. (line 13) +* ISO C1X: Standards. (line 13) +* ISO C90: Standards. (line 13) +* ISO C94: Standards. (line 13) +* ISO C95: Standards. (line 13) +* ISO C99: Standards. (line 13) +* ISO C9X: Standards. (line 13) +* ISO support: C Dialect Options. (line 10) +* ISO/IEC 9899: Standards. (line 13) +* isprint: Other Builtins. (line 6) +* ispunct: Other Builtins. (line 6) +* isspace: Other Builtins. (line 6) +* isupper: Other Builtins. (line 6) +* iswalnum: Other Builtins. (line 6) +* iswalpha: Other Builtins. (line 6) +* iswblank: Other Builtins. (line 6) +* iswcntrl: Other Builtins. (line 6) +* iswdigit: Other Builtins. (line 6) +* iswgraph: Other Builtins. (line 6) +* iswlower: Other Builtins. (line 6) +* iswprint: Other Builtins. (line 6) +* iswpunct: Other Builtins. (line 6) +* iswspace: Other Builtins. (line 6) +* iswupper: Other Builtins. (line 6) +* iswxdigit: Other Builtins. (line 6) +* isxdigit: Other Builtins. (line 6) +* j0: Other Builtins. (line 6) +* j0f: Other Builtins. (line 6) +* j0l: Other Builtins. (line 6) +* j1: Other Builtins. (line 6) +* j1f: Other Builtins. (line 6) +* j1l: Other Builtins. (line 6) +* Java: G++ and GCC. (line 6) +* 'java_interface' attribute: C++ Attributes. (line 56) +* jn: Other Builtins. (line 6) +* jnf: Other Builtins. (line 6) +* jnl: Other Builtins. (line 6) +* 'k' fixed-suffix: Fixed-Point. (line 6) +* 'K' fixed-suffix: Fixed-Point. (line 6) +* 'keep_interrupts_masked' attribute: Function Attributes. + (line 778) +* keywords, alternate: Alternate Keywords. (line 6) +* known causes of trouble: Trouble. (line 6) +* 'l1_data' variable attribute: Variable Attributes. + (line 352) +* 'l1_data_A' variable attribute: Variable Attributes. + (line 352) +* 'l1_data_B' variable attribute: Variable Attributes. + (line 352) +* 'l1_text' function attribute: Function Attributes. + (line 849) +* 'l2' function attribute: Function Attributes. + (line 855) +* 'l2' variable attribute: Variable Attributes. + (line 360) +* labeled elements in initializers: Designated Inits. (line 6) +* labels as values: Labels as Values. (line 6) +* labs: Other Builtins. (line 6) +* LANG: Environment Variables. + (line 21) +* LANG <1>: Environment Variables. + (line 106) +* language dialect options: C Dialect Options. (line 6) +* LC_ALL: Environment Variables. + (line 21) +* LC_CTYPE: Environment Variables. + (line 21) +* LC_MESSAGES: Environment Variables. + (line 21) +* ldexp: Other Builtins. (line 6) +* ldexpf: Other Builtins. (line 6) +* ldexpl: Other Builtins. (line 6) +* 'leaf' function attribute: Function Attributes. + (line 861) +* length-zero arrays: Zero Length. (line 6) +* lgamma: Other Builtins. (line 6) +* lgammaf: Other Builtins. (line 6) +* lgammaf_r: Other Builtins. (line 6) +* lgammal: Other Builtins. (line 6) +* lgammal_r: Other Builtins. (line 6) +* lgamma_r: Other Builtins. (line 6) +* Libraries: Link Options. (line 24) +* LIBRARY_PATH: Environment Variables. + (line 97) +* link options: Link Options. (line 6) +* linker script: Link Options. (line 213) +* 'lk' fixed-suffix: Fixed-Point. (line 6) +* 'LK' fixed-suffix: Fixed-Point. (line 6) +* 'LL' integer suffix: Long Long. (line 6) +* llabs: Other Builtins. (line 6) +* 'llk' fixed-suffix: Fixed-Point. (line 6) +* 'LLK' fixed-suffix: Fixed-Point. (line 6) +* 'llr' fixed-suffix: Fixed-Point. (line 6) +* 'LLR' fixed-suffix: Fixed-Point. (line 6) +* llrint: Other Builtins. (line 6) +* llrintf: Other Builtins. (line 6) +* llrintl: Other Builtins. (line 6) +* llround: Other Builtins. (line 6) +* llroundf: Other Builtins. (line 6) +* llroundl: Other Builtins. (line 6) +* LM32 options: LM32 Options. (line 6) +* load address instruction: Simple Constraints. (line 152) +* local labels: Local Labels. (line 6) +* local variables in macros: Typeof. (line 46) +* local variables, specifying registers: Local Reg Vars. (line 6) +* locale: Environment Variables. + (line 21) +* locale definition: Environment Variables. + (line 106) +* locus GCC_COLORS capability: Language Independent Options. + (line 79) +* log: Other Builtins. (line 6) +* log10: Other Builtins. (line 6) +* log10f: Other Builtins. (line 6) +* log10l: Other Builtins. (line 6) +* log1p: Other Builtins. (line 6) +* log1pf: Other Builtins. (line 6) +* log1pl: Other Builtins. (line 6) +* log2: Other Builtins. (line 6) +* log2f: Other Builtins. (line 6) +* log2l: Other Builtins. (line 6) +* logb: Other Builtins. (line 6) +* logbf: Other Builtins. (line 6) +* logbl: Other Builtins. (line 6) +* logf: Other Builtins. (line 6) +* logl: Other Builtins. (line 6) +* 'long long' data types: Long Long. (line 6) +* longjmp: Global Reg Vars. (line 65) +* 'longjmp' incompatibilities: Incompatibilities. (line 39) +* 'longjmp' warnings: Warning Options. (line 666) +* 'lr' fixed-suffix: Fixed-Point. (line 6) +* 'LR' fixed-suffix: Fixed-Point. (line 6) +* lrint: Other Builtins. (line 6) +* lrintf: Other Builtins. (line 6) +* lrintl: Other Builtins. (line 6) +* lround: Other Builtins. (line 6) +* lroundf: Other Builtins. (line 6) +* lroundl: Other Builtins. (line 6) +* 'm' in constraint: Simple Constraints. (line 17) +* M32C options: M32C Options. (line 6) +* M32R/D options: M32R/D Options. (line 6) +* M680x0 options: M680x0 Options. (line 6) +* machine dependent options: Submodel Options. (line 6) +* machine specific constraints: Machine Constraints. + (line 6) +* macro with variable arguments: Variadic Macros. (line 6) +* macros containing 'asm': Extended Asm. (line 237) +* macros, inline alternative: Inline. (line 6) +* macros, local labels: Local Labels. (line 6) +* macros, local variables in: Typeof. (line 46) +* macros, statements in expressions: Statement Exprs. (line 6) +* macros, types of arguments: Typeof. (line 6) +* 'make': Preprocessor Options. + (line 185) +* malloc: Other Builtins. (line 6) +* 'malloc' attribute: Function Attributes. + (line 933) +* matching constraint: Simple Constraints. (line 137) +* MCore options: MCore Options. (line 6) +* member fns, automatically 'inline': Inline. (line 71) +* memchr: Other Builtins. (line 6) +* memcmp: Other Builtins. (line 6) +* memcpy: Other Builtins. (line 6) +* memory references in constraints: Simple Constraints. (line 17) +* mempcpy: Other Builtins. (line 6) +* memset: Other Builtins. (line 6) +* MeP options: MeP Options. (line 6) +* Mercury: G++ and GCC. (line 23) +* message formatting: Language Independent Options. + (line 6) +* messages, warning: Warning Options. (line 6) +* messages, warning and error: Warnings and Errors. + (line 6) +* MicroBlaze Options: MicroBlaze Options. (line 6) +* 'micromips' attribute: Function Attributes. + (line 957) +* middle-operands, omitted: Conditionals. (line 6) +* MIPS options: MIPS Options. (line 6) +* 'mips16' attribute: Function Attributes. + (line 942) +* misunderstandings in C++: C++ Misunderstandings. + (line 6) +* mixed declarations and code: Mixed Declarations. (line 6) +* 'mktemp', and constant strings: Incompatibilities. (line 13) +* MMIX Options: MMIX Options. (line 6) +* MN10300 options: MN10300 Options. (line 6) +* 'mode' attribute: Variable Attributes. + (line 133) +* modf: Other Builtins. (line 6) +* modff: Other Builtins. (line 6) +* modfl: Other Builtins. (line 6) +* modifiers in constraints: Modifiers. (line 6) +* Moxie Options: Moxie Options. (line 6) +* MSP430 Options: MSP430 Options. (line 6) +* 'ms_abi' attribute: Function Attributes. + (line 1003) +* 'ms_hook_prologue' attribute: Function Attributes. + (line 1030) +* 'ms_struct': Type Attributes. (line 323) +* 'ms_struct' attribute: Variable Attributes. + (line 438) +* multiple alternative constraints: Multi-Alternative. (line 6) +* multiprecision arithmetic: Long Long. (line 6) +* 'n' in constraint: Simple Constraints. (line 73) +* Named Address Spaces: Named Address Spaces. + (line 6) +* names used in assembler code: Asm Labels. (line 6) +* naming convention, implementation headers: C++ Interface. (line 46) +* NDS32 Options: NDS32 Options. (line 6) +* nearbyint: Other Builtins. (line 6) +* nearbyintf: Other Builtins. (line 6) +* nearbyintl: Other Builtins. (line 6) +* 'nested' attribute: Function Attributes. + (line 806) +* nested functions: Nested Functions. (line 6) +* 'nested_ready' attribute: Function Attributes. + (line 810) +* newlines (escaped): Escaped Newlines. (line 6) +* nextafter: Other Builtins. (line 6) +* nextafterf: Other Builtins. (line 6) +* nextafterl: Other Builtins. (line 6) +* nexttoward: Other Builtins. (line 6) +* nexttowardf: Other Builtins. (line 6) +* nexttowardl: Other Builtins. (line 6) +* NFC: Warning Options. (line 1289) +* NFKC: Warning Options. (line 1289) +* Nios II options: Nios II Options. (line 6) +* 'nmi' attribute: Function Attributes. + (line 1371) +* NMI handler functions on the Blackfin processor: Function Attributes. + (line 1073) +* 'noclone' function attribute: Function Attributes. + (line 1107) +* 'nocommon' attribute: Variable Attributes. + (line 104) +* 'nocompression' attribute: Function Attributes. + (line 1079) +* 'noinline' function attribute: Function Attributes. + (line 1096) +* 'nomicromips' attribute: Function Attributes. + (line 957) +* 'nomips16' attribute: Function Attributes. + (line 942) +* non-constant initializers: Initializers. (line 6) +* non-static inline function: Inline. (line 85) +* 'nonnull' function attribute: Function Attributes. + (line 1113) +* 'noreturn' function attribute: Function Attributes. + (line 1147) +* 'nosave_low_regs' attribute: Function Attributes. + (line 1197) +* note GCC_COLORS capability: Language Independent Options. + (line 73) +* 'nothrow' function attribute: Function Attributes. + (line 1189) +* 'not_nested' attribute: Function Attributes. + (line 808) +* 'no_instrument_function' function attribute: Function Attributes. + (line 1085) +* 'no_sanitize_address' function attribute: Function Attributes. + (line 1335) +* 'no_sanitize_undefined' function attribute: Function Attributes. + (line 1343) +* 'no_split_stack' function attribute: Function Attributes. + (line 1090) +* 'o' in constraint: Simple Constraints. (line 23) +* OBJC_INCLUDE_PATH: Environment Variables. + (line 130) +* Objective-C: G++ and GCC. (line 6) +* Objective-C <1>: Standards. (line 162) +* Objective-C and Objective-C++ options, command-line: Objective-C and Objective-C++ Dialect Options. + (line 6) +* Objective-C++: G++ and GCC. (line 6) +* Objective-C++ <1>: Standards. (line 162) +* offsettable address: Simple Constraints. (line 23) +* old-style function definitions: Function Prototypes. + (line 6) +* omitted middle-operands: Conditionals. (line 6) +* open coding: Inline. (line 6) +* OpenMP parallel: C Dialect Options. (line 263) +* OpenMP SIMD: C Dialect Options. (line 272) +* operand constraints, 'asm': Constraints. (line 6) +* 'optimize' function attribute: Function Attributes. + (line 1203) +* optimize options: Optimize Options. (line 6) +* options to control diagnostics formatting: Language Independent Options. + (line 6) +* options to control warnings: Warning Options. (line 6) +* options, C++: C++ Dialect Options. + (line 6) +* options, code generation: Code Gen Options. (line 6) +* options, debugging: Debugging Options. (line 6) +* options, dialect: C Dialect Options. (line 6) +* options, directory search: Directory Options. (line 6) +* options, GCC command: Invoking GCC. (line 6) +* options, grouping: Invoking GCC. (line 26) +* options, linking: Link Options. (line 6) +* options, Objective-C and Objective-C++: Objective-C and Objective-C++ Dialect Options. + (line 6) +* options, optimization: Optimize Options. (line 6) +* options, order: Invoking GCC. (line 30) +* options, preprocessor: Preprocessor Options. + (line 6) +* order of evaluation, side effects: Non-bugs. (line 196) +* order of options: Invoking GCC. (line 30) +* 'OS_main' AVR function attribute: Function Attributes. + (line 1220) +* 'OS_task' AVR function attribute: Function Attributes. + (line 1220) +* other register constraints: Simple Constraints. (line 161) +* output file option: Overall Options. (line 191) +* overloaded virtual function, warning: C++ Dialect Options. + (line 655) +* 'p' in constraint: Simple Constraints. (line 152) +* 'packed' attribute: Variable Attributes. + (line 144) +* parameter forward declaration: Variable Length. (line 68) +* 'partial_save' attribute: Function Attributes. + (line 818) +* Pascal: G++ and GCC. (line 23) +* 'pcs' function attribute: Function Attributes. + (line 1244) +* PDP-11 Options: PDP-11 Options. (line 6) +* PIC: Code Gen Options. (line 278) +* picoChip options: picoChip Options. (line 6) +* pmf: Bound member functions. + (line 6) +* pointer arguments: Function Attributes. + (line 220) +* pointer to member function: Bound member functions. + (line 6) +* portions of temporary objects, pointers to: Temporaries. (line 6) +* pow: Other Builtins. (line 6) +* pow10: Other Builtins. (line 6) +* pow10f: Other Builtins. (line 6) +* pow10l: Other Builtins. (line 6) +* PowerPC options: PowerPC Options. (line 6) +* powf: Other Builtins. (line 6) +* powl: Other Builtins. (line 6) +* pragma GCC ivdep: Loop-Specific Pragmas. + (line 7) +* pragma GCC optimize: Function Specific Option Pragmas. + (line 20) +* pragma GCC pop_options: Function Specific Option Pragmas. + (line 34) +* pragma GCC push_options: Function Specific Option Pragmas. + (line 34) +* pragma GCC reset_options: Function Specific Option Pragmas. + (line 45) +* pragma GCC target: Function Specific Option Pragmas. + (line 7) +* pragma, address: M32C Pragmas. (line 15) +* pragma, align: Solaris Pragmas. (line 11) +* pragma, call: MeP Pragmas. (line 48) +* pragma, coprocessor available: MeP Pragmas. (line 13) +* pragma, coprocessor call_saved: MeP Pragmas. (line 20) +* pragma, coprocessor subclass: MeP Pragmas. (line 28) +* pragma, custom io_volatile: MeP Pragmas. (line 7) +* pragma, diagnostic: Diagnostic Pragmas. (line 14) +* pragma, diagnostic <1>: Diagnostic Pragmas. (line 57) +* pragma, disinterrupt: MeP Pragmas. (line 38) +* pragma, fini: Solaris Pragmas. (line 20) +* pragma, init: Solaris Pragmas. (line 26) +* pragma, longcall: RS/6000 and PowerPC Pragmas. + (line 14) +* pragma, long_calls: ARM Pragmas. (line 11) +* pragma, long_calls_off: ARM Pragmas. (line 17) +* pragma, mark: Darwin Pragmas. (line 11) +* pragma, memregs: M32C Pragmas. (line 7) +* pragma, no_long_calls: ARM Pragmas. (line 14) +* pragma, options align: Darwin Pragmas. (line 14) +* pragma, pop_macro: Push/Pop Macro Pragmas. + (line 15) +* pragma, push_macro: Push/Pop Macro Pragmas. + (line 11) +* pragma, reason for not using: Function Attributes. + (line 2055) +* pragma, redefine_extname: Symbol-Renaming Pragmas. + (line 12) +* pragma, segment: Darwin Pragmas. (line 21) +* pragma, unused: Darwin Pragmas. (line 24) +* pragma, visibility: Visibility Pragmas. (line 8) +* pragma, weak: Weak Pragmas. (line 10) +* pragmas: Pragmas. (line 6) +* pragmas in C++, effect on inlining: C++ Interface. (line 66) +* pragmas, interface and implementation: C++ Interface. (line 6) +* pragmas, warning of unknown: Warning Options. (line 683) +* precompiled headers: Precompiled Headers. + (line 6) +* preprocessing numbers: Incompatibilities. (line 173) +* preprocessing tokens: Incompatibilities. (line 173) +* preprocessor options: Preprocessor Options. + (line 6) +* printf: Other Builtins. (line 6) +* printf_unlocked: Other Builtins. (line 6) +* 'prof': Debugging Options. (line 409) +* 'progmem' AVR variable attribute: Variable Attributes. + (line 314) +* promotion of formal parameters: Function Prototypes. + (line 6) +* 'pure' function attribute: Function Attributes. + (line 1263) +* push address instruction: Simple Constraints. (line 152) +* putchar: Other Builtins. (line 6) +* puts: Other Builtins. (line 6) +* 'q' floating point suffix: Floating Types. (line 6) +* 'Q' floating point suffix: Floating Types. (line 6) +* 'qsort', and global register variables: Global Reg Vars. (line 41) +* question mark: Multi-Alternative. (line 27) +* quote GCC_COLORS capability: Language Independent Options. + (line 83) +* 'r' fixed-suffix: Fixed-Point. (line 6) +* 'R' fixed-suffix: Fixed-Point. (line 6) +* 'r' in constraint: Simple Constraints. (line 64) +* 'RAMPD': AVR Options. (line 333) +* 'RAMPX': AVR Options. (line 333) +* 'RAMPY': AVR Options. (line 333) +* 'RAMPZ': AVR Options. (line 333) +* ranges in case statements: Case Ranges. (line 6) +* read-only strings: Incompatibilities. (line 9) +* 'reentrant' attribute: Function Attributes. + (line 723) +* register variable after 'longjmp': Global Reg Vars. (line 65) +* registers: Extended Asm. (line 6) +* registers for local variables: Local Reg Vars. (line 6) +* registers in constraints: Simple Constraints. (line 64) +* registers, global allocation: Explicit Reg Vars. (line 6) +* registers, global variables in: Global Reg Vars. (line 6) +* 'regparm' attribute: Function Attributes. + (line 1349) +* relocation truncated to fit (ColdFire): M680x0 Options. (line 325) +* relocation truncated to fit (MIPS): MIPS Options. (line 207) +* remainder: Other Builtins. (line 6) +* remainderf: Other Builtins. (line 6) +* remainderl: Other Builtins. (line 6) +* remquo: Other Builtins. (line 6) +* remquof: Other Builtins. (line 6) +* remquol: Other Builtins. (line 6) +* 'renesas' attribute: Function Attributes. + (line 1392) +* reordering, warning: C++ Dialect Options. + (line 573) +* reporting bugs: Bugs. (line 6) +* 'resbank' attribute: Function Attributes. + (line 1396) +* reset handler functions: Function Attributes. + (line 1366) +* rest argument (in macro): Variadic Macros. (line 6) +* restricted pointers: Restricted Pointers. + (line 6) +* restricted references: Restricted Pointers. + (line 6) +* restricted this pointer: Restricted Pointers. + (line 6) +* 'returns_nonnull' function attribute: Function Attributes. + (line 1137) +* 'returns_twice' attribute: Function Attributes. + (line 1410) +* rindex: Other Builtins. (line 6) +* rint: Other Builtins. (line 6) +* rintf: Other Builtins. (line 6) +* rintl: Other Builtins. (line 6) +* RL78 Options: RL78 Options. (line 6) +* round: Other Builtins. (line 6) +* roundf: Other Builtins. (line 6) +* roundl: Other Builtins. (line 6) +* RS/6000 and PowerPC Options: RS/6000 and PowerPC Options. + (line 6) +* RTTI: Vague Linkage. (line 42) +* run-time options: Code Gen Options. (line 6) +* RX Options: RX Options. (line 6) +* 's' in constraint: Simple Constraints. (line 100) +* S/390 and zSeries Options: S/390 and zSeries Options. + (line 6) +* save all registers on the Blackfin, H8/300, H8/300H, and H8S: Function Attributes. + (line 1419) +* save volatile registers on the MicroBlaze: Function Attributes. + (line 1424) +* 'save_all' attribute: Function Attributes. + (line 815) +* scalb: Other Builtins. (line 6) +* scalbf: Other Builtins. (line 6) +* scalbl: Other Builtins. (line 6) +* scalbln: Other Builtins. (line 6) +* scalblnf: Other Builtins. (line 6) +* scalblnf <1>: Other Builtins. (line 6) +* scalbn: Other Builtins. (line 6) +* scalbnf: Other Builtins. (line 6) +* 'scanf', and constant strings: Incompatibilities. (line 17) +* scanfnl: Other Builtins. (line 6) +* scope of a variable length array: Variable Length. (line 22) +* scope of declaration: Disappointments. (line 21) +* scope of external declarations: Incompatibilities. (line 80) +* Score Options: Score Options. (line 6) +* search path: Directory Options. (line 6) +* 'section' function attribute: Function Attributes. + (line 1432) +* 'section' variable attribute: Variable Attributes. + (line 165) +* 'sentinel' function attribute: Function Attributes. + (line 1448) +* setjmp: Global Reg Vars. (line 65) +* 'setjmp' incompatibilities: Incompatibilities. (line 39) +* shared strings: Incompatibilities. (line 9) +* 'shared' variable attribute: Variable Attributes. + (line 210) +* side effect in '?:': Conditionals. (line 20) +* side effects, macro argument: Statement Exprs. (line 35) +* side effects, order of evaluation: Non-bugs. (line 196) +* signbit: Other Builtins. (line 6) +* signbitd128: Other Builtins. (line 6) +* signbitd32: Other Builtins. (line 6) +* signbitd64: Other Builtins. (line 6) +* signbitf: Other Builtins. (line 6) +* signbitl: Other Builtins. (line 6) +* signed and unsigned values, comparison warning: Warning Options. + (line 1155) +* significand: Other Builtins. (line 6) +* significandf: Other Builtins. (line 6) +* significandl: Other Builtins. (line 6) +* SIMD: C Dialect Options. (line 272) +* simple constraints: Simple Constraints. (line 6) +* sin: Other Builtins. (line 6) +* sincos: Other Builtins. (line 6) +* sincosf: Other Builtins. (line 6) +* sincosl: Other Builtins. (line 6) +* sinf: Other Builtins. (line 6) +* sinh: Other Builtins. (line 6) +* sinhf: Other Builtins. (line 6) +* sinhl: Other Builtins. (line 6) +* sinl: Other Builtins. (line 6) +* sizeof: Typeof. (line 6) +* smaller data references: M32R/D Options. (line 57) +* smaller data references <1>: Nios II Options. (line 9) +* smaller data references (PowerPC): RS/6000 and PowerPC Options. + (line 739) +* snprintf: Other Builtins. (line 6) +* Solaris 2 options: Solaris 2 Options. (line 6) +* SPARC options: SPARC Options. (line 6) +* Spec Files: Spec Files. (line 6) +* specified registers: Explicit Reg Vars. (line 6) +* specifying compiler version and target machine: Target Options. + (line 6) +* specifying hardware config: Submodel Options. (line 6) +* specifying machine version: Target Options. (line 6) +* specifying registers for local variables: Local Reg Vars. (line 6) +* speed of compilation: Precompiled Headers. + (line 6) +* sprintf: Other Builtins. (line 6) +* SPU options: SPU Options. (line 6) +* 'sp_switch' attribute: Function Attributes. + (line 1497) +* sqrt: Other Builtins. (line 6) +* sqrtf: Other Builtins. (line 6) +* sqrtl: Other Builtins. (line 6) +* sscanf: Other Builtins. (line 6) +* 'sscanf', and constant strings: Incompatibilities. (line 17) +* 'sseregparm' attribute: Function Attributes. + (line 1377) +* statements inside expressions: Statement Exprs. (line 6) +* static data in C++, declaring and defining: Static Definitions. + (line 6) +* stpcpy: Other Builtins. (line 6) +* stpncpy: Other Builtins. (line 6) +* strcasecmp: Other Builtins. (line 6) +* strcat: Other Builtins. (line 6) +* strchr: Other Builtins. (line 6) +* strcmp: Other Builtins. (line 6) +* strcpy: Other Builtins. (line 6) +* strcspn: Other Builtins. (line 6) +* strdup: Other Builtins. (line 6) +* strfmon: Other Builtins. (line 6) +* strftime: Other Builtins. (line 6) +* string constants: Incompatibilities. (line 9) +* strlen: Other Builtins. (line 6) +* strncasecmp: Other Builtins. (line 6) +* strncat: Other Builtins. (line 6) +* strncmp: Other Builtins. (line 6) +* strncpy: Other Builtins. (line 6) +* strndup: Other Builtins. (line 6) +* strpbrk: Other Builtins. (line 6) +* strrchr: Other Builtins. (line 6) +* strspn: Other Builtins. (line 6) +* strstr: Other Builtins. (line 6) +* 'struct': Unnamed Fields. (line 6) +* struct __htm_tdb: S/390 System z Built-in Functions. + (line 49) +* structures: Incompatibilities. (line 146) +* structures, constructor expression: Compound Literals. (line 6) +* submodel options: Submodel Options. (line 6) +* subscripting: Subscripting. (line 6) +* subscripting and function values: Subscripting. (line 6) +* suffixes for C++ source: Invoking G++. (line 6) +* SUNPRO_DEPENDENCIES: Environment Variables. + (line 170) +* suppressing warnings: Warning Options. (line 6) +* surprises in C++: C++ Misunderstandings. + (line 6) +* syntax checking: Warning Options. (line 13) +* 'syscall_linkage' attribute: Function Attributes. + (line 1512) +* system headers, warnings from: Warning Options. (line 834) +* 'sysv_abi' attribute: Function Attributes. + (line 1003) +* tan: Other Builtins. (line 6) +* tanf: Other Builtins. (line 6) +* tanh: Other Builtins. (line 6) +* tanhf: Other Builtins. (line 6) +* tanhl: Other Builtins. (line 6) +* tanl: Other Builtins. (line 6) +* 'target' function attribute: Function Attributes. + (line 1519) +* target machine, specifying: Target Options. (line 6) +* target options: Target Options. (line 6) +* 'target("abm")' attribute: Function Attributes. + (line 1552) +* 'target("aes")' attribute: Function Attributes. + (line 1557) +* 'target("align-stringops")' attribute: Function Attributes. + (line 1651) +* 'target("altivec")' attribute: Function Attributes. + (line 1677) +* 'target("arch=ARCH")' attribute: Function Attributes. + (line 1660) +* 'target("avoid-indexed-addresses")' attribute: Function Attributes. + (line 1798) +* 'target("cld")' attribute: Function Attributes. + (line 1622) +* 'target("cmpb")' attribute: Function Attributes. + (line 1683) +* 'target("cpu=CPU")' attribute: Function Attributes. + (line 1813) +* 'target("custom-fpu-cfg=NAME")' attribute: Function Attributes. + (line 1839) +* 'target("custom-INSN=N")' attribute: Function Attributes. + (line 1830) +* 'target("default")' attribute: Function Attributes. + (line 1560) +* 'target("dlmzb")' attribute: Function Attributes. + (line 1689) +* 'target("fancy-math-387")' attribute: Function Attributes. + (line 1626) +* 'target("fma4")' attribute: Function Attributes. + (line 1606) +* 'target("fpmath=FPMATH")' attribute: Function Attributes. + (line 1668) +* 'target("fprnd")' attribute: Function Attributes. + (line 1696) +* 'target("friz")' attribute: Function Attributes. + (line 1789) +* 'target("fused-madd")' attribute: Function Attributes. + (line 1631) +* 'target("hard-dfp")' attribute: Function Attributes. + (line 1702) +* 'target("ieee-fp")' attribute: Function Attributes. + (line 1636) +* 'target("inline-all-stringops")' attribute: Function Attributes. + (line 1641) +* 'target("inline-stringops-dynamically")' attribute: Function Attributes. + (line 1645) +* 'target("isel")' attribute: Function Attributes. + (line 1708) +* 'target("longcall")' attribute: Function Attributes. + (line 1808) +* 'target("lwp")' attribute: Function Attributes. + (line 1614) +* 'target("mfcrf")' attribute: Function Attributes. + (line 1712) +* 'target("mfpgpr")' attribute: Function Attributes. + (line 1719) +* 'target("mmx")' attribute: Function Attributes. + (line 1565) +* 'target("mulhw")' attribute: Function Attributes. + (line 1726) +* 'target("multiple")' attribute: Function Attributes. + (line 1733) +* 'target("no-custom-INSN")' attribute: Function Attributes. + (line 1830) +* 'target("paired")' attribute: Function Attributes. + (line 1803) +* 'target("pclmul")' attribute: Function Attributes. + (line 1569) +* 'target("popcnt")' attribute: Function Attributes. + (line 1573) +* 'target("popcntb")' attribute: Function Attributes. + (line 1744) +* 'target("popcntd")' attribute: Function Attributes. + (line 1751) +* 'target("powerpc-gfxopt")' attribute: Function Attributes. + (line 1757) +* 'target("powerpc-gpopt")' attribute: Function Attributes. + (line 1763) +* 'target("recip")' attribute: Function Attributes. + (line 1655) +* 'target("recip-precision")' attribute: Function Attributes. + (line 1769) +* 'target("sse")' attribute: Function Attributes. + (line 1577) +* 'target("sse2")' attribute: Function Attributes. + (line 1581) +* 'target("sse3")' attribute: Function Attributes. + (line 1585) +* 'target("sse4")' attribute: Function Attributes. + (line 1589) +* 'target("sse4.1")' attribute: Function Attributes. + (line 1594) +* 'target("sse4.2")' attribute: Function Attributes. + (line 1598) +* 'target("sse4a")' attribute: Function Attributes. + (line 1602) +* 'target("ssse3")' attribute: Function Attributes. + (line 1618) +* 'target("string")' attribute: Function Attributes. + (line 1775) +* 'target("tune=TUNE")' attribute: Function Attributes. + (line 1664) +* 'target("tune=TUNE")' attribute <1>: Function Attributes. + (line 1820) +* 'target("update")' attribute: Function Attributes. + (line 1738) +* 'target("vsx")' attribute: Function Attributes. + (line 1781) +* 'target("xop")' attribute: Function Attributes. + (line 1610) +* TC1: Standards. (line 13) +* TC2: Standards. (line 13) +* TC3: Standards. (line 13) +* Technical Corrigenda: Standards. (line 13) +* Technical Corrigendum 1: Standards. (line 13) +* Technical Corrigendum 2: Standards. (line 13) +* Technical Corrigendum 3: Standards. (line 13) +* template instantiation: Template Instantiation. + (line 6) +* temporaries, lifetime of: Temporaries. (line 6) +* tgamma: Other Builtins. (line 6) +* tgammaf: Other Builtins. (line 6) +* tgammal: Other Builtins. (line 6) +* Thread-Local Storage: Thread-Local. (line 6) +* thunks: Nested Functions. (line 6) +* TILE-Gx options: TILE-Gx Options. (line 6) +* TILEPro options: TILEPro Options. (line 6) +* tiny data section on the H8/300H and H8S: Function Attributes. + (line 1852) +* TLS: Thread-Local. (line 6) +* 'tls_model' attribute: Variable Attributes. + (line 233) +* TMPDIR: Environment Variables. + (line 45) +* toascii: Other Builtins. (line 6) +* tolower: Other Builtins. (line 6) +* toupper: Other Builtins. (line 6) +* towlower: Other Builtins. (line 6) +* towupper: Other Builtins. (line 6) +* traditional C language: C Dialect Options. (line 331) +* 'trapa_handler' attribute: Function Attributes. + (line 1864) +* 'trap_exit' attribute: Function Attributes. + (line 1859) +* trunc: Other Builtins. (line 6) +* truncf: Other Builtins. (line 6) +* truncl: Other Builtins. (line 6) +* two-stage name lookup: Name lookup. (line 6) +* type alignment: Alignment. (line 6) +* type attributes: Type Attributes. (line 6) +* typedef names as function parameters: Incompatibilities. (line 97) +* typeof: Typeof. (line 6) +* 'type_info': Vague Linkage. (line 42) +* 'uhk' fixed-suffix: Fixed-Point. (line 6) +* 'UHK' fixed-suffix: Fixed-Point. (line 6) +* 'uhr' fixed-suffix: Fixed-Point. (line 6) +* 'UHR' fixed-suffix: Fixed-Point. (line 6) +* 'uk' fixed-suffix: Fixed-Point. (line 6) +* 'UK' fixed-suffix: Fixed-Point. (line 6) +* 'ulk' fixed-suffix: Fixed-Point. (line 6) +* 'ULK' fixed-suffix: Fixed-Point. (line 6) +* 'ULL' integer suffix: Long Long. (line 6) +* 'ullk' fixed-suffix: Fixed-Point. (line 6) +* 'ULLK' fixed-suffix: Fixed-Point. (line 6) +* 'ullr' fixed-suffix: Fixed-Point. (line 6) +* 'ULLR' fixed-suffix: Fixed-Point. (line 6) +* 'ulr' fixed-suffix: Fixed-Point. (line 6) +* 'ULR' fixed-suffix: Fixed-Point. (line 6) +* undefined behavior: Bug Criteria. (line 17) +* undefined function value: Bug Criteria. (line 17) +* underscores in variables in macros: Typeof. (line 46) +* 'union': Unnamed Fields. (line 6) +* union, casting to a: Cast to Union. (line 6) +* unions: Incompatibilities. (line 146) +* unknown pragmas, warning: Warning Options. (line 683) +* unresolved references and '-nodefaultlibs': Link Options. (line 85) +* unresolved references and '-nostdlib': Link Options. (line 85) +* 'unused' attribute.: Function Attributes. + (line 1868) +* 'ur' fixed-suffix: Fixed-Point. (line 6) +* 'UR' fixed-suffix: Fixed-Point. (line 6) +* 'used' attribute.: Function Attributes. + (line 1873) +* User stack pointer in interrupts on the Blackfin: Function Attributes. + (line 844) +* 'use_debug_exception_return' attribute: Function Attributes. + (line 783) +* 'use_shadow_register_set' attribute: Function Attributes. + (line 774) +* 'V' in constraint: Simple Constraints. (line 43) +* V850 Options: V850 Options. (line 6) +* vague linkage: Vague Linkage. (line 6) +* value after 'longjmp': Global Reg Vars. (line 65) +* variable addressability on the IA-64: Function Attributes. + (line 974) +* variable addressability on the M32R/D: Variable Attributes. + (line 370) +* variable alignment: Alignment. (line 6) +* variable attributes: Variable Attributes. + (line 6) +* variable number of arguments: Variadic Macros. (line 6) +* variable-length array in a structure: Variable Length. (line 26) +* variable-length array scope: Variable Length. (line 22) +* variable-length arrays: Variable Length. (line 6) +* variables in specified registers: Explicit Reg Vars. (line 6) +* variables, local, in macros: Typeof. (line 46) +* variadic macros: Variadic Macros. (line 6) +* VAX options: VAX Options. (line 6) +* 'version_id' attribute: Function Attributes. + (line 1883) +* vfprintf: Other Builtins. (line 6) +* vfscanf: Other Builtins. (line 6) +* 'visibility' attribute: Function Attributes. + (line 1893) +* VLAs: Variable Length. (line 6) +* 'vliw' attribute: Function Attributes. + (line 1989) +* void pointers, arithmetic: Pointer Arith. (line 6) +* void, size of pointer to: Pointer Arith. (line 6) +* volatile access: Volatiles. (line 6) +* volatile access <1>: C++ Volatiles. (line 6) +* 'volatile' applied to function: Function Attributes. + (line 6) +* volatile read: Volatiles. (line 6) +* volatile read <1>: C++ Volatiles. (line 6) +* volatile write: Volatiles. (line 6) +* volatile write <1>: C++ Volatiles. (line 6) +* vprintf: Other Builtins. (line 6) +* vscanf: Other Builtins. (line 6) +* vsnprintf: Other Builtins. (line 6) +* vsprintf: Other Builtins. (line 6) +* vsscanf: Other Builtins. (line 6) +* vtable: Vague Linkage. (line 27) +* VxWorks Options: VxWorks Options. (line 6) +* 'w' floating point suffix: Floating Types. (line 6) +* 'W' floating point suffix: Floating Types. (line 6) +* 'wakeup' attribute: Function Attributes. + (line 729) +* 'warm' attribute: Function Attributes. + (line 1373) +* warning for comparison of signed and unsigned values: Warning Options. + (line 1155) +* warning for overloaded virtual function: C++ Dialect Options. + (line 655) +* warning for reordering of member initializers: C++ Dialect Options. + (line 573) +* warning for unknown pragmas: Warning Options. (line 683) +* 'warning' function attribute: Function Attributes. + (line 198) +* warning GCC_COLORS capability: Language Independent Options. + (line 70) +* warning messages: Warning Options. (line 6) +* warnings from system headers: Warning Options. (line 834) +* warnings vs errors: Warnings and Errors. + (line 6) +* 'warn_unused' attribute: C++ Attributes. (line 64) +* 'warn_unused_result' attribute: Function Attributes. + (line 1995) +* 'weak' attribute: Function Attributes. + (line 2012) +* 'weakref' attribute: Function Attributes. + (line 2021) +* whitespace: Incompatibilities. (line 112) +* 'X' in constraint: Simple Constraints. (line 122) +* X3.159-1989: Standards. (line 13) +* x86-64 Options: i386 and x86-64 Options. + (line 6) +* x86-64 options: x86-64 Options. (line 6) +* Xstormy16 Options: Xstormy16 Options. (line 6) +* Xtensa Options: Xtensa Options. (line 6) +* y0: Other Builtins. (line 6) +* y0f: Other Builtins. (line 6) +* y0l: Other Builtins. (line 6) +* y1: Other Builtins. (line 6) +* y1f: Other Builtins. (line 6) +* y1l: Other Builtins. (line 6) +* yn: Other Builtins. (line 6) +* ynf: Other Builtins. (line 6) +* ynl: Other Builtins. (line 6) +* zero-length arrays: Zero Length. (line 6) +* zero-size structures: Empty Structures. (line 6) +* zSeries options: zSeries Options. (line 6) + + + +Tag Table: +Node: Top1881 +Node: G++ and GCC3629 +Node: Standards5686 +Node: Invoking GCC17845 +Node: Option Summary21590 +Node: Overall Options63276 +Node: Invoking G++77463 +Node: C Dialect Options78986 +Node: C++ Dialect Options95984 +Node: Objective-C and Objective-C++ Dialect Options126529 +Node: Language Independent Options137036 +Node: Warning Options141536 +Node: Debugging Options211575 +Node: Optimize Options271636 +Ref: Type-punning331182 +Node: Preprocessor Options413934 +Ref: Wtrigraphs418717 +Ref: dashMF423467 +Ref: fdollars-in-identifiers434348 +Node: Assembler Options444573 +Node: Link Options445264 +Ref: Link Options-Footnote-1457404 +Node: Directory Options457740 +Node: Spec Files464284 +Node: Target Options486113 +Node: Submodel Options486512 +Node: AArch64 Options488278 +Node: Adapteva Epiphany Options493403 +Node: ARC Options499351 +Node: ARM Options511795 +Node: AVR Options529093 +Node: Blackfin Options549318 +Node: C6X Options557336 +Node: CRIS Options558879 +Node: CR16 Options562618 +Node: Darwin Options563529 +Node: DEC Alpha Options570963 +Node: FR30 Options582579 +Node: FRV Options583143 +Node: GNU/Linux Options589907 +Node: H8/300 Options591167 +Node: HPPA Options592619 +Node: i386 and x86-64 Options601921 +Node: i386 and x86-64 Windows Options643992 +Node: IA-64 Options646845 +Node: LM32 Options654911 +Node: M32C Options655434 +Node: M32R/D Options656707 +Node: M680x0 Options660252 +Node: MCore Options674287 +Node: MeP Options675789 +Node: MicroBlaze Options679749 +Node: MIPS Options682551 +Node: MMIX Options714436 +Node: MN10300 Options716913 +Node: Moxie Options719454 +Node: MSP430 Options719824 +Node: NDS32 Options721913 +Node: Nios II Options723793 +Node: PDP-11 Options732258 +Node: picoChip Options733952 +Node: PowerPC Options736090 +Node: RL78 Options736311 +Node: RS/6000 and PowerPC Options736972 +Node: RX Options775902 +Node: S/390 and zSeries Options783234 +Node: Score Options791781 +Node: SH Options792630 +Node: Solaris 2 Options811301 +Node: SPARC Options812531 +Node: SPU Options825566 +Node: System V Options830505 +Node: TILE-Gx Options831331 +Node: TILEPro Options832349 +Node: V850 Options832853 +Node: VAX Options839561 +Node: VMS Options840096 +Node: VxWorks Options840909 +Node: x86-64 Options842064 +Node: Xstormy16 Options842282 +Node: Xtensa Options842571 +Node: zSeries Options846882 +Node: Code Gen Options847078 +Node: Environment Variables877946 +Node: Precompiled Headers885949 +Node: C Implementation891952 +Node: Translation implementation893642 +Node: Environment implementation894233 +Node: Identifiers implementation894787 +Node: Characters implementation895873 +Node: Integers implementation899523 +Node: Floating point implementation901408 +Node: Arrays and pointers implementation904471 +Ref: Arrays and pointers implementation-Footnote-1905931 +Node: Hints implementation906057 +Node: Structures unions enumerations and bit-fields implementation907542 +Node: Qualifiers implementation909766 +Node: Declarators implementation911546 +Node: Statements implementation911887 +Node: Preprocessing directives implementation912213 +Node: Library functions implementation914534 +Node: Architecture implementation915183 +Node: Locale-specific behavior implementation916828 +Node: C++ Implementation917133 +Node: Conditionally-supported behavior918416 +Node: Exception handling918925 +Node: C Extensions919333 +Node: Statement Exprs924403 +Node: Local Labels928880 +Node: Labels as Values931853 +Ref: Labels as Values-Footnote-1934254 +Node: Nested Functions934439 +Node: Constructing Calls938397 +Node: Typeof943114 +Node: Conditionals947496 +Node: __int128948385 +Node: Long Long948910 +Node: Complex950386 +Node: Floating Types952974 +Node: Half-Precision954102 +Node: Decimal Float956287 +Node: Hex Floats958143 +Node: Fixed-Point959180 +Node: Named Address Spaces962440 +Ref: AVR Named Address Spaces963121 +Node: Zero Length968329 +Node: Empty Structures971616 +Node: Variable Length972022 +Node: Variadic Macros974878 +Node: Escaped Newlines977256 +Node: Subscripting978095 +Node: Pointer Arith978820 +Node: Initializers979388 +Node: Compound Literals979884 +Node: Designated Inits983245 +Node: Case Ranges986983 +Node: Cast to Union987664 +Node: Mixed Declarations988754 +Node: Function Attributes989264 +Node: Attribute Syntax1083847 +Node: Function Prototypes1094237 +Node: C++ Comments1096017 +Node: Dollar Signs1096536 +Node: Character Escapes1097001 +Node: Variable Attributes1097295 +Ref: AVR Variable Attributes1110970 +Ref: MeP Variable Attributes1113632 +Ref: i386 Variable Attributes1115568 +Node: Type Attributes1121229 +Ref: MeP Type Attributes1135117 +Ref: i386 Type Attributes1135391 +Ref: PowerPC Type Attributes1136083 +Ref: SPU Type Attributes1136945 +Node: Alignment1137236 +Node: Inline1138606 +Node: Volatiles1143582 +Node: Extended Asm1146463 +Ref: Example of asm with clobbered asm reg1152367 +Ref: Extended asm with goto1162080 +Node: Constraints1169930 +Node: Simple Constraints1171014 +Node: Multi-Alternative1178324 +Node: Modifiers1180041 +Node: Machine Constraints1183054 +Node: Asm Labels1240008 +Node: Explicit Reg Vars1241684 +Node: Global Reg Vars1243282 +Node: Local Reg Vars1247778 +Node: Alternate Keywords1250194 +Node: Incomplete Enums1251680 +Node: Function Names1252436 +Node: Return Address1254597 +Node: Vector Extensions1258104 +Node: Offsetof1265033 +Node: __sync Builtins1265838 +Node: __atomic Builtins1271307 +Node: x86 specific memory model extensions for transactional memory1282941 +Node: Object Size Checking1284203 +Node: Cilk Plus Builtins1289696 +Node: Other Builtins1290565 +Node: Target Builtins1319872 +Node: Alpha Built-in Functions1321291 +Node: Altera Nios II Built-in Functions1324304 +Node: ARC Built-in Functions1328291 +Node: ARC SIMD Built-in Functions1333503 +Node: ARM iWMMXt Built-in Functions1342399 +Node: ARM NEON Intrinsics1349382 +Node: ARM ACLE Intrinsics1566876 +Node: AVR Built-in Functions1568257 +Node: Blackfin Built-in Functions1571335 +Node: FR-V Built-in Functions1571952 +Node: Argument Types1572815 +Node: Directly-mapped Integer Functions1574569 +Node: Directly-mapped Media Functions1575653 +Node: Raw read/write Functions1583859 +Node: Other Built-in Functions1584767 +Node: X86 Built-in Functions1585953 +Node: X86 transactional memory intrinsics1645162 +Node: MIPS DSP Built-in Functions1647838 +Node: MIPS Paired-Single Support1660347 +Node: MIPS Loongson Built-in Functions1661846 +Node: Paired-Single Arithmetic1668361 +Node: Paired-Single Built-in Functions1669309 +Node: MIPS-3D Built-in Functions1671976 +Node: Other MIPS Built-in Functions1677354 +Node: MSP430 Built-in Functions1678359 +Node: NDS32 Built-in Functions1679263 +Node: picoChip Built-in Functions1680556 +Node: PowerPC Built-in Functions1681899 +Node: PowerPC AltiVec/VSX Built-in Functions1683314 +Node: PowerPC Hardware Transactional Memory Built-in Functions1815519 +Node: RX Built-in Functions1822060 +Node: S/390 System z Built-in Functions1826093 +Node: SH Built-in Functions1831322 +Node: SPARC VIS Built-in Functions1832714 +Node: SPU Built-in Functions1838317 +Node: TI C6X Built-in Functions1840134 +Node: TILE-Gx Built-in Functions1841158 +Node: TILEPro Built-in Functions1842275 +Node: Target Format Checks1843342 +Node: Solaris Format Checks1843774 +Node: Darwin Format Checks1844200 +Node: Pragmas1845018 +Node: ARM Pragmas1845754 +Node: M32C Pragmas1846357 +Node: MeP Pragmas1847429 +Node: RS/6000 and PowerPC Pragmas1849497 +Node: Darwin Pragmas1850238 +Node: Solaris Pragmas1851305 +Node: Symbol-Renaming Pragmas1852469 +Node: Structure-Packing Pragmas1854025 +Node: Weak Pragmas1855670 +Node: Diagnostic Pragmas1856404 +Node: Visibility Pragmas1859513 +Node: Push/Pop Macro Pragmas1860265 +Node: Function Specific Option Pragmas1861238 +Node: Loop-Specific Pragmas1863429 +Node: Unnamed Fields1864528 +Node: Thread-Local1866755 +Node: C99 Thread-Local Edits1868860 +Node: C++98 Thread-Local Edits1870858 +Node: Binary constants1874303 +Node: C++ Extensions1874974 +Node: C++ Volatiles1876685 +Node: Restricted Pointers1879033 +Node: Vague Linkage1880624 +Node: C++ Interface1884247 +Ref: C++ Interface-Footnote-11888535 +Node: Template Instantiation1888673 +Node: Bound member functions1895259 +Node: C++ Attributes1896791 +Node: Function Multiversioning1900370 +Node: Namespace Association1902187 +Node: Type Traits1903567 +Node: Java Exceptions1910050 +Node: Deprecated Features1911440 +Node: Backwards Compatibility1914407 +Node: Objective-C1915754 +Node: GNU Objective-C runtime API1916361 +Node: Modern GNU Objective-C runtime API1917368 +Node: Traditional GNU Objective-C runtime API1919804 +Node: Executing code before main1920531 +Node: What you can and what you cannot do in +load1923269 +Node: Type encoding1925657 +Node: Legacy type encoding1930684 +Node: @encode1931774 +Node: Method signatures1932315 +Node: Garbage Collection1934307 +Node: Constant string objects1936996 +Node: compatibility_alias1939504 +Node: Exceptions1940225 +Node: Synchronization1942935 +Node: Fast enumeration1944119 +Node: Using fast enumeration1944431 +Node: c99-like fast enumeration syntax1945642 +Node: Fast enumeration details1946345 +Node: Fast enumeration protocol1948685 +Node: Messaging with the GNU Objective-C runtime1951837 +Node: Dynamically registering methods1953209 +Node: Forwarding hook1954900 +Node: Compatibility1957940 +Node: Gcov1964496 +Node: Gcov Intro1965029 +Node: Invoking Gcov1967747 +Node: Gcov and Optimization1981987 +Node: Gcov Data Files1984989 +Node: Cross-profiling1986384 +Node: Trouble1988238 +Node: Actual Bugs1989650 +Node: Interoperation1990097 +Node: Incompatibilities1996988 +Node: Fixed Headers2005140 +Node: Standard Libraries2006798 +Node: Disappointments2008170 +Node: C++ Misunderstandings2012529 +Node: Static Definitions2013340 +Node: Name lookup2014393 +Ref: Name lookup-Footnote-12019173 +Node: Temporaries2019362 +Node: Copy Assignment2021338 +Node: Non-bugs2023145 +Node: Warnings and Errors2033651 +Node: Bugs2035413 +Node: Bug Criteria2035880 +Node: Bug Reporting2038090 +Node: Service2038311 +Node: Contributing2039130 +Node: Funding2039870 +Node: GNU Project2042360 +Node: Copying2043006 +Node: GNU Free Documentation License2080514 +Node: Contributors2105631 +Node: Option Index2143500 +Node: Keyword Index2353567 + +End Tag Table |