This is doc/gcc.info, produced by makeinfo version 4.13 from
../../gcc-linaro-4.8-2014.08/gcc/doc/gcc.texi.

Copyright (C) 1988-2013 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-2013 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 (Broadcom stbgcc-4.8-1.0) version 4.8.4.  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 find suppliers of support for 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,  Prev: Top,  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 incomplete 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 limited incomplete support for
parts of 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 will change to `-std=gnu99' or
`-std=gnu11' in some future release when the C99 or C11 support is
complete.  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; 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 -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++
          -fno-default-inline  -fvisibility-inlines-hidden
          -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]
          -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
          -Wconversion  -Wcoverage-mismatch  -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-mudflap
          -Wno-multichar  -Wnonnull  -Wno-overflow
          -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  -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-mudflap[-N]
          -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-vrp[-N]
          -ftree-vectorizer-verbose=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 -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
          -fivopts -fkeep-inline-functions -fkeep-static-consts
          -floop-block -floop-interchange -floop-strip-mine -floop-nest-optimize
          -floop-parallelize-all -flto -flto-compression-level
          -flto-partition=ALG -flto-report -fmerge-all-constants
          -fmerge-constants -fmodulo-sched -fmodulo-sched-allow-regmoves
          -fmove-loop-invariants fmudflap -fmudflapir -fmudflapth -fno-branch-count-reg
          -fno-default-inline
          -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-register-move -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
          -freciprocal-math -free -fregmove -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 -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-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
          -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_
          -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

     _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
          -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
          -mbig-switch  -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-big-switch  -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
          -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 -maes -mpclmul -mfsgsbase -mrdrnd -mf16c -mfma
          -msse4a -m3dnow -mpopcnt -mabm -mbmi -mtbm -mfma4 -mxop -mlzcnt
          -mbmi2 -mrtm -mlwp -mthreads
          -mno-align-stringops  -minline-all-stringops
          -minline-stringops-dynamically -mstringop-strategy=ALG
          -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double
          -m96bit-long-double -mlong-double-64 -mlong-double-80
          -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 -mlarge-data-threshold=NUM
          -msse2avx -mfentry -m8bit-idiv
          -mavx256-split-unaligned-load -mavx256-split-unaligned-store

     _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-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
          -mdsp  -mno-dsp  -mdspr2  -mno-dspr2
          -mmcu -mmno-mcu
          -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  -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-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

     _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 -mcbranchdi -mcmpeqdi
          -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
          -muser-mode  -mno-user-mode
          -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 -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


* Menu:

* Overall Options::     Controlling the kind of output:
                        an executable, object files, assembler files,
                        or preprocessed source.
* 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.


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 Generating Ada Bindings for C and C++ headers:
     (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.  Note that this standard is not yet fully supported;
          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.  Support is
          incomplete and experimental.  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.  When ISO C99 is fully implemented in
          GCC, this will become the default.  The name `gnu9x' is
          deprecated.

    `gnu11'
    `gnu1x'
          GNU dialect of ISO C11.  Support is incomplete and
          experimental.  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.  Support for C++11
          is still experimental, and may change in incompatible ways in
          future releases.  The name `c++0x' is deprecated.

    `gnu++11'
    `gnu++0x'
          GNU dialect of `-std=c++11'. Support for C++11 is still
          experimental, and may change in incompatible ways in future
          releases.  The name `gnu++0x' is deprecated.

    `c++1y'
          The next revision of the ISO C++ standard, tentatively
          planned for 2017.  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 Common Predefined Macros:
     (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 v3.0 `http://www.openmp.org/'.  This option
     implies `-pthread', and thus is only supported on targets that
     have support for `-pthread'.

`-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.

`-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.

`-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:

`-fno-default-inline'
     Do not assume `inline' for functions defined inside a class scope.
     *Note Options That Control Optimization: Optimize Options.  Note
     that these functions have linkage like inline functions; they just
     aren't inlined by default.

`-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, in which case it is possible but unsafe to
     delete an instance of a derived class through a pointer to the
     base class.  This warning is also 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++, Second Edition' book:

        * Item 11:  Define a copy constructor and an assignment
          operator for classes with dynamically-allocated memory.

        * Item 12:  Prefer initialization to assignment in constructors.

        * Item 14:  Make destructors virtual in base classes.

        * Item 15:  Have `operator=' return a reference to `*this'.

        * Item 23:  Don't try to return a reference when you must
          return an object.


     Also warn about violations of the following style guidelines from
     Scott Meyers' `More Effective C++' book:

        * Item 6:  Distinguish between prefix and postfix forms of
          increment and decrement operators.

        * Item 7:  Never overload `&&', `||', or `,'.


     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.

`-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
          -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'.

`-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.

`-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'.

`-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.

`-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.

`-Wno-mudflap'
     Suppress warnings about constructs that cannot be instrumented by
     `-fmudflap'.

`-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.

`-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, but no
     information about local variables and no line numbers.

     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.

`-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/data-race-test/wiki/ThreadSanitizer' for
     more details.

`-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-regmove'
          Dump after the register move pass.

    `-fdump-rtl-sched1'
    `-fdump-rtl-sched2'
          `-fdump-rtl-sched1' and `-fdump-rtl-sched2' enable dumping
          after the basic block scheduling passes.

    `-fdump-rtl-see'
          Dump after sign 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.

    `mudflap'
          Dump each function after adding mudflap instrumentation.  The
          file name is made by appending `.mudflap' 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 `all' 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.

     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 cotaints dumps
     from the vectorizer about missed opportunities.

`-ftree-vectorizer-verbose=N'
     This option is deprecated and is implemented in terms of
     `-fopt-info'. Please use `-fopt-info-KIND' form instead, where
     KIND is one of the valid opt-info options. It prints additional
     optimization information.  For N=0 no diagnostic information is
     reported.  If N=1 the vectorizer reports each loop that got
     vectorized, and the total number of loops that got vectorized.  If
     N=2 the vectorizer reports locations which could not be vectorized
     and the reasons for those. For any higher verbosity levels all the
     analysis and transformation information from the vectorizer is
     reported.

     Note that the information output by `-ftree-vectorizer-verbose'
     option is sent to `stderr'. If the equivalent form
     `-fopt-info-OPTIONS=FILENAME' is used then the output is sent into
     FILENAME instead.

`-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
          -fexpensive-optimizations
          -fgcse  -fgcse-lm
          -fhoist-adjacent-loads
          -finline-small-functions
          -findirect-inlining
          -fipa-sra
          -foptimize-sibling-calls
          -fpartial-inlining
          -fpeephole2
          -fregmove
          -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-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-default-inline'
     Do not make member functions inline by default merely because they
     are defined inside the class scope (C++ only).  Otherwise, when
     you specify `-O', member functions defined inside class scope are
     compiled inline by default; i.e., you don't need to add `inline'
     in front of the member function name.

`-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'.

`-fmudflap -fmudflapth -fmudflapir'
     For front-ends that support it (C and C++), instrument all risky
     pointer/array dereferencing operations, some standard library
     string/heap functions, and some other associated constructs with
     range/validity tests.  Modules so instrumented should be immune to
     buffer overflows, invalid heap use, and some other classes of C/C++
     programming errors.  The instrumentation relies on a separate
     runtime library (`libmudflap'), which is linked into a program if
     `-fmudflap' is given at link time.  Run-time behavior of the
     instrumented program is controlled by the `MUDFLAP_OPTIONS'
     environment variable.  See `env MUDFLAP_OPTIONS=-help a.out' for
     its options.

     Use `-fmudflapth' instead of `-fmudflap' to compile and to link if
     your program is multi-threaded.  Use `-fmudflapir', in addition to
     `-fmudflap' or `-fmudflapth', if instrumentation should ignore
     pointer reads.  This produces less instrumentation (and therefore
     faster execution) and still provides some protection against
     outright memory corrupting writes, but allows erroneously read
     data to propagate within a program.

`-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'.

`-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'.

`-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 x86 at levels `-O2', `-O3'.

`-foptimize-register-move'
`-fregmove'
     Attempt to reassign register numbers in move instructions and as
     operands of other simple instructions in order to maximize the
     amount of register tying.  This is especially helpful on machines
     with two-operand instructions.

     Note `-fregmove' and `-foptimize-register-move' are the same
     optimization.

     Enabled at levels `-O2', `-O3', `-Os'.

`-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'.

`-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 loop vectorization on trees. This flag is enabled by
     default at `-O3'.

`-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'.

`-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.

`-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.

     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' needs to 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 the `-flto' flag needs to be passed to
     both the compile and the link commands.

     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.

     Note that 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.  This means
     that object files with LTO information can be linked as normal
     object files; if `-flto' is not passed to the linker, no
     interprocedural optimizations are applied.

     Additionally, the optimization flags used to compile individual
     files are not necessarily related to those used at link time.  For
     instance,

          gcc -c -O0 -flto foo.c
          gcc -c -O0 -flto bar.c
          gcc -o myprog -flto -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 without `-flto', then
     `myprog' is not optimized.

     When producing the final binary with `-flto', 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.  Currently, the following options are saved into the GIMPLE
     bytecode files: `-fPIC', `-fcommon' and all the `-m' target flags.

     At link time, these options are read in and reapplied.  Note that
     the current implementation makes no attempt to recognize
     conflicting values for these options.  If different files have
     conflicting option values (e.g., one file is compiled with `-fPIC'
     and another isn't), the compiler simply uses the last value read
     from the bytecode files.  It is recommended, then, that you
     compile all the files participating in the same link with the same
     options.

     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.

     Another feature of LTO is that it is possible to apply
     interprocedural optimizations on files written in different
     languages.  This requires support in the language front end.
     Currently, the C, C++ and Fortran front ends are capable of
     emitting GIMPLE bytecodes, so something like this should work:

          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; all you need to add
     is `-flto' to all the compile and link commands.

     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
     enable this feature, use the flag `-fuse-linker-plugin' at link
     time:

          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.

     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/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 wrong 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.

     This option is disabled by default.

`-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.

`-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 `-ffat-lto-objects' but this default is intended to
     change in future releases when linker plugin enabled environments
     become more common.

`-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'.

`-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.

`-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.

    `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.

    `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.



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
          Debugging Options: (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-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
     includes 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 `*'.

`%{.`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::
* 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::
* 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:

`-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 value for ARCH is
     `armv8-a'.  The possible 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.  This option can be used in
     conjunction with or instead of the `-mcpu=' option.

`-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 possible values for CPU are
     `generic', `large'.  The possible 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.

`-mtune=NAME'
     Specify the name of the processor to tune the performance for.
     The code will be tuned as if the target processor were of the type
     specified in this option, but still using instructions compatible
     with the target processor specified by a `-mcpu=' option.  This
     option cannot be suffixed by feature modifiers.


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: ARM 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: ARM Options,  Next: AVR Options,  Prev: Adapteva Epiphany Options,  Up: Submodel Options

3.17.3 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', `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-a15', `cortex-a53', `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'.

     `-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'.

`-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.

`-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.4 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',
          `atxmega16x1', `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.4.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.4.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.4.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_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.5 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.6 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.7 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.8 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.9 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.10 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.11 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.12 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.13 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.14 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.15 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.

`-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.

`-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.16 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.

    `corei7'
          Intel Core i7 CPU with 64-bit extensions, MMX, SSE, SSE2,
          SSE3, SSSE3, SSE4.1 and SSE4.2 instruction set support.

    `corei7-avx'
          Intel Core i7 CPU with 64-bit extensions, MMX, SSE, SSE2,
          SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AES and PCLMUL instruction
          set support.

    `core-avx-i'
          Intel Core CPU with 64-bit extensions, MMX, SSE, SSE2, SSE3,
          SSSE3, SSE4.1, SSE4.2, AVX, AES, PCLMUL, FSGSBASE, RDRND and
          F16C instruction set support.

    `core-avx2'
          Intel Core CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2,
          SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2, AES, PCLMUL,
          FSGSBASE, RDRND, FMA, BMI, BMI2 and F16C instruction set
          support.

    `atom'
          Intel Atom CPU with 64-bit extensions, MOVBE, MMX, SSE, SSE2,
          SSE3 and SSSE3 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, 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, AVX, XOP, LWP,
          AES, PCL_MUL, CX16, 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 an extra choice 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.

`-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'
     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 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'
`-maes'
`-mno-aes'
`-mpclmul'
`-mno-pclmul'
`-mfsgsbase'
`-mno-fsgsbase'
`-mrdrnd'
`-mno-rdrnd'
`-mf16c'
`-mno-f16c'
`-mfma'
`-mno-fma'
`-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'
`-mrtm'
`-mtbm'
`-mno-tbm'
     These switches enable or disable the use of instructions in the
     MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, AVX, AVX2, AES, PCLMUL,
     FSGSBASE, RDRND, F16C, FMA, SSE4A, FMA4, XOP, LWP, ABM, BMI, BMI2,
     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.

`-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.

`-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.


 These `-m' switches are supported in addition to the above on x86-64
processors in 64-bit environments.

`-m32'
`-m64'
`-mx32'
     Generate code for a 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.

`-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.17 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.18 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.19 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.20 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.21 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.22 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.23 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.24 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 runtime 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.25 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.26 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',
     `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-mips16'
`-mno-interlink-mips16'
     Require (do not require) that non-MIPS16 code be link-compatible
     with MIPS16 code.

     For example, non-MIPS16 code cannot jump directly to MIPS16 code;
     it must either use a call or an indirect jump.
     `-minterlink-mips16' therefore disables direct jumps unless GCC
     knows that the target of the jump is not MIPS16.

`-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.

`-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'.

`-mmt'
`-mno-mt'
     Use (do not use) MT Multithreading instructions.

`-mmcu'
`-mno-mcu'
     Use (do not use) the MIPS MCU ASE 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.

`-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-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.27 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.28 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: PDP-11 Options,  Prev: MN10300 Options,  Up: Submodel Options

3.17.29 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: PDP-11 Options,  Next: picoChip Options,  Prev: Moxie Options,  Up: Submodel Options

3.17.30 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.31 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.32 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.33 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.34 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.

     In this version of the compiler, the `-mcompat-align-parm' is the
     default, except when using the Linux ELFv2 ABI.


File: gcc.info,  Node: RX Options,  Next: S/390 and zSeries Options,  Prev: RS/6000 and PowerPC Options,  Up: Submodel Options

3.17.35 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.36 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.37 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.38 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'.

`-mcbranchdi'
     Enable the `cbranchdi4' instruction pattern.

`-mcmpeqdi'
     Emit the `cmpeqdi_t' instruction pattern even when `-mcbranchdi'
     is in effect.

`-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.39 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.40 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.

`-muser-mode'
`-mno-user-mode'
     Do not generate code that can only run in supervisor mode.  This
     is relevant only for the `casa' instruction emitted for the LEON3
     processor.  The default is `-mno-user-mode'.

`-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.41 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.42 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.43 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.


File: gcc.info,  Node: TILEPro Options,  Next: V850 Options,  Prev: TILE-Gx Options,  Up: Submodel Options

3.17.44 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.45 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.46 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.47 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.48 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.49 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.50 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.51 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.52 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'.

     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.

     If the target requires strict alignment, and honoring the field
     type would require violating this alignment, a warning is issued.
     If the field has `packed' attribute, the access is done without
     honoring the field type.  If the field doesn't have `packed'
     attribute, the access is done honoring the field type.  In both
     cases, GCC assumes that the user knows something about the target
     hardware that it is unaware of.

     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 and ISO/IEC 9899:1999 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 3.10, C90 and C99
     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 and C99 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 and C99
     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 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 and C99 5.2.4.1, C99 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 requires 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 3.6).'

     Determined by ABI.

   * `The values of the members of the execution character set (C90 and
     C99 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
     and C99 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 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 6.2.5, C99 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 6.4.4.4, C90 and C99 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 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 containing a multibyte character or escape
     sequence not represented in the extended execution character set
     (C90 6.1.3.4, C99 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 6.4.4.4).'

     *Note Implementation-defined behavior: (cpp)Implementation-defined
     behavior.

   * `The current locale used to convert a wide string literal into
     corresponding wide character codes (C90 6.1.4, C99 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 6.4.5).'

     *Note Implementation-defined behavior: (cpp)Implementation-defined
     behavior.


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
     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 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 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 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 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 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 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 and C99 5.2.4.2.2).'

     The accuracy is unknown.

   * `The rounding behaviors characterized by non-standard values of
     `FLT_ROUNDS'  (C90 and C99 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 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 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
     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 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 6.5).'

     Expressions are currently only contracted if
     `-funsafe-math-optimizations' or `-ffast-math' are used.  This is
     subject to change.

   * `The default state for the `FENV_ACCESS' pragma (C99 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 7.6,
     C99 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 7.12.2).'

     This pragma is not implemented.  Expressions are currently only
     contracted if `-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 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 6.5.6/8.

   * `The size of the result of subtracting two pointers to elements of
     the same array (C90 6.3.6, C99 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 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 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 6.7.2, C99 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 6.7.2.1).'

     No other types are permitted in strictly conforming mode.

   * `Whether a bit-field can straddle a storage-unit boundary (C90
     6.5.2.1, C99 6.7.2.1).'

     Determined by ABI.

   * `The order of allocation of bit-fields within a unit (C90 6.5.2.1,
     C99 6.7.2.1).'

     Determined by ABI.

   * `The alignment of non-bit-field members of structures (C90
     6.5.2.1, C99 6.7.2.1).'

     Determined by ABI.

   * `The integer type compatible with each enumerated type (C90
     6.5.2.2, C99 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 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.

   * `How sequences in both forms of header names are mapped to headers
     or external source file names (C90 6.1.7, C99 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
     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 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 6.10.2).'

   * `How the named source file is searched for in an included `""'
     delimited header (C90 6.8.2, C99 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 6.10.2).'

   * `The nesting limit for `#include' processing (C90 6.8.2, C99
     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 6.10.3.2).'

   * `The behavior on each recognized non-`STDC #pragma' directive (C90
     6.8.6, C99 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).'



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).'

     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 and C99
     5.2.4.2, C99 7.18.2, C99 7.18.3).'

     Determined by ABI.

   * `The number, order, and encoding of bytes in any object (when not
     explicitly specified in this International Standard) (C99
     6.2.6.1).'

     Determined by ABI.

   * `The value of the result of the `sizeof' operator (C90 6.3.3.4,
     C99 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.
* 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' (*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.  This alternative with label
differences is not supported for the AVR target, please use the first
approach for AVR programs.

 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'.

 _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.

 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 };

 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', `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',
`gnu_inline', `externally_visible', `hot', `cold', `artificial',
`no_sanitize_address', `no_address_safety_analysis', `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.

`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_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 ARM, AVR, CR16, Epiphany, M32C, M32R/D,
     m68k, MeP, MIPS, 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 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.

     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 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/short_call'
     This attribute specifies how a particular function is called on
     ARM and Epiphany.  Both attributes override the `-mlong-calls'
     (*note ARM Options::) command-line switch and `#pragma long_calls'
     settings.  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.

`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::).

`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, 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.

`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));

`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'.

`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.)

`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")));

     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.

     On the 386/x86_64 and PowerPC back ends, you can use either
     multiple strings to specify multiple options, or you can separate
     the option with a comma (`,').

     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'.

     The `target' attribute is not implemented in GCC versions earlier
     than 4.4 for the i386/x86_64 and 4.6 for the PowerPC back ends.
     It is not currently implemented for other back ends.

`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 version level functioning 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.
     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, 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" (r) : "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


_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.

    `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.

_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.


_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}  */

 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: Other 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: Other Builtins,  Next: Target Builtins,  Prev: Object Size Checking,  Up: C Extensions

6.55 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.

 -- Built-in Function: int __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: int __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.

 -- 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 negative 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 (unsigned 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 (unsigned long)
     Similar to `__builtin_ffs', except the argument type is `unsigned
     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 (unsigned long long)
     Similar to `__builtin_ffs', except the argument type is `unsigned
     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.56 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::
* 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::
* 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: ARM iWMMXt Built-in Functions,  Up: Target Builtins

6.56.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: ARM iWMMXt Built-in Functions,  Next: ARM NEON Intrinsics,  Prev: Alpha Built-in Functions,  Up: Target Builtins

6.56.2 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.56.3 ARM NEON Intrinsics
--------------------------

These built-in intrinsics for the ARM Advanced SIMD extension are
available when the `-mfpu=neon' switch is used:

6.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.3.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.56.4 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.56.4.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.56.5 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.56.6 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.56.7 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.56.7.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.56.7.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.56.7.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, B)'  `MADDHSS A,B,C'
`uw1 __MADDHUS (uw1, uw1)'       `C = __MADDHUS (A, B)'  `MADDHUS A,B,C'
`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, sw1)'  `__MCPXIS (C, A, B)'    `MCPXIS A,B,C'
`void __MCPXIU (acc, uw1, uw1)'  `__MCPXIU (C, A, B)'    `MCPXIU A,B,C'
`void __MCPXRS (acc, sw1, sw1)'  `__MCPXRS (C, A, B)'    `MCPXRS A,B,C'
`void __MCPXRU (acc, uw1, uw1)'  `__MCPXRU (C, A, B)'    `MCPXRU A,B,C'
`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, B)' `MDCUTSSI A,#B,C'
`uw2 __MDPACKH (uw2, uw2)'       `C = __MDPACKH (A, B)'  `MDPACKH A,B,C'
`uw2 __MDROTLI (uw2, const)'     `C = __MDROTLI (A, B)'  `MDROTLI A,#B,C'
`void __MDSUBACCS (acc, acc)'    `__MDSUBACCS (B, A)'    `MDSUBACCS A,B'
`void __MDUNPACKH (uw1 *, uw2)'  `__MDUNPACKH (&B, A)'   `MDUNPACKH A,B'
`uw2 __MEXPDHD (uw1, const)'     `C = __MEXPDHD (A, B)'  `MEXPDHD A,#B,C'
`uw1 __MEXPDHW (uw1, const)'     `C = __MEXPDHW (A, B)'  `MEXPDHW A,#B,C'
`uw1 __MHDSETH (uw1, const)'     `C = __MHDSETH (A, B)'  `MHDSETH A,#B,C'
`sw1 __MHDSETS (const)'          `B = __MHDSETS (A)'     `MHDSETS #A,B'
`uw1 __MHSETHIH (uw1, const)'    `B = __MHSETHIH (B, A)' `MHSETHIH #A,B'
`sw1 __MHSETHIS (sw1, const)'    `B = __MHSETHIS (B, A)' `MHSETHIS #A,B'
`uw1 __MHSETLOH (uw1, const)'    `B = __MHSETLOH (B, A)' `MHSETLOH #A,B'
`sw1 __MHSETLOS (sw1, const)'    `B = __MHSETLOS (B, A)' `MHSETLOS #A,B'
`uw1 __MHTOB (uw2)'              `B = __MHTOB (A)'       `MHTOB A,B'
`void __MMACHS (acc, sw1, sw1)'  `__MMACHS (C, A, B)'    `MMACHS A,B,C'
`void __MMACHU (acc, uw1, uw1)'  `__MMACHU (C, A, B)'    `MMACHU A,B,C'
`void __MMRDHS (acc, sw1, sw1)'  `__MMRDHS (C, A, B)'    `MMRDHS A,B,C'
`void __MMRDHU (acc, uw1, uw1)'  `__MMRDHU (C, A, B)'    `MMRDHU A,B,C'
`void __MMULHS (acc, sw1, sw1)'  `__MMULHS (C, A, B)'    `MMULHS A,B,C'
`void __MMULHU (acc, uw1, uw1)'  `__MMULHU (C, A, B)'    `MMULHU A,B,C'
`void __MMULXHS (acc, sw1, sw1)' `__MMULXHS (C, A, B)'   `MMULXHS A,B,C'
`void __MMULXHU (acc, uw1, uw1)' `__MMULXHU (C, A, B)'   `MMULXHU A,B,C'
`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, B)' `MQADDHSS A,B,C'
`uw2 __MQADDHUS (uw2, uw2)'      `C = __MQADDHUS (A, B)' `MQADDHUS A,B,C'
`void __MQCPXIS (acc, sw2, sw2)' `__MQCPXIS (C, A, B)'   `MQCPXIS A,B,C'
`void __MQCPXIU (acc, uw2, uw2)' `__MQCPXIU (C, A, B)'   `MQCPXIU A,B,C'
`void __MQCPXRS (acc, sw2, sw2)' `__MQCPXRS (C, A, B)'   `MQCPXRS A,B,C'
`void __MQCPXRU (acc, uw2, uw2)' `__MQCPXRU (C, A, B)'   `MQCPXRU A,B,C'
`sw2 __MQLCLRHS (sw2, sw2)'      `C = __MQLCLRHS (A, B)' `MQLCLRHS A,B,C'
`sw2 __MQLMTHS (sw2, sw2)'       `C = __MQLMTHS (A, B)'  `MQLMTHS A,B,C'
`void __MQMACHS (acc, sw2, sw2)' `__MQMACHS (C, A, B)'   `MQMACHS A,B,C'
`void __MQMACHU (acc, uw2, uw2)' `__MQMACHU (C, A, B)'   `MQMACHU A,B,C'
`void __MQMACXHS (acc, sw2,      `__MQMACXHS (C, A, B)'  `MQMACXHS A,B,C'
sw2)'                                                    
`void __MQMULHS (acc, sw2, sw2)' `__MQMULHS (C, A, B)'   `MQMULHS A,B,C'
`void __MQMULHU (acc, uw2, uw2)' `__MQMULHU (C, A, B)'   `MQMULHU A,B,C'
`void __MQMULXHS (acc, sw2,      `__MQMULXHS (C, A, B)'  `MQMULXHS A,B,C'
sw2)'                                                    
`void __MQMULXHU (acc, uw2,      `__MQMULXHU (C, A, B)'  `MQMULXHU A,B,C'
uw2)'                                                    
`sw2 __MQSATHS (sw2, sw2)'       `C = __MQSATHS (A, B)'  `MQSATHS A,B,C'
`uw2 __MQSLLHI (uw2, int)'       `C = __MQSLLHI (A, B)'  `MQSLLHI A,B,C'
`sw2 __MQSRAHI (sw2, int)'       `C = __MQSRAHI (A, B)'  `MQSRAHI A,B,C'
`sw2 __MQSUBHSS (sw2, sw2)'      `C = __MQSUBHSS (A, B)' `MQSUBHSS A,B,C'
`uw2 __MQSUBHUS (uw2, uw2)'      `C = __MQSUBHUS (A, B)' `MQSUBHUS A,B,C'
`void __MQXMACHS (acc, sw2,      `__MQXMACHS (C, A, B)'  `MQXMACHS A,B,C'
sw2)'                                                    
`void __MQXMACXHS (acc, sw2,     `__MQXMACXHS (C, A, B)' `MQXMACXHS A,B,C'
sw2)'                                                    
`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, B)'  `MSUBHSS A,B,C'
`uw1 __MSUBHUS (uw1, uw1)'       `C = __MSUBHUS (A, B)'  `MSUBHUS A,B,C'
`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.56.7.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.56.7.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.56.8 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.

    `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_pextrw (v4hi, int)
     v4hi __builtin_ia32_pinsrw (v4hi, int, int)
     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)
     v4si __builtin_ia32_cmpeqps (v4sf, v4sf)
     v4si __builtin_ia32_cmpltps (v4sf, v4sf)
     v4si __builtin_ia32_cmpleps (v4sf, v4sf)
     v4si __builtin_ia32_cmpgtps (v4sf, v4sf)
     v4si __builtin_ia32_cmpgeps (v4sf, v4sf)
     v4si __builtin_ia32_cmpunordps (v4sf, v4sf)
     v4si __builtin_ia32_cmpneqps (v4sf, v4sf)
     v4si __builtin_ia32_cmpnltps (v4sf, v4sf)
     v4si __builtin_ia32_cmpnleps (v4sf, v4sf)
     v4si __builtin_ia32_cmpngtps (v4sf, v4sf)
     v4si __builtin_ia32_cmpngeps (v4sf, v4sf)
     v4si __builtin_ia32_cmpordps (v4sf, v4sf)
     v4si __builtin_ia32_cmpeqss (v4sf, v4sf)
     v4si __builtin_ia32_cmpltss (v4sf, v4sf)
     v4si __builtin_ia32_cmpless (v4sf, v4sf)
     v4si __builtin_ia32_cmpunordss (v4sf, v4sf)
     v4si __builtin_ia32_cmpneqss (v4sf, v4sf)
     v4si __builtin_ia32_cmpnlts (v4sf, v4sf)
     v4si __builtin_ia32_cmpnless (v4sf, v4sf)
     v4si __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_loadaps (float *)'
     Generates the `movaps' machine instruction as a load from memory.

`void __builtin_ia32_storeaps (float *, v4sf)'
     Generates the `movaps' machine instruction as a store to memory.

`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_loadsss (float *)'
     Generates the `movss' machine instruction as a load from memory.

`void __builtin_ia32_storess (float *, v4sf)'
     Generates the `movss' machine instruction as a store to 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)
     v2df __builtin_ia32_movddup (v2df)
     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 `-msse3' is used.

`v2df __builtin_ia32_loadddup (double const *)'
     Generates the `movddup' machine instruction as a load from memory.

 The following built-in functions are available when `-mssse3' is used.
All of them generate the machine instruction that is part of the name
with MMX registers.

     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
with SSE registers.

     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,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)
     v4sf __builtin_ia32_vfrczss (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
with MMX registers.

     v2df __builtin_ia32_fmaddpd (v2df, v2df, v2df)
     v4sf __builtin_ia32_fmaddps (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fmaddsd (v2df, v2df, v2df)
     v4sf __builtin_ia32_fmaddss (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fmsubpd (v2df, v2df, v2df)
     v4sf __builtin_ia32_fmsubps (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fmsubsd (v2df, v2df, v2df)
     v4sf __builtin_ia32_fmsubss (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fnmaddpd (v2df, v2df, v2df)
     v4sf __builtin_ia32_fnmaddps (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fnmaddsd (v2df, v2df, v2df)
     v4sf __builtin_ia32_fnmaddss (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fnmsubpd (v2df, v2df, v2df)
     v4sf __builtin_ia32_fnmsubps (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fnmsubsd (v2df, v2df, v2df)
     v4sf __builtin_ia32_fnmsubss (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fmaddsubpd  (v2df, v2df, v2df)
     v4sf __builtin_ia32_fmaddsubps  (v4sf, v4sf, v4sf)
     v2df __builtin_ia32_fmsubaddpd  (v2df, v2df, v2df)
     v4sf __builtin_ia32_fmsubaddps  (v4sf, v4sf, v4sf)
     v4df __builtin_ia32_fmaddpd256 (v4df, v4df, v4df)
     v8sf __builtin_ia32_fmaddps256 (v8sf, v8sf, v8sf)
     v4df __builtin_ia32_fmsubpd256 (v4df, v4df, v4df)
     v8sf __builtin_ia32_fmsubps256 (v8sf, v8sf, v8sf)
     v4df __builtin_ia32_fnmaddpd256 (v4df, v4df, v4df)
     v8sf __builtin_ia32_fnmaddps256 (v8sf, v8sf, v8sf)
     v4df __builtin_ia32_fnmsubpd256 (v4df, v4df, v4df)
     v8sf __builtin_ia32_fnmsubps256 (v8sf, v8sf, v8sf)
     v4df __builtin_ia32_fmaddsubpd256 (v4df, v4df, v4df)
     v8sf __builtin_ia32_fmaddsubps256 (v8sf, v8sf, v8sf)
     v4df __builtin_ia32_fmsubaddpd256 (v4df, v4df, v4df)
     v8sf __builtin_ia32_fmsubaddps256 (v8sf, v8sf, v8sf)

 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 `-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_pfrsqrtit1 (v2sf, 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.56.9 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 suceeds
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.56.10 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.56.11 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.56.12 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.56.12.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.56.12.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.56.12.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: picoChip Built-in Functions,  Prev: MIPS Loongson Built-in Functions,  Up: Target Builtins

6.56.13 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.


File: gcc.info,  Node: picoChip Built-in Functions,  Next: PowerPC Built-in Functions,  Prev: Other MIPS Built-in Functions,  Up: Target Builtins

6.56.14 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.56.15 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);
     uint64_t __builtin_ppc_get_timebase ();
     unsigned long __builtin_ppc_mftb ();
     double __builtin_unpack_longdouble (long double, int);
     long double __builtin_pack_longdouble (double, double);

 The `vec_rsqrt', `__builtin_rsqrt', and `__builtin_rsqrtf' functions
generate multiple instructions to implement the reciprocal sqrt
functionality using reciprocal sqrt estimate instructions.

 The `__builtin_recipdiv', and `__builtin_recipdivf' functions generate
multiple instructions to implement division using the reciprocal
estimate instructions.

 The `__builtin_ppc_get_timebase' and `__builtin_ppc_mftb' functions
generate instructions to read the Time Base Register.  The
`__builtin_ppc_get_timebase' function may generate multiple
instructions and always returns the 64 bits of the Time Base Register.
The `__builtin_ppc_mftb' function always generates one instruction and
returns the Time Base Register value as an unsigned long, throwing away
the most significant word on 32-bit environments.

 The following built-in functions are available for the PowerPC family
of processors, starting with ISA 2.06 or later (`-mcpu=power7' or
`-mpopcntd'):
     long __builtin_bpermd (long, long);
     int __builtin_divwe (int, int);
     int __builtin_divweo (int, int);
     unsigned int __builtin_divweu (unsigned int, unsigned int);
     unsigned int __builtin_divweuo (unsigned int, unsigned int);
     long __builtin_divde (long, long);
     long __builtin_divdeo (long, long);
     unsigned long __builtin_divdeu (unsigned long, unsigned long);
     unsigned long __builtin_divdeuo (unsigned long, unsigned long);
     unsigned int cdtbcd (unsigned int);
     unsigned int cbcdtd (unsigned int);
     unsigned int addg6s (unsigned int, unsigned int);

 The `__builtin_divde', `__builtin_divdeo', `__builitin_divdeu',
`__builtin_divdeou' functions require a 64-bit environment support ISA
2.06 or later.

 The following built-in functions are available for the PowerPC family
of processors when hardware decimal floating point (`-mhard-dfp') is
available:
     _Decimal64 __builtin_dxex (_Decimal64);
     _Decimal128 __builtin_dxexq (_Decimal128);
     _Decimal64 __builtin_ddedpd (int, _Decimal64);
     _Decimal128 __builtin_ddedpdq (int, _Decimal128);
     _Decimal64 __builtin_denbcd (int, _Decimal64);
     _Decimal128 __builtin_denbcdq (int, _Decimal128);
     _Decimal64 __builtin_diex (_Decimal64, _Decimal64);
     _Decimal128 _builtin_diexq (_Decimal128, _Decimal128);
     _Decimal64 __builtin_dscli (_Decimal64, int);
     _Decimal128 __builitn_dscliq (_Decimal128, int);
     _Decimal64 __builtin_dscri (_Decimal64, int);
     _Decimal128 __builitn_dscriq (_Decimal128, int);
     unsigned long long __builtin_unpack_dec128 (_Decimal128, int);
     _Decimal128 __builtin_pack_dec128 (unsigned long long, unsigned long long);

 The following built-in functions are available for the PowerPC family
of processors when the Vector Scalar (vsx) instruction set is available:
     unsigned long long __builtin_unpack_vector_int128 (vector __int128_t, int);
     vector __int128_t __builtin_pack_vector_int128 (unsigned long long,
                                                     unsigned long long);


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.56.16 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);

     vector __int128_t __builtin_bcdadd (vector __int128_t, vector__int128_t);
     int __builtin_bcdadd_lt (vector __int128_t, vector__int128_t);
     int __builtin_bcdadd_eq (vector __int128_t, vector__int128_t);
     int __builtin_bcdadd_gt (vector __int128_t, vector__int128_t);
     int __builtin_bcdadd_ov (vector __int128_t, vector__int128_t);
     vector __int128_t bcdsub (vector __int128_t, vector__int128_t);
     int __builtin_bcdsub_lt (vector __int128_t, vector__int128_t);
     int __builtin_bcdsub_eq (vector __int128_t, vector__int128_t);
     int __builtin_bcdsub_gt (vector __int128_t, vector__int128_t);
     int __builtin_bcdsub_ov (vector __int128_t, vector__int128_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.56.17 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.56.17.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.56.17.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.56.18 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.56.19 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.56.20 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.56.21 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.56.22 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.56.23 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.56.24 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.56.25 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.57 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.57.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.57.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.58 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::


File: gcc.info,  Node: ARM Pragmas,  Next: M32C Pragmas,  Up: Pragmas

6.58.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.58.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.58.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.58.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.58.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.58.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.58.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.58.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.58.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.58.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.58.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.58.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,  Prev: Push/Pop Macro Pragmas,  Up: Pragmas

6.58.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' attribute is not implemented in GCC
     versions earlier than 4.4 for the i386/x86_64 and 4.6 for the
     PowerPC back ends.  At present, it is not implemented for other
     back ends.

`#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: Unnamed Fields,  Next: Thread-Local,  Prev: Pragmas,  Up: C Extensions

6.59 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.60 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.60.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.60.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.61 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 `-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.


 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.


 `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.
* Known: Trouble.            Known problems.
* Help: Service.             Where to ask for help.


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
`file:///opt/toolchains/stbgcc-4.8-1.0/info/README.Bugs'.


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, 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, 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.

   * 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 Guenther 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.

   * 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.

   * 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.

   * 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.

   * 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.

 [index ]
* Menu:

* ###:                                   Overall Options.    (line  209)
* -fno-keep-inline-dllexport:            Optimize Options.   (line  319)
* -mcpu:                                 RX Options.         (line   30)
* -mpointer-size=SIZE:                   VMS Options.        (line   20)
* 8bit-idiv:                             i386 and x86-64 Options.
                                                             (line  824)
* A:                                     Preprocessor Options.
                                                             (line  597)
* all_load:                              Darwin Options.     (line  110)
* allowable_client:                      Darwin Options.     (line  196)
* ansi <1>:                              Non-bugs.           (line  107)
* ansi <2>:                              Other Builtins.     (line   22)
* ansi <3>:                              Preprocessor Options.
                                                             (line  338)
* ansi <4>:                              C Dialect Options.  (line   11)
* ansi:                                  Standards.          (line   16)
* arch_errors_fatal:                     Darwin Options.     (line  114)
* aux-info:                              C Dialect Options.  (line  168)
* avx256-split-unaligned-load:           i386 and x86-64 Options.
                                                             (line  832)
* avx256-split-unaligned-store:          i386 and x86-64 Options.
                                                             (line  832)
* B:                                     Directory Options.  (line   46)
* 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:                                     Link Options.       (line   20)
* C:                                     Preprocessor Options.
                                                             (line  655)
* c:                                     Overall Options.    (line  164)
* client_name:                           Darwin Options.     (line  196)
* compatibility_version:                 Darwin Options.     (line  196)
* coverage:                              Debugging Options.  (line  412)
* current_version:                       Darwin Options.     (line  196)
* D:                                     Preprocessor Options.
                                                             (line   46)
* d:                                     Debugging Options.  (line  544)
* dA:                                    Debugging Options.  (line  754)
* da:                                    Debugging Options.  (line  751)
* dD <1>:                                Preprocessor Options.
                                                             (line  629)
* dD:                                    Debugging Options.  (line  758)
* dead_strip:                            Darwin Options.     (line  196)
* dependency-file:                       Darwin Options.     (line  196)
* dH:                                    Debugging Options.  (line  762)
* dI:                                    Preprocessor Options.
                                                             (line  638)
* dM:                                    Preprocessor Options.
                                                             (line  613)
* dN:                                    Preprocessor Options.
                                                             (line  635)
* dP:                                    Debugging Options.  (line  770)
* dp:                                    Debugging Options.  (line  765)
* dU:                                    Preprocessor Options.
                                                             (line  642)
* dumpmachine:                           Debugging Options.  (line 1380)
* dumpspecs:                             Debugging Options.  (line 1388)
* dumpversion:                           Debugging Options.  (line 1384)
* dx:                                    Debugging Options.  (line  774)
* dylib_file:                            Darwin Options.     (line  196)
* dylinker_install_name:                 Darwin Options.     (line  196)
* dynamic:                               Darwin Options.     (line  196)
* dynamiclib:                            Darwin Options.     (line  131)
* E <1>:                                 Link Options.       (line   20)
* E:                                     Overall Options.    (line  185)
* EB:                                    MIPS Options.       (line    7)
* EL:                                    MIPS Options.       (line   10)
* exported_symbols_list:                 Darwin Options.     (line  196)
* F:                                     Darwin Options.     (line   31)
* fabi-version:                          C++ Dialect Options.
                                                             (line   20)
* fada-spec-parent:                      Overall Options.    (line  369)
* faggressive-loop-optimizations:        Optimize Options.   (line  509)
* falign-functions:                      Optimize Options.   (line 1463)
* falign-jumps:                          Optimize Options.   (line 1512)
* falign-labels:                         Optimize Options.   (line 1481)
* falign-loops:                          Optimize Options.   (line 1499)
* fassociative-math:                     Optimize Options.   (line 1956)
* fasynchronous-unwind-tables:           Code Gen Options.   (line  146)
* fauto-inc-dec:                         Optimize Options.   (line  533)
* fbounds-check:                         Code Gen Options.   (line   15)
* fbranch-probabilities:                 Optimize Options.   (line 2083)
* fbranch-target-load-optimize:          Optimize Options.   (line 2191)
* fbranch-target-load-optimize2:         Optimize Options.   (line 2197)
* fbtr-bb-exclusive:                     Optimize Options.   (line 2201)
* fcall-saved:                           Code Gen Options.   (line  358)
* fcall-used:                            Code Gen Options.   (line  344)
* fcaller-saves:                         Optimize Options.   (line  829)
* fcheck-data-deps:                      Optimize Options.   (line 1094)
* fcheck-new:                            C++ Dialect Options.
                                                             (line   55)
* fcombine-stack-adjustments:            Optimize Options.   (line  841)
* fcommon:                               Variable Attributes.
                                                             (line  105)
* fcompare-debug:                        Debugging Options.  (line  200)
* fcompare-debug-second:                 Debugging Options.  (line  226)
* fcompare-elim:                         Optimize Options.   (line 1795)
* fcond-mismatch:                        C Dialect Options.  (line  315)
* fconserve-stack:                       Optimize Options.   (line  847)
* fconstant-string-class:                Objective-C and Objective-C++ Dialect Options.
                                                             (line   30)
* fconstexpr-depth:                      C++ Dialect Options.
                                                             (line   65)
* fcprop-registers:                      Optimize Options.   (line 1813)
* fcrossjumping:                         Optimize Options.   (line  526)
* fcse-follow-jumps:                     Optimize Options.   (line  445)
* fcse-skip-blocks:                      Optimize Options.   (line  454)
* fcx-fortran-rules:                     Optimize Options.   (line 2069)
* fcx-limited-range:                     Optimize Options.   (line 2057)
* fdata-sections:                        Optimize Options.   (line 2172)
* fdbg-cnt:                              Debugging Options.  (line  465)
* fdbg-cnt-list:                         Debugging Options.  (line  462)
* fdce:                                  Optimize Options.   (line  539)
* fdebug-cpp:                            Preprocessor Options.
                                                             (line  526)
* fdebug-prefix-map:                     Debugging Options.  (line  320)
* fdebug-types-section:                  Debugging Options.  (line   74)
* fdeduce-init-list:                     C++ Dialect Options.
                                                             (line   71)
* fdelayed-branch:                       Optimize Options.   (line  676)
* fdelete-dead-exceptions:               Code Gen Options.   (line  131)
* fdelete-null-pointer-checks:           Optimize Options.   (line  562)
* fdevirtualize:                         Optimize Options.   (line  580)
* fdiagnostics-show-caret:               Language Independent Options.
                                                             (line   40)
* fdiagnostics-show-location:            Language Independent Options.
                                                             (line   20)
* fdiagnostics-show-option:              Language Independent Options.
                                                             (line   34)
* fdirectives-only:                      Preprocessor Options.
                                                             (line  473)
* fdisable-:                             Debugging Options.  (line  475)
* fdollars-in-identifiers <1>:           Interoperation.     (line  141)
* fdollars-in-identifiers:               Preprocessor Options.
                                                             (line  495)
* fdse:                                  Optimize Options.   (line  543)
* fdump-ada-spec:                        Overall Options.    (line  363)
* fdump-class-hierarchy:                 Debugging Options.  (line  805)
* fdump-final-insns:                     Debugging Options.  (line  194)
* fdump-go-spec:                         Overall Options.    (line  373)
* fdump-ipa:                             Debugging Options.  (line  813)
* fdump-noaddr:                          Debugging Options.  (line  778)
* fdump-passes:                          Debugging Options.  (line  831)
* fdump-rtl-alignments:                  Debugging Options.  (line  565)
* fdump-rtl-all:                         Debugging Options.  (line  751)
* fdump-rtl-asmcons:                     Debugging Options.  (line  568)
* fdump-rtl-auto_inc_dec:                Debugging Options.  (line  572)
* fdump-rtl-barriers:                    Debugging Options.  (line  576)
* fdump-rtl-bbpart:                      Debugging Options.  (line  579)
* fdump-rtl-bbro:                        Debugging Options.  (line  582)
* fdump-rtl-btl2:                        Debugging Options.  (line  586)
* fdump-rtl-bypass:                      Debugging Options.  (line  590)
* fdump-rtl-ce1:                         Debugging Options.  (line  601)
* fdump-rtl-ce2:                         Debugging Options.  (line  601)
* fdump-rtl-ce3:                         Debugging Options.  (line  601)
* fdump-rtl-combine:                     Debugging Options.  (line  593)
* fdump-rtl-compgotos:                   Debugging Options.  (line  596)
* fdump-rtl-cprop_hardreg:               Debugging Options.  (line  605)
* fdump-rtl-csa:                         Debugging Options.  (line  608)
* fdump-rtl-cse1:                        Debugging Options.  (line  612)
* fdump-rtl-cse2:                        Debugging Options.  (line  612)
* fdump-rtl-dbr:                         Debugging Options.  (line  619)
* fdump-rtl-dce:                         Debugging Options.  (line  616)
* fdump-rtl-dce1:                        Debugging Options.  (line  623)
* fdump-rtl-dce2:                        Debugging Options.  (line  623)
* fdump-rtl-dfinish:                     Debugging Options.  (line  747)
* fdump-rtl-dfinit:                      Debugging Options.  (line  747)
* fdump-rtl-eh:                          Debugging Options.  (line  627)
* fdump-rtl-eh_ranges:                   Debugging Options.  (line  630)
* fdump-rtl-expand:                      Debugging Options.  (line  633)
* fdump-rtl-fwprop1:                     Debugging Options.  (line  637)
* fdump-rtl-fwprop2:                     Debugging Options.  (line  637)
* fdump-rtl-gcse1:                       Debugging Options.  (line  642)
* fdump-rtl-gcse2:                       Debugging Options.  (line  642)
* fdump-rtl-init-regs:                   Debugging Options.  (line  646)
* fdump-rtl-initvals:                    Debugging Options.  (line  649)
* fdump-rtl-into_cfglayout:              Debugging Options.  (line  652)
* fdump-rtl-ira:                         Debugging Options.  (line  655)
* fdump-rtl-jump:                        Debugging Options.  (line  658)
* fdump-rtl-loop2:                       Debugging Options.  (line  661)
* fdump-rtl-mach:                        Debugging Options.  (line  665)
* fdump-rtl-mode_sw:                     Debugging Options.  (line  669)
* fdump-rtl-outof_cfglayout:             Debugging Options.  (line  675)
* fdump-rtl-peephole2:                   Debugging Options.  (line  678)
* fdump-rtl-postreload:                  Debugging Options.  (line  681)
* fdump-rtl-pro_and_epilogue:            Debugging Options.  (line  684)
* fdump-rtl-regclass:                    Debugging Options.  (line  747)
* fdump-rtl-regmove:                     Debugging Options.  (line  687)
* fdump-rtl-rnreg:                       Debugging Options.  (line  672)
* fdump-rtl-sched1:                      Debugging Options.  (line  691)
* fdump-rtl-sched2:                      Debugging Options.  (line  691)
* fdump-rtl-see:                         Debugging Options.  (line  695)
* fdump-rtl-seqabstr:                    Debugging Options.  (line  698)
* fdump-rtl-shorten:                     Debugging Options.  (line  701)
* fdump-rtl-sibling:                     Debugging Options.  (line  704)
* fdump-rtl-sms:                         Debugging Options.  (line  717)
* fdump-rtl-split1:                      Debugging Options.  (line  711)
* fdump-rtl-split2:                      Debugging Options.  (line  711)
* fdump-rtl-split3:                      Debugging Options.  (line  711)
* fdump-rtl-split4:                      Debugging Options.  (line  711)
* fdump-rtl-split5:                      Debugging Options.  (line  711)
* fdump-rtl-stack:                       Debugging Options.  (line  721)
* fdump-rtl-subreg1:                     Debugging Options.  (line  727)
* fdump-rtl-subreg2:                     Debugging Options.  (line  727)
* fdump-rtl-subregs_of_mode_finish:      Debugging Options.  (line  747)
* fdump-rtl-subregs_of_mode_init:        Debugging Options.  (line  747)
* fdump-rtl-unshare:                     Debugging Options.  (line  731)
* fdump-rtl-vartrack:                    Debugging Options.  (line  734)
* fdump-rtl-vregs:                       Debugging Options.  (line  737)
* fdump-rtl-web:                         Debugging Options.  (line  740)
* fdump-statistics:                      Debugging Options.  (line  835)
* fdump-translation-unit:                Debugging Options.  (line  796)
* fdump-tree:                            Debugging Options.  (line  847)
* fdump-tree-alias:                      Debugging Options.  (line  986)
* fdump-tree-all:                        Debugging Options.  (line 1076)
* fdump-tree-ccp:                        Debugging Options.  (line  990)
* fdump-tree-cfg:                        Debugging Options.  (line  974)
* fdump-tree-ch:                         Debugging Options.  (line  978)
* fdump-tree-copyprop:                   Debugging Options.  (line 1006)
* fdump-tree-copyrename:                 Debugging Options.  (line 1052)
* fdump-tree-dce:                        Debugging Options.  (line 1014)
* fdump-tree-dom:                        Debugging Options.  (line 1032)
* fdump-tree-dse:                        Debugging Options.  (line 1037)
* fdump-tree-forwprop:                   Debugging Options.  (line 1047)
* fdump-tree-fre:                        Debugging Options.  (line 1002)
* fdump-tree-gimple:                     Debugging Options.  (line  969)
* fdump-tree-mudflap:                    Debugging Options.  (line 1018)
* fdump-tree-nrv:                        Debugging Options.  (line 1057)
* fdump-tree-optimized:                  Debugging Options.  (line  966)
* fdump-tree-original:                   Debugging Options.  (line  963)
* fdump-tree-phiopt:                     Debugging Options.  (line 1042)
* fdump-tree-pre:                        Debugging Options.  (line  998)
* fdump-tree-sink:                       Debugging Options.  (line 1028)
* fdump-tree-slp:                        Debugging Options.  (line 1067)
* fdump-tree-sra:                        Debugging Options.  (line 1023)
* fdump-tree-ssa:                        Debugging Options.  (line  982)
* fdump-tree-store_copyprop:             Debugging Options.  (line 1010)
* fdump-tree-storeccp:                   Debugging Options.  (line  994)
* fdump-tree-vect:                       Debugging Options.  (line 1062)
* fdump-tree-vrp:                        Debugging Options.  (line 1072)
* fdump-unnumbered:                      Debugging Options.  (line  784)
* fdump-unnumbered-links:                Debugging Options.  (line  790)
* fdwarf2-cfi-asm:                       Debugging Options.  (line  324)
* fearly-inlining:                       Optimize Options.   (line  276)
* feliminate-dwarf2-dups:                Debugging Options.  (line  239)
* feliminate-unused-debug-symbols:       Debugging Options.  (line   62)
* feliminate-unused-debug-types:         Debugging Options.  (line 1392)
* fenable-:                              Debugging Options.  (line  475)
* fexceptions:                           Code Gen Options.   (line  108)
* fexcess-precision:                     Optimize Options.   (line 1884)
* fexec-charset:                         Preprocessor Options.
                                                             (line  554)
* fexpensive-optimizations:              Optimize Options.   (line  587)
* fext-numeric-literals:                 C++ Dialect Options.
                                                             (line  547)
* fextended-identifiers:                 Preprocessor Options.
                                                             (line  498)
* fextern-tls-init:                      C++ Dialect Options.
                                                             (line  122)
* ffast-math:                            Optimize Options.   (line 1907)
* ffat-lto-objects:                      Optimize Options.   (line 1775)
* ffinite-math-only:                     Optimize Options.   (line 1981)
* ffix-and-continue:                     Darwin Options.     (line  104)
* ffixed:                                Code Gen Options.   (line  332)
* ffloat-store <1>:                      Disappointments.    (line   77)
* ffloat-store:                          Optimize Options.   (line 1870)
* ffor-scope:                            C++ Dialect Options.
                                                             (line  143)
* fforward-propagate:                    Optimize Options.   (line  185)
* ffp-contract:                          Optimize Options.   (line  194)
* ffreestanding <1>:                     Function Attributes.
                                                             (line  459)
* ffreestanding <2>:                     Warning Options.    (line  255)
* ffreestanding <3>:                     C Dialect Options.  (line  246)
* ffreestanding:                         Standards.          (line   93)
* ffriend-injection:                     C++ Dialect Options.
                                                             (line   92)
* ffunction-sections:                    Optimize Options.   (line 2172)
* fgcse:                                 Optimize Options.   (line  468)
* fgcse-after-reload:                    Optimize Options.   (line  504)
* fgcse-las:                             Optimize Options.   (line  497)
* fgcse-lm:                              Optimize Options.   (line  479)
* fgcse-sm:                              Optimize Options.   (line  488)
* fgnu-runtime:                          Objective-C and Objective-C++ Dialect Options.
                                                             (line   39)
* fgnu-tm:                               C Dialect Options.  (line  264)
* fgnu89-inline:                         C Dialect Options.  (line  147)
* fgraphite-identity:                    Optimize Options.   (line 1074)
* fhosted:                               C Dialect Options.  (line  239)
* fif-conversion:                        Optimize Options.   (line  547)
* fif-conversion2:                       Optimize Options.   (line  556)
* filelist:                              Darwin Options.     (line  196)
* findirect-data:                        Darwin Options.     (line  104)
* findirect-inlining:                    Optimize Options.   (line  249)
* finhibit-size-directive:               Code Gen Options.   (line  252)
* finline-functions:                     Optimize Options.   (line  257)
* finline-functions-called-once:         Optimize Options.   (line  268)
* finline-limit:                         Optimize Options.   (line  293)
* finline-small-functions:               Optimize Options.   (line  240)
* finput-charset:                        Preprocessor Options.
                                                             (line  567)
* finstrument-functions <1>:             Function Attributes.
                                                             (line  954)
* finstrument-functions:                 Code Gen Options.   (line  388)
* finstrument-functions-exclude-file-list: Code Gen Options. (line  424)
* finstrument-functions-exclude-function-list: Code Gen Options.
                                                             (line  444)
* fipa-cp:                               Optimize Options.   (line  913)
* fipa-cp-clone:                         Optimize Options.   (line  921)
* fipa-profile:                          Optimize Options.   (line  905)
* fipa-pta:                              Optimize Options.   (line  899)
* fipa-pure-const:                       Optimize Options.   (line  891)
* fipa-reference:                        Optimize Options.   (line  895)
* fipa-sra:                              Optimize Options.   (line  286)
* fira-hoist-pressure:                   Optimize Options.   (line  643)
* fira-loop-pressure:                    Optimize Options.   (line  650)
* fira-verbose:                          Optimize Options.   (line  670)
* fivopts:                               Optimize Options.   (line 1170)
* fkeep-inline-functions <1>:            Inline.             (line   51)
* fkeep-inline-functions:                Optimize Options.   (line  325)
* fkeep-static-consts:                   Optimize Options.   (line  332)
* flat_namespace:                        Darwin Options.     (line  196)
* flax-vector-conversions:               C Dialect Options.  (line  320)
* fleading-underscore:                   Code Gen Options.   (line  527)
* floop-block:                           Optimize Options.   (line 1045)
* floop-interchange:                     Optimize Options.   (line 1000)
* floop-nest-optimize:                   Optimize Options.   (line 1082)
* floop-parallelize-all:                 Optimize Options.   (line 1088)
* floop-strip-mine:                      Optimize Options.   (line 1024)
* flto:                                  Optimize Options.   (line 1566)
* flto-partition:                        Optimize Options.   (line 1730)
* fmax-errors:                           Warning Options.    (line   18)
* fmem-report:                           Debugging Options.  (line  348)
* fmem-report-wpa:                       Debugging Options.  (line  352)
* fmerge-all-constants:                  Optimize Options.   (line  351)
* fmerge-constants:                      Optimize Options.   (line  341)
* fmerge-debug-strings:                  Debugging Options.  (line  313)
* fmessage-length:                       Language Independent Options.
                                                             (line   14)
* fmodulo-sched:                         Optimize Options.   (line  362)
* fmodulo-sched-allow-regmoves:          Optimize Options.   (line  367)
* fmove-loop-invariants:                 Optimize Options.   (line 2162)
* fms-extensions <1>:                    Unnamed Fields.     (line   36)
* fms-extensions <2>:                    C++ Dialect Options.
                                                             (line  177)
* fms-extensions:                        C Dialect Options.  (line  279)
* fmudflap:                              Optimize Options.   (line  407)
* fmudflapir:                            Optimize Options.   (line  407)
* fmudflapth:                            Optimize Options.   (line  407)
* fnext-runtime:                         Objective-C and Objective-C++ Dialect Options.
                                                             (line   43)
* fno-access-control:                    C++ Dialect Options.
                                                             (line   51)
* fno-asm:                               C Dialect Options.  (line  191)
* fno-branch-count-reg:                  Optimize Options.   (line  374)
* fno-builtin <1>:                       Other Builtins.     (line   14)
* fno-builtin <2>:                       Function Attributes.
                                                             (line  459)
* fno-builtin <3>:                       Warning Options.    (line  255)
* fno-builtin:                           C Dialect Options.  (line  205)
* fno-canonical-system-headers:          Preprocessor Options.
                                                             (line  503)
* fno-common <1>:                        Variable Attributes.
                                                             (line  105)
* fno-common:                            Code Gen Options.   (line  229)
* fno-compare-debug:                     Debugging Options.  (line  200)
* fno-debug-types-section:               Debugging Options.  (line   74)
* fno-default-inline <1>:                Inline.             (line   71)
* fno-default-inline <2>:                Optimize Options.   (line  170)
* fno-default-inline:                    C++ Dialect Options.
                                                             (line  356)
* fno-defer-pop:                         Optimize Options.   (line  177)
* fno-diagnostics-show-caret:            Language Independent Options.
                                                             (line   40)
* fno-diagnostics-show-option:           Language Independent Options.
                                                             (line   34)
* fno-dwarf2-cfi-asm:                    Debugging Options.  (line  324)
* fno-elide-constructors:                C++ Dialect Options.
                                                             (line  105)
* fno-eliminate-unused-debug-types:      Debugging Options.  (line 1392)
* fno-enforce-eh-specs:                  C++ Dialect Options.
                                                             (line  111)
* fno-ext-numeric-literals:              C++ Dialect Options.
                                                             (line  547)
* fno-extern-tls-init:                   C++ Dialect Options.
                                                             (line  122)
* fno-for-scope:                         C++ Dialect Options.
                                                             (line  143)
* fno-function-cse:                      Optimize Options.   (line  384)
* fno-gnu-keywords:                      C++ Dialect Options.
                                                             (line  155)
* fno-gnu-unique:                        Code Gen Options.   (line  152)
* fno-guess-branch-probability:          Optimize Options.   (line 1335)
* fno-ident:                             Code Gen Options.   (line  249)
* fno-implement-inlines <1>:             C++ Interface.      (line   75)
* fno-implement-inlines:                 C++ Dialect Options.
                                                             (line  172)
* fno-implicit-inline-templates:         C++ Dialect Options.
                                                             (line  166)
* fno-implicit-templates <1>:            Template Instantiation.
                                                             (line   78)
* fno-implicit-templates:                C++ Dialect Options.
                                                             (line  160)
* fno-inline:                            Optimize Options.   (line  232)
* fno-ira-share-save-slots:              Optimize Options.   (line  658)
* fno-ira-share-spill-slots:             Optimize Options.   (line  664)
* fno-jump-tables:                       Code Gen Options.   (line  324)
* fno-math-errno:                        Optimize Options.   (line 1921)
* fno-merge-debug-strings:               Debugging Options.  (line  313)
* fno-nil-receivers:                     Objective-C and Objective-C++ Dialect Options.
                                                             (line   49)
* fno-nonansi-builtins:                  C++ Dialect Options.
                                                             (line  182)
* fno-operator-names:                    C++ Dialect Options.
                                                             (line  198)
* fno-optional-diags:                    C++ Dialect Options.
                                                             (line  202)
* fno-peephole:                          Optimize Options.   (line 1326)
* fno-peephole2:                         Optimize Options.   (line 1326)
* fno-pretty-templates:                  C++ Dialect Options.
                                                             (line  212)
* fno-rtti:                              C++ Dialect Options.
                                                             (line  229)
* fno-sched-interblock:                  Optimize Options.   (line  702)
* fno-sched-spec:                        Optimize Options.   (line  707)
* fno-set-stack-executable:              i386 and x86-64 Windows Options.
                                                             (line   46)
* fno-show-column:                       Preprocessor Options.
                                                             (line  592)
* fno-signed-bitfields:                  C Dialect Options.  (line  353)
* fno-signed-zeros:                      Optimize Options.   (line 1993)
* fno-stack-limit:                       Code Gen Options.   (line  495)
* fno-threadsafe-statics:                C++ Dialect Options.
                                                             (line  266)
* fno-toplevel-reorder:                  Optimize Options.   (line 1532)
* fno-trapping-math:                     Optimize Options.   (line 2003)
* fno-unsigned-bitfields:                C Dialect Options.  (line  353)
* fno-use-cxa-get-exception-ptr:         C++ Dialect Options.
                                                             (line  279)
* fno-var-tracking-assignments:          Debugging Options.  (line 1300)
* fno-var-tracking-assignments-toggle:   Debugging Options.  (line 1309)
* fno-weak:                              C++ Dialect Options.
                                                             (line  341)
* 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  395)
* fnon-call-exceptions:                  Code Gen Options.   (line  122)
* fnothrow-opt:                          C++ Dialect Options.
                                                             (line  187)
* 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  205)
* fopenmp:                               C Dialect Options.  (line  256)
* fopt-info:                             Debugging Options.  (line 1082)
* foptimize-register-move:               Optimize Options.   (line  602)
* foptimize-sibling-calls:               Optimize Options.   (line  227)
* force_cpusubtype_ALL:                  Darwin Options.     (line  135)
* force_flat_namespace:                  Darwin Options.     (line  196)
* fpack-struct:                          Code Gen Options.   (line  375)
* fpartial-inlining:                     Optimize Options.   (line 1301)
* fpcc-struct-return <1>:                Incompatibilities.  (line  170)
* fpcc-struct-return:                    Code Gen Options.   (line  165)
* fpch-deps:                             Preprocessor Options.
                                                             (line  294)
* fpch-preprocess:                       Preprocessor Options.
                                                             (line  302)
* fpeel-loops:                           Optimize Options.   (line 2154)
* fpermissive:                           C++ Dialect Options.
                                                             (line  207)
* fPIC:                                  Code Gen Options.   (line  301)
* fpic:                                  Code Gen Options.   (line  280)
* fPIE:                                  Code Gen Options.   (line  314)
* fpie:                                  Code Gen Options.   (line  314)
* fplan9-extensions:                     Unnamed Fields.     (line   44)
* fpost-ipa-mem-report:                  Debugging Options.  (line  358)
* fpre-ipa-mem-report:                   Debugging Options.  (line  356)
* fpredictive-commoning:                 Optimize Options.   (line 1308)
* fprefetch-loop-arrays:                 Optimize Options.   (line 1315)
* fpreprocessed:                         Preprocessor Options.
                                                             (line  507)
* fprofile-arcs <1>:                     Other Builtins.     (line  257)
* fprofile-arcs:                         Debugging Options.  (line  397)
* fprofile-correction:                   Optimize Options.   (line 1820)
* fprofile-dir:                          Optimize Options.   (line 1827)
* fprofile-generate:                     Optimize Options.   (line 1837)
* fprofile-report:                       Debugging Options.  (line  362)
* fprofile-use:                          Optimize Options.   (line 1850)
* fprofile-values:                       Optimize Options.   (line 2102)
* fpu:                                   RX Options.         (line   17)
* frandom-seed:                          Debugging Options.  (line 1194)
* freciprocal-math:                      Optimize Options.   (line 1972)
* frecord-gcc-switches:                  Code Gen Options.   (line  268)
* free:                                  Optimize Options.   (line  593)
* freg-struct-return:                    Code Gen Options.   (line  183)
* fregmove:                              Optimize Options.   (line  602)
* frename-registers:                     Optimize Options.   (line 2121)
* freorder-blocks:                       Optimize Options.   (line 1352)
* freorder-blocks-and-partition:         Optimize Options.   (line 1358)
* freorder-functions:                    Optimize Options.   (line 1369)
* freplace-objc-classes:                 Objective-C and Objective-C++ Dialect Options.
                                                             (line  131)
* frepo <1>:                             Template Instantiation.
                                                             (line   54)
* frepo:                                 C++ Dialect Options.
                                                             (line  224)
* frerun-cse-after-loop:                 Optimize Options.   (line  462)
* freschedule-modulo-scheduled-loops:    Optimize Options.   (line  801)
* frounding-math:                        Optimize Options.   (line 2018)
* fsched-critical-path-heuristic:        Optimize Options.   (line  767)
* fsched-dep-count-heuristic:            Optimize Options.   (line  794)
* fsched-group-heuristic:                Optimize Options.   (line  761)
* fsched-last-insn-heuristic:            Optimize Options.   (line  787)
* fsched-pressure:                       Optimize Options.   (line  712)
* fsched-rank-heuristic:                 Optimize Options.   (line  780)
* fsched-spec-insn-heuristic:            Optimize Options.   (line  773)
* fsched-spec-load:                      Optimize Options.   (line  721)
* fsched-spec-load-dangerous:            Optimize Options.   (line  726)
* fsched-stalled-insns:                  Optimize Options.   (line  732)
* fsched-stalled-insns-dep:              Optimize Options.   (line  742)
* fsched-verbose:                        Debugging Options.  (line 1204)
* fsched2-use-superblocks:               Optimize Options.   (line  751)
* fschedule-insns:                       Optimize Options.   (line  683)
* fschedule-insns2:                      Optimize Options.   (line  693)
* fsection-anchors:                      Optimize Options.   (line 2217)
* fsel-sched-pipelining:                 Optimize Options.   (line  814)
* fsel-sched-pipelining-outer-loops:     Optimize Options.   (line  819)
* fselective-scheduling:                 Optimize Options.   (line  806)
* fselective-scheduling2:                Optimize Options.   (line  810)
* fshort-double:                         Code Gen Options.   (line  211)
* fshort-enums <1>:                      Non-bugs.           (line   42)
* fshort-enums <2>:                      Type Attributes.    (line  113)
* fshort-enums <3>:                      Structures unions enumerations and bit-fields implementation.
                                                             (line   43)
* fshort-enums:                          Code Gen Options.   (line  201)
* fshort-wchar:                          Code Gen Options.   (line  219)
* fshrink-wrap:                          Optimize Options.   (line  824)
* fsignaling-nans:                       Optimize Options.   (line 2038)
* fsigned-bitfields <1>:                 Non-bugs.           (line   57)
* fsigned-bitfields:                     C Dialect Options.  (line  353)
* fsigned-char <1>:                      Characters implementation.
                                                             (line   31)
* fsigned-char:                          C Dialect Options.  (line  343)
* fsingle-precision-constant:            Optimize Options.   (line 2053)
* fsplit-ivs-in-unroller:                Optimize Options.   (line 1282)
* fsplit-stack <1>:                      Function Attributes.
                                                             (line  959)
* fsplit-stack:                          Code Gen Options.   (line  509)
* fsplit-wide-types:                     Optimize Options.   (line  437)
* fstack-check:                          Code Gen Options.   (line  456)
* fstack-limit-register:                 Code Gen Options.   (line  495)
* fstack-limit-symbol:                   Code Gen Options.   (line  495)
* fstack-protector:                      Optimize Options.   (line 2205)
* fstack-protector-all:                  Optimize Options.   (line 2214)
* fstack-usage:                          Debugging Options.  (line  366)
* fstack_reuse:                          Code Gen Options.   (line   21)
* fstats:                                C++ Dialect Options.
                                                             (line  239)
* fstrict-aliasing:                      Optimize Options.   (line 1382)
* fstrict-enums:                         C++ Dialect Options.
                                                             (line  244)
* fstrict-overflow:                      Optimize Options.   (line 1428)
* fstrict-volatile-bitfields:            Code Gen Options.   (line  612)
* fsync-libcalls:                        Code Gen Options.   (line  641)
* fsyntax-only:                          Warning Options.    (line   14)
* ftabstop:                              Preprocessor Options.
                                                             (line  520)
* ftemplate-backtrace-limit:             C++ Dialect Options.
                                                             (line  253)
* ftemplate-depth:                       C++ Dialect Options.
                                                             (line  257)
* ftest-coverage:                        Debugging Options.  (line  453)
* fthread-jumps:                         Optimize Options.   (line  428)
* ftime-report:                          Debugging Options.  (line  344)
* ftls-model:                            Code Gen Options.   (line  538)
* ftracer:                               Optimize Options.   (line 1265)
* ftrack-macro-expansion:                Preprocessor Options.
                                                             (line  536)
* ftrapv:                                Code Gen Options.   (line   96)
* ftree-bit-ccp:                         Optimize Options.   (line  935)
* ftree-builtin-call-dce:                Optimize Options.   (line  963)
* ftree-ccp:                             Optimize Options.   (line  941)
* ftree-ch:                              Optimize Options.   (line  983)
* ftree-copy-prop:                       Optimize Options.   (line  886)
* ftree-copyrename:                      Optimize Options.   (line 1194)
* ftree-dce:                             Optimize Options.   (line  959)
* ftree-dominator-opts:                  Optimize Options.   (line  969)
* ftree-dse:                             Optimize Options.   (line  976)
* ftree-forwprop:                        Optimize Options.   (line  865)
* ftree-fre:                             Optimize Options.   (line  869)
* ftree-loop-im:                         Optimize Options.   (line 1155)
* ftree-loop-ivcanon:                    Optimize Options.   (line 1164)
* ftree-loop-linear:                     Optimize Options.   (line  994)
* ftree-loop-optimize:                   Optimize Options.   (line  990)
* ftree-parallelize-loops:               Optimize Options.   (line 1175)
* ftree-partial-pre:                     Optimize Options.   (line  861)
* ftree-phiprop:                         Optimize Options.   (line  876)
* ftree-pre:                             Optimize Options.   (line  857)
* ftree-pta:                             Optimize Options.   (line 1184)
* ftree-reassoc:                         Optimize Options.   (line  853)
* ftree-sink:                            Optimize Options.   (line  931)
* ftree-slp-vectorize:                   Optimize Options.   (line 1238)
* ftree-slsr:                            Optimize Options.   (line 1228)
* ftree-sra:                             Optimize Options.   (line 1188)
* ftree-ter:                             Optimize Options.   (line 1220)
* ftree-vectorize:                       Optimize Options.   (line 1234)
* ftree-vectorizer-verbose:              Debugging Options.  (line 1177)
* ftree-vrp:                             Optimize Options.   (line 1256)
* funit-at-a-time:                       Optimize Options.   (line 1525)
* funroll-all-loops:                     Optimize Options.   (line 1276)
* funroll-loops:                         Optimize Options.   (line 1270)
* funsafe-loop-optimizations:            Optimize Options.   (line  518)
* funsafe-math-optimizations:            Optimize Options.   (line 1939)
* funsigned-bitfields <1>:               Non-bugs.           (line   57)
* funsigned-bitfields <2>:               Structures unions enumerations and bit-fields implementation.
                                                             (line   17)
* funsigned-bitfields:                   C Dialect Options.  (line  353)
* funsigned-char <1>:                    Characters implementation.
                                                             (line   31)
* funsigned-char:                        C Dialect Options.  (line  325)
* funswitch-loops:                       Optimize Options.   (line 2166)
* funwind-tables:                        Code Gen Options.   (line  139)
* fuse-cxa-atexit:                       C++ Dialect Options.
                                                             (line  272)
* fvar-tracking:                         Debugging Options.  (line 1290)
* fvar-tracking-assignments:             Debugging Options.  (line 1300)
* fvar-tracking-assignments-toggle:      Debugging Options.  (line 1309)
* fvariable-expansion-in-unroller:       Optimize Options.   (line 1296)
* fvect-cost-model:                      Optimize Options.   (line 1242)
* fverbose-asm:                          Code Gen Options.   (line  259)
* fvisibility:                           Code Gen Options.   (line  546)
* fvisibility-inlines-hidden:            C++ Dialect Options.
                                                             (line  284)
* fvisibility-ms-compat:                 C++ Dialect Options.
                                                             (line  312)
* fvpt:                                  Optimize Options.   (line 2111)
* fweb:                                  Optimize Options.   (line 1544)
* fwhole-program:                        Optimize Options.   (line 1555)
* 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 <1>:                                 System V Options.   (line   10)
* G <2>:                                 RS/6000 and PowerPC Options.
                                                             (line  743)
* G <3>:                                 MIPS Options.       (line  330)
* G:                                     M32R/D Options.     (line   57)
* g:                                     Debugging Options.  (line   10)
* gcoff:                                 Debugging Options.  (line   89)
* gdwarf-VERSION:                        Debugging Options.  (line  107)
* gen-decls:                             Objective-C and Objective-C++ Dialect Options.
                                                             (line  153)
* gfull:                                 Darwin Options.     (line   69)
* ggdb:                                  Debugging Options.  (line   45)
* gno-record-gcc-switches:               Debugging Options.  (line  127)
* gno-strict-dwarf:                      Debugging Options.  (line  137)
* gpubnames:                             Debugging Options.  (line   51)
* grecord-gcc-switches:                  Debugging Options.  (line  118)
* gsplit-dwarf:                          Debugging Options.  (line   38)
* gstabs:                                Debugging Options.  (line   54)
* gstabs+:                               Debugging Options.  (line   83)
* gstrict-dwarf:                         Debugging Options.  (line  131)
* gtoggle:                               Debugging Options.  (line  174)
* gused:                                 Darwin Options.     (line   64)
* gvms:                                  Debugging Options.  (line  141)
* gxcoff:                                Debugging Options.  (line   94)
* gxcoff+:                               Debugging Options.  (line   99)
* H:                                     Preprocessor Options.
                                                             (line  710)
* headerpad_max_install_names:           Darwin Options.     (line  196)
* help <1>:                              Preprocessor Options.
                                                             (line  702)
* help:                                  Overall Options.    (line  221)
* hoist-adjacent-loads:                  Optimize Options.   (line  880)
* I <1>:                                 Directory Options.  (line   10)
* I:                                     Preprocessor Options.
                                                             (line   77)
* I- <1>:                                Directory Options.  (line  119)
* I-:                                    Preprocessor Options.
                                                             (line  387)
* idirafter:                             Preprocessor Options.
                                                             (line  429)
* iframework:                            Darwin Options.     (line   57)
* imacros:                               Preprocessor Options.
                                                             (line  420)
* image_base:                            Darwin Options.     (line  196)
* imultilib:                             Preprocessor Options.
                                                             (line  454)
* include:                               Preprocessor Options.
                                                             (line  409)
* init:                                  Darwin Options.     (line  196)
* install_name:                          Darwin Options.     (line  196)
* iprefix:                               Preprocessor Options.
                                                             (line  436)
* iquote <1>:                            Directory Options.  (line   36)
* iquote:                                Preprocessor Options.
                                                             (line  466)
* isysroot:                              Preprocessor Options.
                                                             (line  448)
* isystem:                               Preprocessor Options.
                                                             (line  458)
* iwithprefix:                           Preprocessor Options.
                                                             (line  442)
* iwithprefixbefore:                     Preprocessor Options.
                                                             (line  442)
* keep_private_externs:                  Darwin Options.     (line  196)
* L:                                     Directory Options.  (line   42)
* l:                                     Link Options.       (line   26)
* lobjc:                                 Link Options.       (line   53)
* m:                                     RS/6000 and PowerPC Options.
                                                             (line  584)
* M:                                     Preprocessor Options.
                                                             (line  185)
* m1:                                    SH Options.         (line    9)
* m10:                                   PDP-11 Options.     (line   29)
* m128bit-long-double:                   i386 and x86-64 Options.
                                                             (line  342)
* m16-bit:                               CRIS Options.       (line   64)
* m1reg-:                                Adapteva Epiphany Options.
                                                             (line  132)
* 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   87)
* m32 <1>:                               TILEPro Options.    (line   13)
* m32 <2>:                               TILE-Gx Options.    (line   23)
* m32 <3>:                               SPARC Options.      (line  257)
* m32 <4>:                               RS/6000 and PowerPC Options.
                                                             (line  276)
* m32:                                   i386 and x86-64 Options.
                                                             (line  841)
* 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  571)
* 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  147)
* m5206e:                                M680x0 Options.     (line  156)
* m528x:                                 M680x0 Options.     (line  160)
* m5307:                                 M680x0 Options.     (line  164)
* m5407:                                 M680x0 Options.     (line  168)
* m64 <1>:                               TILE-Gx Options.    (line   23)
* m64 <2>:                               SPARC Options.      (line  257)
* m64 <3>:                               S/390 and zSeries Options.
                                                             (line   87)
* m64 <4>:                               RS/6000 and PowerPC Options.
                                                             (line  276)
* m64:                                   i386 and x86-64 Options.
                                                             (line  841)
* m64bit-doubles:                        RX Options.         (line   10)
* m68000:                                M680x0 Options.     (line   95)
* m68010:                                M680x0 Options.     (line  103)
* m68020:                                M680x0 Options.     (line  109)
* m68020-40:                             M680x0 Options.     (line  178)
* m68020-60:                             M680x0 Options.     (line  187)
* m68030:                                M680x0 Options.     (line  114)
* m68040:                                M680x0 Options.     (line  119)
* m68060:                                M680x0 Options.     (line  128)
* m68881:                                M680x0 Options.     (line  197)
* m8-bit:                                CRIS Options.       (line   64)
* m8byte-align:                          V850 Options.       (line  170)
* m96bit-long-double:                    i386 and x86-64 Options.
                                                             (line  342)
* mabi <1>:                              RS/6000 and PowerPC Options.
                                                             (line  611)
* mabi <2>:                              i386 and x86-64 Options.
                                                             (line  721)
* mabi:                                  ARM Options.        (line   10)
* mabi=32:                               MIPS Options.       (line  131)
* mabi=64:                               MIPS Options.       (line  131)
* mabi=eabi:                             MIPS Options.       (line  131)
* mabi=elfv1:                            RS/6000 and PowerPC Options.
                                                             (line  632)
* mabi=elfv2:                            RS/6000 and PowerPC Options.
                                                             (line  638)
* mabi=gnu:                              MMIX Options.       (line   20)
* mabi=ibmlongdouble:                    RS/6000 and PowerPC Options.
                                                             (line  624)
* mabi=ieeelongdouble:                   RS/6000 and PowerPC Options.
                                                             (line  628)
* mabi=mmixware:                         MMIX Options.       (line   20)
* mabi=n32:                              MIPS Options.       (line  131)
* mabi=no-spe:                           RS/6000 and PowerPC Options.
                                                             (line  621)
* mabi=o64:                              MIPS Options.       (line  131)
* mabi=spe:                              RS/6000 and PowerPC Options.
                                                             (line  616)
* mabicalls:                             MIPS Options.       (line  155)
* mabort-on-noreturn:                    ARM Options.        (line  192)
* mabsdiff:                              MeP Options.        (line    7)
* mabshi:                                PDP-11 Options.     (line   55)
* mac0:                                  PDP-11 Options.     (line   16)
* macc-4:                                FRV Options.        (line  113)
* macc-8:                                FRV Options.        (line  116)
* maccumulate-args:                      AVR Options.        (line  135)
* maccumulate-outgoing-args <1>:         SH Options.         (line  330)
* maccumulate-outgoing-args:             i386 and x86-64 Options.
                                                             (line  744)
* maddress-mode=long:                    i386 and x86-64 Options.
                                                             (line  884)
* maddress-mode=short:                   i386 and x86-64 Options.
                                                             (line  889)
* maddress-space-conversion:             SPU Options.        (line   63)
* mads:                                  RS/6000 and PowerPC Options.
                                                             (line  666)
* maix-struct-return:                    RS/6000 and PowerPC Options.
                                                             (line  604)
* maix32:                                RS/6000 and PowerPC Options.
                                                             (line  314)
* maix64:                                RS/6000 and PowerPC Options.
                                                             (line  314)
* malign-300:                            H8/300 Options.     (line   41)
* malign-double:                         i386 and x86-64 Options.
                                                             (line  326)
* malign-int:                            M680x0 Options.     (line  267)
* malign-labels:                         FRV Options.        (line  104)
* malign-loops:                          M32R/D Options.     (line   73)
* malign-natural:                        RS/6000 and PowerPC Options.
                                                             (line  353)
* malign-power:                          RS/6000 and PowerPC Options.
                                                             (line  353)
* mall-opts:                             MeP Options.        (line   11)
* malloc-cc:                             FRV Options.        (line   25)
* maltivec:                              RS/6000 and PowerPC Options.
                                                             (line  134)
* maltivec=be:                           RS/6000 and PowerPC Options.
                                                             (line  150)
* maltivec=le:                           RS/6000 and PowerPC Options.
                                                             (line  160)
* mam33:                                 MN10300 Options.    (line   17)
* mam33-2:                               MN10300 Options.    (line   24)
* mam34:                                 MN10300 Options.    (line   27)
* mandroid:                              GNU/Linux Options.  (line   21)
* mapcs:                                 ARM Options.        (line   22)
* mapcs-frame:                           ARM Options.        (line   14)
* mapp-regs <1>:                         V850 Options.       (line  181)
* mapp-regs:                             SPARC Options.      (line   10)
* march <1>:                             S/390 and zSeries Options.
                                                             (line  116)
* march <2>:                             MIPS Options.       (line   14)
* march <3>:                             M680x0 Options.     (line   12)
* march <4>:                             i386 and x86-64 Options.
                                                             (line   10)
* march <5>:                             HPPA Options.       (line    9)
* march <6>:                             CRIS Options.       (line   10)
* march <7>:                             C6X Options.        (line    7)
* march <8>:                             ARM Options.        (line   75)
* march:                                 AArch64 Options.    (line   55)
* marm:                                  ARM Options.        (line  256)
* mas100-syntax:                         RX Options.         (line   76)
* masm=DIALECT:                          i386 and x86-64 Options.
                                                             (line  281)
* matomic-model=MODEL:                   SH Options.         (line  144)
* matomic-updates:                       SPU Options.        (line   78)
* mauto-pic:                             IA-64 Options.      (line   50)
* maverage:                              MeP Options.        (line   16)
* mavoid-indexed-addresses:              RS/6000 and PowerPC Options.
                                                             (line  423)
* max-vect-align:                        Adapteva Epiphany Options.
                                                             (line  120)
* mb:                                    SH Options.         (line   74)
* mbackchain:                            S/390 and zSeries Options.
                                                             (line   35)
* mbarrel-shift-enabled:                 LM32 Options.       (line    9)
* mbase-addresses:                       MMIX Options.       (line   54)
* mbased=:                               MeP Options.        (line   20)
* mbcopy:                                PDP-11 Options.     (line   36)
* mbcopy-builtin:                        PDP-11 Options.     (line   32)
* mbig:                                  RS/6000 and PowerPC Options.
                                                             (line  503)
* mbig-endian <1>:                       RS/6000 and PowerPC Options.
                                                             (line  503)
* mbig-endian <2>:                       MicroBlaze Options. (line   57)
* mbig-endian <3>:                       MCore Options.      (line   39)
* mbig-endian <4>:                       IA-64 Options.      (line    9)
* mbig-endian <5>:                       C6X Options.        (line   13)
* mbig-endian <6>:                       ARM Options.        (line   62)
* mbig-endian:                           AArch64 Options.    (line    9)
* mbig-endian-data:                      RX Options.         (line   42)
* mbig-switch <1>:                       V850 Options.       (line  176)
* mbig-switch:                           HPPA Options.       (line   23)
* mbigtable:                             SH Options.         (line   89)
* mbionic:                               GNU/Linux Options.  (line   17)
* mbit-align:                            RS/6000 and PowerPC Options.
                                                             (line  455)
* mbit-ops:                              CR16 Options.       (line   25)
* mbitfield:                             M680x0 Options.     (line  235)
* mbitops <1>:                           SH Options.         (line   93)
* mbitops:                               MeP Options.        (line   26)
* mblock-move-inline-limit:              RS/6000 and PowerPC Options.
                                                             (line  737)
* mbranch-cheap:                         PDP-11 Options.     (line   65)
* mbranch-cost <1>:                      MIPS Options.       (line  635)
* mbranch-cost <2>:                      AVR Options.        (line  150)
* mbranch-cost:                          Adapteva Epiphany Options.
                                                             (line   18)
* mbranch-cost=NUM:                      SH Options.         (line  396)
* mbranch-cost=NUMBER:                   M32R/D Options.     (line   82)
* mbranch-expensive:                     PDP-11 Options.     (line   61)
* mbranch-hints:                         SPU Options.        (line   27)
* mbranch-likely:                        MIPS Options.       (line  642)
* mbranch-predict:                       MMIX Options.       (line   49)
* mbss-plt:                              RS/6000 and PowerPC Options.
                                                             (line  187)
* mbuild-constants:                      DEC Alpha Options.  (line  141)
* mbwx:                                  DEC Alpha Options.  (line  163)
* mc68000:                               M680x0 Options.     (line   95)
* mc68020:                               M680x0 Options.     (line  109)
* mc=:                                   MeP Options.        (line   31)
* mcache-size:                           SPU Options.        (line   70)
* mcall-eabi:                            RS/6000 and PowerPC Options.
                                                             (line  578)
* mcall-freebsd:                         RS/6000 and PowerPC Options.
                                                             (line  592)
* mcall-linux:                           RS/6000 and PowerPC Options.
                                                             (line  588)
* mcall-netbsd:                          RS/6000 and PowerPC Options.
                                                             (line  596)
* mcall-prologues:                       AVR Options.        (line  155)
* mcall-sysv:                            RS/6000 and PowerPC Options.
                                                             (line  570)
* mcall-sysv-eabi:                       RS/6000 and PowerPC Options.
                                                             (line  578)
* mcall-sysv-noeabi:                     RS/6000 and PowerPC Options.
                                                             (line  581)
* mcallee-super-interworking:            ARM Options.        (line  274)
* mcaller-super-interworking:            ARM Options.        (line  281)
* mcallgraph-data:                       MCore Options.      (line   31)
* mcbcond:                               SPARC Options.      (line  224)
* mcbranchdi:                            SH Options.         (line  411)
* mcc-init:                              CRIS Options.       (line   41)
* mcfv4e:                                M680x0 Options.     (line  172)
* mcheck-zero-division:                  MIPS Options.       (line  441)
* mcix:                                  DEC Alpha Options.  (line  163)
* mcld:                                  i386 and x86-64 Options.
                                                             (line  594)
* mclip:                                 MeP Options.        (line   35)
* mcmodel:                               SPARC Options.      (line  262)
* mcmodel=kernel:                        i386 and x86-64 Options.
                                                             (line  868)
* mcmodel=large <1>:                     TILE-Gx Options.    (line   14)
* mcmodel=large <2>:                     RS/6000 and PowerPC Options.
                                                             (line  128)
* mcmodel=large <3>:                     i386 and x86-64 Options.
                                                             (line  880)
* mcmodel=large:                         AArch64 Options.    (line   33)
* mcmodel=medium <1>:                    RS/6000 and PowerPC Options.
                                                             (line  124)
* mcmodel=medium:                        i386 and x86-64 Options.
                                                             (line  873)
* mcmodel=small <1>:                     TILE-Gx Options.    (line    9)
* mcmodel=small <2>:                     RS/6000 and PowerPC Options.
                                                             (line  120)
* mcmodel=small <3>:                     i386 and x86-64 Options.
                                                             (line  862)
* mcmodel=small:                         AArch64 Options.    (line   27)
* mcmodel=tiny:                          AArch64 Options.    (line   20)
* mcmove:                                Adapteva Epiphany Options.
                                                             (line   23)
* mcmpb:                                 RS/6000 and PowerPC Options.
                                                             (line   27)
* mcmpeqdi:                              SH Options.         (line  414)
* mcode-readable:                        MIPS Options.       (line  401)
* mcompat-align-parm:                    RS/6000 and PowerPC Options.
                                                             (line  895)
* mcond-exec:                            FRV Options.        (line  152)
* mcond-move:                            FRV Options.        (line  128)
* 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  157)
* mcoreb:                                Blackfin Options.   (line  164)
* mcpu <1>:                              TILEPro Options.    (line    9)
* mcpu <2>:                              TILE-Gx Options.    (line   18)
* mcpu <3>:                              SPARC Options.      (line  102)
* mcpu <4>:                              RS/6000 and PowerPC Options.
                                                             (line   69)
* mcpu <5>:                              picoChip Options.   (line    9)
* mcpu <6>:                              M680x0 Options.     (line   28)
* mcpu <7>:                              i386 and x86-64 Options.
                                                             (line  229)
* mcpu <8>:                              FRV Options.        (line  212)
* mcpu <9>:                              DEC Alpha Options.  (line  215)
* mcpu <10>:                             CRIS Options.       (line   10)
* mcpu <11>:                             ARM Options.        (line  132)
* mcpu:                                  AArch64 Options.    (line   69)
* mcpu32:                                M680x0 Options.     (line  138)
* mcpu= <1>:                             MicroBlaze Options. (line   20)
* mcpu= <2>:                             M32C Options.       (line    7)
* mcpu=:                                 Blackfin Options.   (line    7)
* mcr16c:                                CR16 Options.       (line   14)
* mcr16cplus:                            CR16 Options.       (line   14)
* mcrc32:                                i386 and x86-64 Options.
                                                             (line  641)
* mcrypto:                               RS/6000 and PowerPC Options.
                                                             (line  222)
* mcsync-anomaly:                        Blackfin Options.   (line   60)
* mcx16:                                 i386 and x86-64 Options.
                                                             (line  618)
* MD:                                    Preprocessor Options.
                                                             (line  274)
* mdalign:                               SH Options.         (line   80)
* mdata-align:                           CRIS Options.       (line   55)
* mdata-model:                           CR16 Options.       (line   28)
* mdc:                                   MeP Options.        (line   62)
* mdebug <1>:                            S/390 and zSeries Options.
                                                             (line  112)
* mdebug:                                M32R/D Options.     (line   69)
* mdebug-main=PREFIX:                    VMS Options.        (line   13)
* mdec-asm:                              PDP-11 Options.     (line   72)
* mdirect-move:                          RS/6000 and PowerPC Options.
                                                             (line  228)
* mdisable-callt:                        V850 Options.       (line   92)
* mdisable-fpregs:                       HPPA Options.       (line   33)
* mdisable-indexing:                     HPPA Options.       (line   39)
* mdiv <1>:                              MeP Options.        (line   65)
* mdiv <2>:                              MCore Options.      (line   15)
* mdiv:                                  M680x0 Options.     (line  209)
* mdiv=STRATEGY:                         SH Options.         (line  238)
* mdivide-breaks:                        MIPS Options.       (line  447)
* mdivide-enabled:                       LM32 Options.       (line   12)
* mdivide-traps:                         MIPS Options.       (line  447)
* mdivsi3_libfunc=NAME:                  SH Options.         (line  336)
* mdll:                                  i386 and x86-64 Windows Options.
                                                             (line   16)
* mdlmzb:                                RS/6000 and PowerPC Options.
                                                             (line  448)
* mdmx:                                  MIPS Options.       (line  290)
* mdouble:                               FRV Options.        (line   38)
* mdouble-float <1>:                     RS/6000 and PowerPC Options.
                                                             (line  371)
* mdouble-float:                         MIPS Options.       (line  248)
* mdsp:                                  MIPS Options.       (line  267)
* mdspr2:                                MIPS Options.       (line  273)
* mdual-nops:                            SPU Options.        (line   90)
* mdwarf2-asm:                           IA-64 Options.      (line   94)
* mdword:                                FRV Options.        (line   32)
* mdynamic-no-pic:                       RS/6000 and PowerPC Options.
                                                             (line  508)
* mea32:                                 SPU Options.        (line   55)
* mea64:                                 SPU Options.        (line   55)
* meabi:                                 RS/6000 and PowerPC Options.
                                                             (line  685)
* mearly-stop-bits:                      IA-64 Options.      (line  100)
* meb <1>:                               Score Options.      (line    9)
* meb <2>:                               Moxie Options.      (line    7)
* meb:                                   MeP Options.        (line   68)
* mel <1>:                               Score Options.      (line   12)
* mel <2>:                               Moxie Options.      (line   11)
* mel:                                   MeP Options.        (line   71)
* melf <1>:                              MMIX Options.       (line   44)
* melf:                                  CRIS Options.       (line   87)
* memb:                                  RS/6000 and PowerPC Options.
                                                             (line  680)
* membedded-data:                        MIPS Options.       (line  388)
* memregs=:                              M32C Options.       (line   21)
* mep:                                   V850 Options.       (line   16)
* mepsilon:                              MMIX Options.       (line   15)
* merror-reloc:                          SPU Options.        (line   10)
* mesa:                                  S/390 and zSeries Options.
                                                             (line   95)
* metrax100:                             CRIS Options.       (line   26)
* metrax4:                               CRIS Options.       (line   26)
* mexplicit-relocs <1>:                  MIPS Options.       (line  432)
* mexplicit-relocs:                      DEC Alpha Options.  (line  176)
* mexr:                                  H8/300 Options.     (line   28)
* mextern-sdata:                         MIPS Options.       (line  350)
* MF:                                    Preprocessor Options.
                                                             (line  220)
* mfast-fp:                              Blackfin Options.   (line  133)
* mfast-indirect-calls:                  HPPA Options.       (line   51)
* mfaster-structs:                       SPARC Options.      (line   92)
* mfdpic:                                FRV Options.        (line   56)
* mfentry:                               i386 and x86-64 Options.
                                                             (line  817)
* mfix:                                  DEC Alpha Options.  (line  163)
* mfix-24k:                              MIPS Options.       (line  500)
* mfix-and-continue:                     Darwin Options.     (line  104)
* mfix-at697f:                           SPARC Options.      (line  244)
* mfix-cortex-m3-ldrd:                   ARM Options.        (line  314)
* mfix-r10000:                           MIPS Options.       (line  527)
* mfix-r4000:                            MIPS Options.       (line  506)
* mfix-r4400:                            MIPS Options.       (line  520)
* mfix-sb1:                              MIPS Options.       (line  559)
* mfix-ut699:                            SPARC Options.      (line  249)
* mfix-vr4120:                           MIPS Options.       (line  538)
* mfix-vr4130:                           MIPS Options.       (line  552)
* mfixed-cc:                             FRV Options.        (line   28)
* mfixed-range <1>:                      SPU Options.        (line   47)
* mfixed-range <2>:                      SH Options.         (line  343)
* mfixed-range <3>:                      IA-64 Options.      (line  105)
* mfixed-range:                          HPPA Options.       (line   58)
* mflat:                                 SPARC Options.      (line   22)
* mflip-mips16:                          MIPS Options.       (line  111)
* mfloat-abi:                            ARM Options.        (line   42)
* mfloat-gprs:                           RS/6000 and PowerPC Options.
                                                             (line  259)
* 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  626)
* mflush-func=NAME:                      M32R/D Options.     (line   93)
* mflush-trap=NUMBER:                    M32R/D Options.     (line   86)
* mfmaf:                                 SPARC Options.      (line  238)
* mfmovd:                                SH Options.         (line   96)
* mforce-no-pic:                         Xtensa Options.     (line   41)
* mfp-exceptions:                        MIPS Options.       (line  653)
* mfp-mode:                              Adapteva Epiphany Options.
                                                             (line   72)
* 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  172)
* mfp32:                                 MIPS Options.       (line  221)
* mfp64:                                 MIPS Options.       (line  224)
* mfpmath <1>:                           i386 and x86-64 Options.
                                                             (line  232)
* mfpmath:                               Optimize Options.   (line 1899)
* mfpr-32:                               FRV Options.        (line   13)
* mfpr-64:                               FRV Options.        (line   16)
* mfprnd:                                RS/6000 and PowerPC Options.
                                                             (line   27)
* mfpu <1>:                              SPARC Options.      (line   35)
* mfpu <2>:                              RS/6000 and PowerPC Options.
                                                             (line  379)
* mfpu <3>:                              PDP-11 Options.     (line    9)
* mfpu:                                  ARM Options.        (line  152)
* mfriz:                                 RS/6000 and PowerPC Options.
                                                             (line  866)
* mfsca:                                 SH Options.         (line  428)
* mfsrra:                                SH Options.         (line  437)
* mfull-toc:                             RS/6000 and PowerPC Options.
                                                             (line  287)
* mfused-madd <1>:                       Xtensa Options.     (line   19)
* mfused-madd <2>:                       SH Options.         (line  419)
* mfused-madd <3>:                       S/390 and zSeries Options.
                                                             (line  137)
* mfused-madd <4>:                       RS/6000 and PowerPC Options.
                                                             (line  432)
* mfused-madd <5>:                       MIPS Options.       (line  482)
* mfused-madd:                           IA-64 Options.      (line   88)
* mg:                                    VAX Options.        (line   17)
* MG:                                    Preprocessor Options.
                                                             (line  229)
* mgas:                                  HPPA Options.       (line   74)
* mgcc-abi:                              V850 Options.       (line  148)
* mgen-cell-microcode:                   RS/6000 and PowerPC Options.
                                                             (line  175)
* mgeneral-regs-only:                    AArch64 Options.    (line   13)
* mgettrcost=NUMBER:                     SH Options.         (line  360)
* 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 <1>:                           IA-64 Options.      (line   23)
* mgnu-ld:                               HPPA Options.       (line  110)
* mgotplt:                               CRIS Options.       (line   81)
* mgp32:                                 MIPS Options.       (line  215)
* mgp64:                                 MIPS Options.       (line  218)
* mgpopt:                                MIPS Options.       (line  373)
* mgpr-32:                               FRV Options.        (line    7)
* mgpr-64:                               FRV Options.        (line   10)
* mgprel-ro:                             FRV Options.        (line   79)
* mh:                                    H8/300 Options.     (line   14)
* mhalf-reg-file:                        Adapteva Epiphany Options.
                                                             (line    9)
* mhard-dfp <1>:                         S/390 and zSeries Options.
                                                             (line   20)
* mhard-dfp:                             RS/6000 and PowerPC Options.
                                                             (line   27)
* mhard-float <1>:                       V850 Options.       (line  113)
* mhard-float <2>:                       SPARC Options.      (line   35)
* mhard-float <3>:                       S/390 and zSeries Options.
                                                             (line   11)
* mhard-float <4>:                       RS/6000 and PowerPC Options.
                                                             (line  365)
* mhard-float <5>:                       MIPS Options.       (line  227)
* mhard-float <6>:                       MicroBlaze Options. (line   10)
* mhard-float <7>:                       M680x0 Options.     (line  197)
* mhard-float:                           FRV Options.        (line   19)
* mhard-quad-float:                      SPARC Options.      (line   56)
* mhardlit:                              MCore Options.      (line   10)
* mhint-max-distance:                    SPU Options.        (line  102)
* mhint-max-nops:                        SPU Options.        (line   96)
* mhitachi:                              SH Options.         (line  100)
* mhotpatch:                             S/390 and zSeries Options.
                                                             (line  174)
* mhp-ld:                                HPPA Options.       (line  122)
* micplb:                                Blackfin Options.   (line  178)
* mid-shared-library:                    Blackfin Options.   (line   81)
* mieee <1>:                             SH Options.         (line  116)
* mieee:                                 DEC Alpha Options.  (line   39)
* mieee-conformant:                      DEC Alpha Options.  (line  134)
* mieee-fp:                              i386 and x86-64 Options.
                                                             (line  287)
* mieee-with-inexact:                    DEC Alpha Options.  (line   52)
* milp32:                                IA-64 Options.      (line  121)
* mimpure-text:                          Solaris 2 Options.  (line    9)
* mincoming-stack-boundary:              i386 and x86-64 Options.
                                                             (line  492)
* mindexed-addressing:                   SH Options.         (line  350)
* minline-all-stringops:                 i386 and x86-64 Options.
                                                             (line  765)
* 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 <1>:                       FRV Options.        (line   64)
* minline-plt:                           Blackfin Options.   (line  138)
* 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  772)
* minsert-sched-nops:                    RS/6000 and PowerPC Options.
                                                             (line  548)
* mint-register:                         RX Options.         (line  100)
* mint16:                                PDP-11 Options.     (line   40)
* mint32 <1>:                            PDP-11 Options.     (line   44)
* mint32 <2>:                            H8/300 Options.     (line   38)
* mint32:                                CR16 Options.       (line   22)
* mint8:                                 AVR Options.        (line  159)
* minterlink-mips16:                     MIPS Options.       (line  118)
* minvalid-symbols:                      SH Options.         (line  386)
* mio-volatile:                          MeP Options.        (line   74)
* mips1:                                 MIPS Options.       (line   78)
* mips16:                                MIPS Options.       (line  103)
* mips2:                                 MIPS Options.       (line   81)
* mips3:                                 MIPS Options.       (line   84)
* mips32:                                MIPS Options.       (line   90)
* mips32r2:                              MIPS Options.       (line   93)
* mips3d:                                MIPS Options.       (line  296)
* mips4:                                 MIPS Options.       (line   87)
* mips64:                                MIPS Options.       (line   96)
* mips64r2:                              MIPS Options.       (line   99)
* misel:                                 RS/6000 and PowerPC Options.
                                                             (line  193)
* misize:                                SH Options.         (line  137)
* missue-rate=NUMBER:                    M32R/D Options.     (line   79)
* mivc2:                                 MeP Options.        (line   59)
* mjump-in-delay:                        HPPA Options.       (line   28)
* mkernel:                               Darwin Options.     (line   82)
* mknuthdiv:                             MMIX Options.       (line   33)
* ml <1>:                                SH Options.         (line   77)
* ml:                                    MeP Options.        (line   78)
* mlarge-data:                           DEC Alpha Options.  (line  187)
* mlarge-data-threshold:                 i386 and x86-64 Options.
                                                             (line  378)
* mlarge-mem:                            SPU Options.        (line   35)
* mlarge-text:                           DEC Alpha Options.  (line  205)
* mleadz:                                MeP Options.        (line   81)
* mleaf-id-shared-library:               Blackfin Options.   (line   92)
* mlibfuncs:                             MMIX Options.       (line   10)
* mlibrary-pic:                          FRV Options.        (line  110)
* mlinked-fp:                            FRV Options.        (line   94)
* mlinker-opt:                           HPPA Options.       (line   84)
* mlinux:                                CRIS Options.       (line   91)
* mlittle:                               RS/6000 and PowerPC Options.
                                                             (line  497)
* mlittle-endian <1>:                    RS/6000 and PowerPC Options.
                                                             (line  497)
* mlittle-endian <2>:                    MicroBlaze Options. (line   60)
* mlittle-endian <3>:                    MCore Options.      (line   39)
* mlittle-endian <4>:                    IA-64 Options.      (line   13)
* mlittle-endian <5>:                    C6X Options.        (line   16)
* mlittle-endian <6>:                    ARM Options.        (line   58)
* mlittle-endian:                        AArch64 Options.    (line   16)
* mlittle-endian-data:                   RX Options.         (line   42)
* mliw:                                  MN10300 Options.    (line   54)
* mllsc:                                 MIPS Options.       (line  253)
* mlocal-sdata:                          MIPS Options.       (line  338)
* mlong-calls <1>:                       V850 Options.       (line   10)
* mlong-calls <2>:                       MIPS Options.       (line  468)
* mlong-calls <3>:                       FRV Options.        (line   99)
* mlong-calls <4>:                       Blackfin Options.   (line  121)
* mlong-calls <5>:                       ARM Options.        (line  197)
* mlong-calls:                           Adapteva Epiphany Options.
                                                             (line   55)
* mlong-double-128:                      S/390 and zSeries Options.
                                                             (line   29)
* mlong-double-64 <1>:                   S/390 and zSeries Options.
                                                             (line   29)
* mlong-double-64:                       i386 and x86-64 Options.
                                                             (line  367)
* mlong-double-80:                       i386 and x86-64 Options.
                                                             (line  367)
* mlong-jumps:                           V850 Options.       (line  108)
* mlong-load-store:                      HPPA Options.       (line   65)
* mlong32:                               MIPS Options.       (line  313)
* mlong64:                               MIPS Options.       (line  308)
* mlongcall:                             RS/6000 and PowerPC Options.
                                                             (line  757)
* mlongcalls:                            Xtensa Options.     (line   72)
* mloop:                                 V850 Options.       (line  121)
* mlow-64k:                              Blackfin Options.   (line   70)
* mlp64:                                 IA-64 Options.      (line  121)
* mm:                                    MeP Options.        (line   84)
* MM:                                    Preprocessor Options.
                                                             (line  210)
* mmac <1>:                              Score Options.      (line   21)
* mmac:                                  CR16 Options.       (line    9)
* mmad:                                  MIPS Options.       (line  477)
* mmalloc64:                             VMS Options.        (line   17)
* mmax:                                  DEC Alpha Options.  (line  163)
* mmax-constant-size:                    RX Options.         (line   82)
* mmax-stack-frame:                      CRIS Options.       (line   22)
* mmcount-ra-address:                    MIPS Options.       (line  702)
* mmcu <1>:                              MIPS Options.       (line  305)
* mmcu:                                  AVR Options.        (line    9)
* MMD:                                   Preprocessor Options.
                                                             (line  290)
* mmedia:                                FRV Options.        (line   44)
* mmemcpy <1>:                           MIPS Options.       (line  462)
* mmemcpy:                               MicroBlaze Options. (line   13)
* mmemory-latency:                       DEC Alpha Options.  (line  268)
* mmemory-model:                         SPARC Options.      (line  290)
* mmfcrf:                                RS/6000 and PowerPC Options.
                                                             (line   27)
* mmfpgpr:                               RS/6000 and PowerPC Options.
                                                             (line   27)
* mminimal-toc:                          RS/6000 and PowerPC Options.
                                                             (line  287)
* mminmax:                               MeP Options.        (line   87)
* mmmx:                                  i386 and x86-64 Options.
                                                             (line  571)
* 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  637)
* mmt:                                   MIPS Options.       (line  301)
* mmul:                                  RL78 Options.       (line   13)
* mmul-bug-workaround:                   CRIS Options.       (line   31)
* mmuladd:                               FRV Options.        (line   50)
* mmulhw:                                RS/6000 and PowerPC Options.
                                                             (line  441)
* mmult:                                 MeP Options.        (line   90)
* mmult-bug:                             MN10300 Options.    (line    9)
* mmulti-cond-exec:                      FRV Options.        (line  176)
* mmulticore:                            Blackfin Options.   (line  142)
* mmultiple:                             RS/6000 and PowerPC Options.
                                                             (line  391)
* mmvcle:                                S/390 and zSeries Options.
                                                             (line  105)
* mmvme:                                 RS/6000 and PowerPC Options.
                                                             (line  661)
* mn:                                    H8/300 Options.     (line   20)
* mneon-for-64bits:                      ARM Options.        (line  334)
* mnested-cond-exec:                     FRV Options.        (line  189)
* mnhwloop:                              Score Options.      (line   15)
* mno-3dnow:                             i386 and x86-64 Options.
                                                             (line  571)
* mno-4byte-functions:                   MCore Options.      (line   27)
* mno-8byte-align:                       V850 Options.       (line  170)
* mno-abicalls:                          MIPS Options.       (line  155)
* mno-abshi:                             PDP-11 Options.     (line   58)
* mno-ac0:                               PDP-11 Options.     (line   20)
* mno-address-space-conversion:          SPU Options.        (line   63)
* mno-align-double:                      i386 and x86-64 Options.
                                                             (line  326)
* mno-align-int:                         M680x0 Options.     (line  267)
* mno-align-loops:                       M32R/D Options.     (line   76)
* mno-align-stringops:                   i386 and x86-64 Options.
                                                             (line  760)
* mno-altivec:                           RS/6000 and PowerPC Options.
                                                             (line  134)
* mno-am33:                              MN10300 Options.    (line   20)
* mno-app-regs <1>:                      V850 Options.       (line  185)
* mno-app-regs:                          SPARC Options.      (line   10)
* mno-as100-syntax:                      RX Options.         (line   76)
* mno-atomic-updates:                    SPU Options.        (line   78)
* mno-avoid-indexed-addresses:           RS/6000 and PowerPC Options.
                                                             (line  423)
* mno-backchain:                         S/390 and zSeries Options.
                                                             (line   35)
* mno-base-addresses:                    MMIX Options.       (line   54)
* mno-bit-align:                         RS/6000 and PowerPC Options.
                                                             (line  455)
* mno-bitfield:                          M680x0 Options.     (line  231)
* mno-branch-likely:                     MIPS Options.       (line  642)
* mno-branch-predict:                    MMIX Options.       (line   49)
* mno-bwx:                               DEC Alpha Options.  (line  163)
* mno-callgraph-data:                    MCore Options.      (line   31)
* mno-cbcond:                            SPARC Options.      (line  224)
* mno-check-zero-division:               MIPS Options.       (line  441)
* mno-cix:                               DEC Alpha Options.  (line  163)
* mno-clearbss:                          MicroBlaze Options. (line   16)
* mno-cmpb:                              RS/6000 and PowerPC Options.
                                                             (line   27)
* mno-cond-exec:                         FRV Options.        (line  158)
* mno-cond-move:                         FRV Options.        (line  134)
* mno-const-align:                       CRIS Options.       (line   55)
* mno-const16:                           Xtensa Options.     (line   10)
* mno-crt0 <1>:                          Moxie Options.      (line   14)
* mno-crt0:                              MN10300 Options.    (line   43)
* mno-crypto:                            RS/6000 and PowerPC Options.
                                                             (line  222)
* mno-csync-anomaly:                     Blackfin Options.   (line   66)
* mno-data-align:                        CRIS Options.       (line   55)
* mno-debug:                             S/390 and zSeries Options.
                                                             (line  112)
* mno-direct-move:                       RS/6000 and PowerPC Options.
                                                             (line  228)
* mno-disable-callt:                     V850 Options.       (line   92)
* mno-div <1>:                           MCore Options.      (line   15)
* mno-div:                               M680x0 Options.     (line  209)
* mno-dlmzb:                             RS/6000 and PowerPC Options.
                                                             (line  448)
* mno-double:                            FRV Options.        (line   41)
* mno-dsp:                               MIPS Options.       (line  267)
* mno-dspr2:                             MIPS Options.       (line  273)
* mno-dwarf2-asm:                        IA-64 Options.      (line   94)
* mno-dword:                             FRV Options.        (line   35)
* mno-eabi:                              RS/6000 and PowerPC Options.
                                                             (line  685)
* mno-early-stop-bits:                   IA-64 Options.      (line  100)
* mno-eflags:                            FRV Options.        (line  125)
* mno-embedded-data:                     MIPS Options.       (line  388)
* mno-ep:                                V850 Options.       (line   16)
* mno-epsilon:                           MMIX Options.       (line   15)
* mno-explicit-relocs <1>:               MIPS Options.       (line  432)
* mno-explicit-relocs:                   DEC Alpha Options.  (line  176)
* mno-exr:                               H8/300 Options.     (line   33)
* mno-extern-sdata:                      MIPS Options.       (line  350)
* mno-fancy-math-387:                    i386 and x86-64 Options.
                                                             (line  315)
* mno-faster-structs:                    SPARC Options.      (line   92)
* mno-fix:                               DEC Alpha Options.  (line  163)
* mno-fix-24k:                           MIPS Options.       (line  500)
* mno-fix-r10000:                        MIPS Options.       (line  527)
* mno-fix-r4000:                         MIPS Options.       (line  506)
* mno-fix-r4400:                         MIPS Options.       (line  520)
* mno-flat:                              SPARC Options.      (line   22)
* mno-float:                             MIPS Options.       (line  234)
* 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  238)
* mno-fp-in-toc:                         RS/6000 and PowerPC Options.
                                                             (line  287)
* mno-fp-regs:                           DEC Alpha Options.  (line   25)
* mno-fp-ret-in-387:                     i386 and x86-64 Options.
                                                             (line  305)
* mno-fprnd:                             RS/6000 and PowerPC Options.
                                                             (line   27)
* mno-fpu:                               SPARC Options.      (line   40)
* mno-fsca:                              SH Options.         (line  428)
* mno-fsrra:                             SH Options.         (line  437)
* mno-fused-madd <1>:                    Xtensa Options.     (line   19)
* mno-fused-madd <2>:                    SH Options.         (line  419)
* mno-fused-madd <3>:                    S/390 and zSeries Options.
                                                             (line  137)
* mno-fused-madd <4>:                    RS/6000 and PowerPC Options.
                                                             (line  432)
* mno-fused-madd <5>:                    MIPS Options.       (line  482)
* mno-fused-madd:                        IA-64 Options.      (line   88)
* mno-gnu-as:                            IA-64 Options.      (line   18)
* mno-gnu-ld:                            IA-64 Options.      (line   23)
* mno-gotplt:                            CRIS Options.       (line   81)
* mno-gpopt:                             MIPS Options.       (line  373)
* mno-hard-dfp <1>:                      S/390 and zSeries Options.
                                                             (line   20)
* mno-hard-dfp:                          RS/6000 and PowerPC Options.
                                                             (line   27)
* mno-hardlit:                           MCore Options.      (line   10)
* mno-id-shared-library:                 Blackfin Options.   (line   88)
* mno-ieee-fp:                           i386 and x86-64 Options.
                                                             (line  287)
* 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-mips16:                  MIPS Options.       (line  118)
* mno-interrupts:                        AVR Options.        (line  165)
* mno-isel:                              RS/6000 and PowerPC Options.
                                                             (line  193)
* mno-knuthdiv:                          MMIX Options.       (line   33)
* mno-leaf-id-shared-library:            Blackfin Options.   (line   98)
* mno-libfuncs:                          MMIX Options.       (line   10)
* mno-llsc:                              MIPS Options.       (line  253)
* mno-local-sdata:                       MIPS Options.       (line  338)
* mno-long-calls <1>:                    V850 Options.       (line   10)
* mno-long-calls <2>:                    MIPS Options.       (line  468)
* mno-long-calls <3>:                    HPPA Options.       (line  135)
* mno-long-calls <4>:                    Blackfin Options.   (line  121)
* mno-long-calls:                        ARM Options.        (line  197)
* mno-long-jumps:                        V850 Options.       (line  108)
* mno-longcall:                          RS/6000 and PowerPC Options.
                                                             (line  757)
* mno-longcalls:                         Xtensa Options.     (line   72)
* mno-low-64k:                           Blackfin Options.   (line   74)
* mno-lsim <1>:                          MCore Options.      (line   46)
* mno-lsim:                              FR30 Options.       (line   14)
* mno-mad:                               MIPS Options.       (line  477)
* mno-max:                               DEC Alpha Options.  (line  163)
* mno-mcount-ra-address:                 MIPS Options.       (line  702)
* mno-mcu:                               MIPS Options.       (line  305)
* mno-mdmx:                              MIPS Options.       (line  290)
* mno-media:                             FRV Options.        (line   47)
* mno-memcpy:                            MIPS Options.       (line  462)
* mno-mfcrf:                             RS/6000 and PowerPC Options.
                                                             (line   27)
* mno-mfpgpr:                            RS/6000 and PowerPC Options.
                                                             (line   27)
* mno-mips16:                            MIPS Options.       (line  103)
* mno-mips3d:                            MIPS Options.       (line  296)
* mno-mmx:                               i386 and x86-64 Options.
                                                             (line  571)
* mno-mt:                                MIPS Options.       (line  301)
* mno-mul-bug-workaround:                CRIS Options.       (line   31)
* mno-muladd:                            FRV Options.        (line   53)
* mno-mulhw:                             RS/6000 and PowerPC Options.
                                                             (line  441)
* mno-mult-bug:                          MN10300 Options.    (line   13)
* mno-multi-cond-exec:                   FRV Options.        (line  183)
* mno-multiple:                          RS/6000 and PowerPC Options.
                                                             (line  391)
* mno-mvcle:                             S/390 and zSeries Options.
                                                             (line  105)
* mno-nested-cond-exec:                  FRV Options.        (line  195)
* mno-omit-leaf-frame-pointer:           AArch64 Options.    (line   43)
* mno-optimize-membar:                   FRV Options.        (line  205)
* mno-opts:                              MeP Options.        (line   93)
* mno-pack:                              FRV Options.        (line  122)
* mno-packed-stack:                      S/390 and zSeries Options.
                                                             (line   54)
* mno-paired:                            RS/6000 and PowerPC Options.
                                                             (line  207)
* mno-paired-single:                     MIPS Options.       (line  284)
* mno-pic:                               IA-64 Options.      (line   26)
* mno-pid:                               RX Options.         (line  117)
* mno-plt:                               MIPS Options.       (line  182)
* mno-popc:                              SPARC Options.      (line  231)
* mno-popcntb:                           RS/6000 and PowerPC Options.
                                                             (line   27)
* mno-popcntd:                           RS/6000 and PowerPC Options.
                                                             (line   27)
* mno-postinc:                           Adapteva Epiphany Options.
                                                             (line  110)
* mno-postmodify:                        Adapteva Epiphany Options.
                                                             (line  110)
* mno-power8-fusion:                     RS/6000 and PowerPC Options.
                                                             (line  234)
* mno-power8-vector:                     RS/6000 and PowerPC Options.
                                                             (line  240)
* 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  645)
* mno-push-args:                         i386 and x86-64 Options.
                                                             (line  737)
* mno-quad-memory:                       RS/6000 and PowerPC Options.
                                                             (line  247)
* mno-quad-memory-atomic:                RS/6000 and PowerPC Options.
                                                             (line  253)
* mno-red-zone:                          i386 and x86-64 Options.
                                                             (line  854)
* mno-register-names:                    IA-64 Options.      (line   37)
* mno-regnames:                          RS/6000 and PowerPC Options.
                                                             (line  751)
* mno-relax:                             V850 Options.       (line  103)
* mno-relax-immediate:                   MCore Options.      (line   19)
* mno-relocatable:                       RS/6000 and PowerPC Options.
                                                             (line  471)
* mno-relocatable-lib:                   RS/6000 and PowerPC Options.
                                                             (line  482)
* mno-round-nearest:                     Adapteva Epiphany Options.
                                                             (line   51)
* mno-rtd:                               M680x0 Options.     (line  262)
* mno-scc:                               FRV Options.        (line  146)
* 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 <1>:                         RS/6000 and PowerPC Options.
                                                             (line  732)
* mno-sdata:                             IA-64 Options.      (line   42)
* mno-sep-data:                          Blackfin Options.   (line  116)
* mno-serialize-volatile:                Xtensa Options.     (line   35)
* mno-short:                             M680x0 Options.     (line  226)
* mno-side-effects:                      CRIS Options.       (line   46)
* mno-sim:                               RX Options.         (line   71)
* mno-single-exit:                       MMIX Options.       (line   66)
* mno-slow-bytes:                        MCore Options.      (line   35)
* mno-small-exec:                        S/390 and zSeries Options.
                                                             (line   80)
* mno-smartmips:                         MIPS Options.       (line  280)
* mno-soft-cmpsf:                        Adapteva Epiphany Options.
                                                             (line   29)
* mno-soft-float:                        DEC Alpha Options.  (line   10)
* mno-space-regs:                        HPPA Options.       (line   44)
* mno-spe:                               RS/6000 and PowerPC Options.
                                                             (line  202)
* mno-specld-anomaly:                    Blackfin Options.   (line   56)
* mno-split-addresses:                   MIPS Options.       (line  426)
* mno-sse:                               i386 and x86-64 Options.
                                                             (line  571)
* mno-stack-align:                       CRIS Options.       (line   55)
* mno-stack-bias:                        SPARC Options.      (line  314)
* mno-strict-align <1>:                  RS/6000 and PowerPC Options.
                                                             (line  466)
* mno-strict-align:                      M680x0 Options.     (line  287)
* mno-string:                            RS/6000 and PowerPC Options.
                                                             (line  402)
* mno-sum-in-toc:                        RS/6000 and PowerPC Options.
                                                             (line  287)
* mno-sym32:                             MIPS Options.       (line  323)
* mno-target-align:                      Xtensa Options.     (line   59)
* mno-text-section-literals:             Xtensa Options.     (line   47)
* mno-tls-markers:                       RS/6000 and PowerPC Options.
                                                             (line  790)
* mno-toc:                               RS/6000 and PowerPC Options.
                                                             (line  491)
* mno-toplevel-symbols:                  MMIX Options.       (line   40)
* mno-tpf-trace:                         S/390 and zSeries Options.
                                                             (line  131)
* mno-unaligned-access:                  ARM Options.        (line  321)
* mno-unaligned-doubles:                 SPARC Options.      (line   74)
* mno-uninit-const-in-rodata:            MIPS Options.       (line  396)
* mno-update:                            RS/6000 and PowerPC Options.
                                                             (line  413)
* mno-user-mode:                         SPARC Options.      (line   86)
* mno-v8plus:                            SPARC Options.      (line  195)
* mno-vect-double:                       Adapteva Epiphany Options.
                                                             (line  116)
* mno-vis:                               SPARC Options.      (line  202)
* mno-vis2:                              SPARC Options.      (line  208)
* mno-vis3:                              SPARC Options.      (line  216)
* mno-vliw-branch:                       FRV Options.        (line  170)
* mno-volatile-asm-stop:                 IA-64 Options.      (line   32)
* mno-vrsave:                            RS/6000 and PowerPC Options.
                                                             (line  172)
* mno-vsx:                               RS/6000 and PowerPC Options.
                                                             (line  216)
* mno-warn-multiple-fast-interrupts:     RX Options.         (line  143)
* mno-wide-bitfields:                    MCore Options.      (line   23)
* mno-xgot <1>:                          MIPS Options.       (line  192)
* mno-xgot:                              M680x0 Options.     (line  319)
* mno-xl-compat:                         RS/6000 and PowerPC Options.
                                                             (line  322)
* mno-zdcbranch:                         SH Options.         (line  403)
* mno-zero-extend:                       MMIX Options.       (line   27)
* mnobitfield:                           M680x0 Options.     (line  231)
* 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)
* mnosetlb:                              MN10300 Options.    (line   69)
* mnosplit-lohi:                         Adapteva Epiphany Options.
                                                             (line  110)
* momit-leaf-frame-pointer <1>:          i386 and x86-64 Options.
                                                             (line  794)
* momit-leaf-frame-pointer <2>:          Blackfin Options.   (line   44)
* momit-leaf-frame-pointer:              AArch64 Options.    (line   43)
* mone-byte-bool:                        Darwin Options.     (line   90)
* moptimize-membar:                      FRV Options.        (line  201)
* 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  119)
* mpacked-stack:                         S/390 and zSeries Options.
                                                             (line   54)
* mpadstruct:                            SH Options.         (line  140)
* mpaired:                               RS/6000 and PowerPC Options.
                                                             (line  207)
* mpaired-single:                        MIPS Options.       (line  284)
* mpc32:                                 i386 and x86-64 Options.
                                                             (line  441)
* mpc64:                                 i386 and x86-64 Options.
                                                             (line  441)
* mpc80:                                 i386 and x86-64 Options.
                                                             (line  441)
* mpcrel:                                M680x0 Options.     (line  279)
* mpdebug:                               CRIS Options.       (line   35)
* mpe:                                   RS/6000 and PowerPC Options.
                                                             (line  342)
* mpe-aligned-commons:                   i386 and x86-64 Windows Options.
                                                             (line   59)
* mpic-register:                         ARM Options.        (line  227)
* mpid:                                  RX Options.         (line  117)
* mplt:                                  MIPS Options.       (line  182)
* mpointers-to-nested-functions:         RS/6000 and PowerPC Options.
                                                             (line  874)
* mpoke-function-name:                   ARM Options.        (line  234)
* mpopc:                                 SPARC Options.      (line  231)
* mpopcntb:                              RS/6000 and PowerPC Options.
                                                             (line   27)
* mpopcntd:                              RS/6000 and PowerPC Options.
                                                             (line   27)
* mportable-runtime:                     HPPA Options.       (line   70)
* mpower8-fusion:                        RS/6000 and PowerPC Options.
                                                             (line  234)
* mpower8-vector:                        RS/6000 and PowerPC Options.
                                                             (line  240)
* 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  614)
* mprefer-short-insn-regs:               Adapteva Epiphany Options.
                                                             (line   13)
* mprefergot:                            SH Options.         (line  225)
* mpreferred-stack-boundary:             i386 and x86-64 Options.
                                                             (line  471)
* mpretend-cmove:                        SH Options.         (line  446)
* mprioritize-restricted-insns:          RS/6000 and PowerPC Options.
                                                             (line  520)
* mprolog-function:                      V850 Options.       (line   23)
* mprologue-epilogue:                    CRIS Options.       (line   71)
* mprototype:                            RS/6000 and PowerPC Options.
                                                             (line  645)
* mpt-fixed:                             SH Options.         (line  364)
* mpush-args:                            i386 and x86-64 Options.
                                                             (line  737)
* MQ:                                    Preprocessor Options.
                                                             (line  265)
* mquad-memory:                          RS/6000 and PowerPC Options.
                                                             (line  247)
* mquad-memory-atomic:                   RS/6000 and PowerPC Options.
                                                             (line  253)
* mr10k-cache-barrier:                   MIPS Options.       (line  564)
* mrecip <1>:                            RS/6000 and PowerPC Options.
                                                             (line  802)
* mrecip:                                i386 and x86-64 Options.
                                                             (line  647)
* mrecip-precision:                      RS/6000 and PowerPC Options.
                                                             (line  838)
* mrecip=opt <1>:                        RS/6000 and PowerPC Options.
                                                             (line  815)
* mrecip=opt:                            i386 and x86-64 Options.
                                                             (line  669)
* mregister-names:                       IA-64 Options.      (line   37)
* mregnames:                             RS/6000 and PowerPC Options.
                                                             (line  751)
* mregparm:                              i386 and x86-64 Options.
                                                             (line  408)
* mrelax <1>:                            V850 Options.       (line  103)
* mrelax <2>:                            SH Options.         (line   85)
* mrelax <3>:                            RX Options.         (line   95)
* mrelax <4>:                            MN10300 Options.    (line   46)
* mrelax <5>:                            H8/300 Options.     (line    9)
* mrelax:                                AVR Options.        (line  169)
* mrelax-immediate:                      MCore Options.      (line   19)
* mrelax-pic-calls:                      MIPS Options.       (line  689)
* mrelocatable:                          RS/6000 and PowerPC Options.
                                                             (line  471)
* mrelocatable-lib:                      RS/6000 and PowerPC Options.
                                                             (line  482)
* mrepeat:                               MeP Options.        (line   96)
* mrestrict-it:                          ARM Options.        (line  339)
* mreturn-pointer-on-d0:                 MN10300 Options.    (line   36)
* mrh850-abi:                            V850 Options.       (line  127)
* mrtd <1>:                              Function Attributes.
                                                             (line  177)
* mrtd <2>:                              M680x0 Options.     (line  240)
* mrtd:                                  i386 and x86-64 Options.
                                                             (line  384)
* mrtp:                                  VxWorks Options.    (line   11)
* ms <1>:                                MeP Options.        (line  100)
* ms:                                    H8/300 Options.     (line   17)
* ms2600:                                H8/300 Options.     (line   24)
* msafe-dma:                             SPU Options.        (line   17)
* msafe-hints:                           SPU Options.        (line  107)
* msahf:                                 i386 and x86-64 Options.
                                                             (line  627)
* msatur:                                MeP Options.        (line  105)
* msave-acc-in-interrupts:               RX Options.         (line  109)
* msave-toc-indirect:                    RS/6000 and PowerPC Options.
                                                             (line  886)
* mscc:                                  FRV Options.        (line  140)
* 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  527)
* 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-stop-bits-after-every-cycle:    IA-64 Options.      (line  194)
* mschedule:                             HPPA Options.       (line   77)
* mscore5:                               Score Options.      (line   25)
* mscore5u:                              Score Options.      (line   28)
* mscore7:                               Score Options.      (line   31)
* mscore7d:                              Score Options.      (line   34)
* msda:                                  V850 Options.       (line   40)
* msdata <1>:                            RS/6000 and PowerPC Options.
                                                             (line  719)
* msdata:                                IA-64 Options.      (line   42)
* msdata=all:                            C6X Options.        (line   30)
* msdata=data:                           RS/6000 and PowerPC Options.
                                                             (line  724)
* msdata=default <1>:                    RS/6000 and PowerPC Options.
                                                             (line  719)
* msdata=default:                        C6X Options.        (line   22)
* msdata=eabi:                           RS/6000 and PowerPC Options.
                                                             (line  699)
* msdata=none <1>:                       RS/6000 and PowerPC Options.
                                                             (line  732)
* msdata=none <2>:                       M32R/D Options.     (line   40)
* msdata=none:                           C6X Options.        (line   35)
* msdata=sdata:                          M32R/D Options.     (line   49)
* msdata=sysv:                           RS/6000 and PowerPC Options.
                                                             (line  710)
* msdata=use:                            M32R/D Options.     (line   53)
* msdram <1>:                            MeP Options.        (line  110)
* msdram:                                Blackfin Options.   (line  172)
* msecure-plt:                           RS/6000 and PowerPC Options.
                                                             (line  182)
* msel-sched-dont-check-control-spec:    IA-64 Options.      (line  203)
* msep-data:                             Blackfin Options.   (line  110)
* mserialize-volatile:                   Xtensa Options.     (line   35)
* msetlb:                                MN10300 Options.    (line   64)
* mshared-library-id:                    Blackfin Options.   (line  103)
* mshort:                                M680x0 Options.     (line  220)
* msign-extend-enabled:                  LM32 Options.       (line   18)
* msim <1>:                              Xstormy16 Options.  (line    9)
* msim <2>:                              RX Options.         (line   71)
* msim <3>:                              RS/6000 and PowerPC Options.
                                                             (line  655)
* msim <4>:                              RL78 Options.       (line    7)
* msim <5>:                              MeP Options.        (line  114)
* msim <6>:                              M32C Options.       (line   13)
* msim <7>:                              CR16 Options.       (line   18)
* msim <8>:                              C6X Options.        (line   19)
* msim:                                  Blackfin Options.   (line   37)
* msimnovec:                             MeP Options.        (line  117)
* msimple-fpu:                           RS/6000 and PowerPC Options.
                                                             (line  375)
* msingle-exit:                          MMIX Options.       (line   66)
* msingle-float <1>:                     RS/6000 and PowerPC Options.
                                                             (line  371)
* msingle-float:                         MIPS Options.       (line  244)
* msingle-pic-base <1>:                  RS/6000 and PowerPC Options.
                                                             (line  514)
* msingle-pic-base:                      ARM Options.        (line  221)
* msio:                                  HPPA Options.       (line  104)
* mslow-bytes:                           MCore Options.      (line   35)
* 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   80)
* msmall-mem:                            SPU Options.        (line   35)
* msmall-model:                          FR30 Options.       (line    9)
* msmall-text:                           DEC Alpha Options.  (line  205)
* msmall16:                              Adapteva Epiphany Options.
                                                             (line   67)
* msmartmips:                            MIPS Options.       (line  280)
* msoft-float <1>:                       V850 Options.       (line  113)
* msoft-float <2>:                       SPARC Options.      (line   40)
* msoft-float <3>:                       S/390 and zSeries Options.
                                                             (line   11)
* msoft-float <4>:                       RS/6000 and PowerPC Options.
                                                             (line  365)
* msoft-float <5>:                       PDP-11 Options.     (line   13)
* msoft-float <6>:                       MIPS Options.       (line  230)
* msoft-float <7>:                       MicroBlaze Options. (line    7)
* msoft-float <8>:                       M680x0 Options.     (line  203)
* msoft-float <9>:                       i386 and x86-64 Options.
                                                             (line  292)
* msoft-float <10>:                      HPPA Options.       (line   90)
* msoft-float <11>:                      FRV Options.        (line   22)
* msoft-float:                           DEC Alpha Options.  (line   10)
* msoft-quad-float:                      SPARC Options.      (line   60)
* msp8:                                  AVR Options.        (line  183)
* mspace <1>:                            V850 Options.       (line   30)
* mspace:                                SH Options.         (line  222)
* mspe:                                  RS/6000 and PowerPC Options.
                                                             (line  202)
* mspecld-anomaly:                       Blackfin Options.   (line   51)
* msplit-addresses:                      MIPS Options.       (line  426)
* msplit-vecmove-early:                  Adapteva Epiphany Options.
                                                             (line  127)
* msse:                                  i386 and x86-64 Options.
                                                             (line  571)
* msse2avx:                              i386 and x86-64 Options.
                                                             (line  812)
* msseregparm:                           i386 and x86-64 Options.
                                                             (line  419)
* mstack-align:                          CRIS Options.       (line   55)
* mstack-bias:                           SPARC Options.      (line  314)
* mstack-check-l1:                       Blackfin Options.   (line   77)
* mstack-guard:                          S/390 and zSeries Options.
                                                             (line  156)
* mstack-increment:                      MCore Options.      (line   50)
* mstack-offset:                         Adapteva Epiphany Options.
                                                             (line   37)
* mstack-size:                           S/390 and zSeries Options.
                                                             (line  156)
* mstackrealign:                         i386 and x86-64 Options.
                                                             (line  462)
* mstdmain:                              SPU Options.        (line   40)
* mstrict-align <1>:                     RS/6000 and PowerPC Options.
                                                             (line  466)
* mstrict-align <2>:                     M680x0 Options.     (line  287)
* mstrict-align:                         AArch64 Options.    (line   38)
* mstrict-X:                             AVR Options.        (line  196)
* mstring:                               RS/6000 and PowerPC Options.
                                                             (line  402)
* mstringop-strategy=ALG:                i386 and x86-64 Options.
                                                             (line  776)
* mstructure-size-boundary:              ARM Options.        (line  178)
* msvr4-struct-return:                   RS/6000 and PowerPC Options.
                                                             (line  607)
* msym32:                                MIPS Options.       (line  323)
* msynci:                                MIPS Options.       (line  674)
* MT:                                    Preprocessor Options.
                                                             (line  251)
* mtarget-align:                         Xtensa Options.     (line   59)
* mtas:                                  SH Options.         (line  213)
* mtda:                                  V850 Options.       (line   34)
* 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  752)
* mthumb:                                ARM Options.        (line  256)
* mthumb-interwork:                      ARM Options.        (line   25)
* mtiny-stack:                           AVR Options.        (line  210)
* mtiny=:                                MeP Options.        (line  125)
* mtls:                                  FRV Options.        (line   75)
* mTLS:                                  FRV Options.        (line   72)
* mtls-dialect <1>:                      i386 and x86-64 Options.
                                                             (line  730)
* mtls-dialect:                          ARM Options.        (line  297)
* mtls-dialect=desc:                     AArch64 Options.    (line   47)
* mtls-dialect=traditional:              AArch64 Options.    (line   51)
* mtls-direct-seg-refs:                  i386 and x86-64 Options.
                                                             (line  802)
* mtls-markers:                          RS/6000 and PowerPC Options.
                                                             (line  790)
* mtls-size:                             IA-64 Options.      (line  112)
* mtoc:                                  RS/6000 and PowerPC Options.
                                                             (line  491)
* mtomcat-stats:                         FRV Options.        (line  209)
* mtoplevel-symbols:                     MMIX Options.       (line   40)
* mtp:                                   ARM Options.        (line  289)
* mtpcs-frame:                           ARM Options.        (line  262)
* mtpcs-leaf-frame:                      ARM Options.        (line  268)
* mtpf-trace:                            S/390 and zSeries Options.
                                                             (line  131)
* mtrap-precision:                       DEC Alpha Options.  (line  109)
* mtune <1>:                             SPARC Options.      (line  181)
* mtune <2>:                             S/390 and zSeries Options.
                                                             (line  124)
* mtune <3>:                             RS/6000 and PowerPC Options.
                                                             (line  112)
* mtune <4>:                             MN10300 Options.    (line   30)
* mtune <5>:                             MIPS Options.       (line   63)
* mtune <6>:                             M680x0 Options.     (line   70)
* mtune <7>:                             IA-64 Options.      (line  116)
* mtune <8>:                             i386 and x86-64 Options.
                                                             (line  195)
* mtune <9>:                             DEC Alpha Options.  (line  259)
* mtune <10>:                            CRIS Options.       (line   16)
* mtune <11>:                            ARM Options.        (line   97)
* mtune:                                 AArch64 Options.    (line   82)
* muclibc:                               GNU/Linux Options.  (line   13)
* muls:                                  Score Options.      (line   18)
* multcost=NUMBER:                       SH Options.         (line  235)
* multi_module:                          Darwin Options.     (line  196)
* multilib-library-pic:                  FRV Options.        (line   89)
* multiply-enabled:                      LM32 Options.       (line   15)
* multiply_defined:                      Darwin Options.     (line  196)
* multiply_defined_unused:               Darwin Options.     (line  196)
* munaligned-access:                     ARM Options.        (line  321)
* munaligned-doubles:                    SPARC Options.      (line   74)
* municode:                              i386 and x86-64 Windows Options.
                                                             (line   30)
* muninit-const-in-rodata:               MIPS Options.       (line  396)
* munix:                                 VAX Options.        (line    9)
* munix-asm:                             PDP-11 Options.     (line   68)
* munsafe-dma:                           SPU Options.        (line   17)
* mupdate:                               RS/6000 and PowerPC Options.
                                                             (line  413)
* muser-enabled:                         LM32 Options.       (line   21)
* muser-mode:                            SPARC Options.      (line   86)
* musermode:                             SH Options.         (line  230)
* 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  195)
* mveclibabi <1>:                        RS/6000 and PowerPC Options.
                                                             (line  847)
* mveclibabi:                            i386 and x86-64 Options.
                                                             (line  698)
* mvect8-ret-in-mem:                     i386 and x86-64 Options.
                                                             (line  429)
* mvis:                                  SPARC Options.      (line  202)
* mvis2:                                 SPARC Options.      (line  208)
* mvis3:                                 SPARC Options.      (line  216)
* mvliw-branch:                          FRV Options.        (line  164)
* mvms-return-codes:                     VMS Options.        (line    9)
* mvolatile-asm-stop:                    IA-64 Options.      (line   32)
* mvr4130-align:                         MIPS Options.       (line  663)
* mvrsave:                               RS/6000 and PowerPC Options.
                                                             (line  172)
* mvsx:                                  RS/6000 and PowerPC Options.
                                                             (line  216)
* mvxworks:                              RS/6000 and PowerPC Options.
                                                             (line  676)
* mvzeroupper:                           i386 and x86-64 Options.
                                                             (line  608)
* mwarn-cell-microcode:                  RS/6000 and PowerPC Options.
                                                             (line  178)
* mwarn-dynamicstack:                    S/390 and zSeries Options.
                                                             (line  150)
* mwarn-framesize:                       S/390 and zSeries Options.
                                                             (line  142)
* 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  308)
* mwords-little-endian:                  ARM Options.        (line   66)
* mx32:                                  i386 and x86-64 Options.
                                                             (line  841)
* mxgot <1>:                             MIPS Options.       (line  192)
* mxgot:                                 M680x0 Options.     (line  319)
* mxilinx-fpu:                           RS/6000 and PowerPC Options.
                                                             (line  386)
* mxl-barrel-shift:                      MicroBlaze Options. (line   33)
* mxl-compat:                            RS/6000 and PowerPC Options.
                                                             (line  322)
* 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)
* myellowknife:                          RS/6000 and PowerPC Options.
                                                             (line  671)
* mzarch:                                S/390 and zSeries Options.
                                                             (line   95)
* mzda:                                  V850 Options.       (line   45)
* mzdcbranch:                            SH Options.         (line  403)
* mzero-extend:                          MMIX Options.       (line   27)
* no-canonical-prefixes:                 Overall Options.    (line  334)
* no-integrated-cpp:                     Preprocessor Options.
                                                             (line   34)
* no-sysroot-suffix:                     Directory Options.  (line  112)
* no_dead_strip_inits_and_terms:         Darwin Options.     (line  196)
* noall_load:                            Darwin Options.     (line  196)
* nocpp:                                 MIPS Options.       (line  494)
* nodefaultlibs:                         Link Options.       (line   62)
* nofixprebinding:                       Darwin Options.     (line  196)
* nofpu:                                 RX Options.         (line   17)
* nolibdld:                              HPPA Options.       (line  187)
* 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  399)
* nostdinc++ <1>:                        Preprocessor Options.
                                                             (line  404)
* nostdinc++:                            C++ Dialect Options.
                                                             (line  348)
* nostdlib:                              Link Options.       (line   74)
* o:                                     Preprocessor Options.
                                                             (line   87)
* O:                                     Optimize Options.   (line   39)
* o:                                     Overall Options.    (line  192)
* O0:                                    Optimize Options.   (line  128)
* O1:                                    Optimize Options.   (line   39)
* O2:                                    Optimize Options.   (line   83)
* O3:                                    Optimize Options.   (line  121)
* Ofast:                                 Optimize Options.   (line  142)
* Og:                                    Optimize Options.   (line  149)
* Os:                                    Optimize Options.   (line  132)
* P:                                     Preprocessor Options.
                                                             (line  649)
* p:                                     Debugging Options.  (line  328)
* pagezero_size:                         Darwin Options.     (line  196)
* param:                                 Optimize Options.   (line 2241)
* pass-exit-codes:                       Overall Options.    (line  150)
* pedantic <1>:                          Warnings and Errors.
                                                             (line   25)
* pedantic <2>:                          Alternate Keywords. (line   30)
* pedantic <3>:                          C Extensions.       (line    6)
* pedantic <4>:                          Preprocessor Options.
                                                             (line  175)
* pedantic <5>:                          Warning Options.    (line   73)
* pedantic:                              Standards.          (line   16)
* pedantic-errors <1>:                   Warnings and Errors.
                                                             (line   25)
* pedantic-errors <2>:                   Non-bugs.           (line  216)
* pedantic-errors <3>:                   Preprocessor Options.
                                                             (line  180)
* pedantic-errors <4>:                   Warning Options.    (line  115)
* pedantic-errors:                       Standards.          (line   16)
* pg:                                    Debugging Options.  (line  334)
* 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 1313)
* print-libgcc-file-name:                Debugging Options.  (line 1347)
* print-multi-directory:                 Debugging Options.  (line 1319)
* print-multi-lib:                       Debugging Options.  (line 1324)
* print-multi-os-directory:              Debugging Options.  (line 1331)
* print-multiarch:                       Debugging Options.  (line 1340)
* print-objc-runtime-info:               Objective-C and Objective-C++ Dialect Options.
                                                             (line  203)
* print-prog-name:                       Debugging Options.  (line 1344)
* print-search-dirs:                     Debugging Options.  (line 1355)
* print-sysroot:                         Debugging Options.  (line 1368)
* print-sysroot-headers-suffix:          Debugging Options.  (line 1375)
* private_bundle:                        Darwin Options.     (line  196)
* pthread <1>:                           Solaris 2 Options.  (line   31)
* pthread:                               RS/6000 and PowerPC Options.
                                                             (line  797)
* pthreads:                              Solaris 2 Options.  (line   25)
* Q:                                     Debugging Options.  (line  340)
* 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  697)
* s:                                     Link Options.       (line  112)
* S <1>:                                 Link Options.       (line   20)
* S:                                     Overall Options.    (line  175)
* save-temps:                            Debugging Options.  (line 1222)
* save-temps=obj:                        Debugging Options.  (line 1248)
* sectalign:                             Darwin Options.     (line  196)
* sectcreate:                            Darwin Options.     (line  196)
* sectobjectsymbols:                     Darwin Options.     (line  196)
* sectorder:                             Darwin Options.     (line  196)
* seg1addr:                              Darwin Options.     (line  196)
* seg_addr_table:                        Darwin Options.     (line  196)
* seg_addr_table_filename:               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_write_addr:                  Darwin Options.     (line  196)
* shared:                                Link Options.       (line  121)
* shared-libgcc:                         Link Options.       (line  129)
* 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   89)
* static <1>:                            HPPA Options.       (line  191)
* static <2>:                            Darwin Options.     (line  196)
* static:                                Link Options.       (line  116)
* static-libgcc:                         Link Options.       (line  129)
* std <1>:                               Non-bugs.           (line  107)
* std <2>:                               Other Builtins.     (line   22)
* std <3>:                               C Dialect Options.  (line   47)
* std:                                   Standards.          (line   16)
* std=:                                  Preprocessor Options.
                                                             (line  338)
* sub_library:                           Darwin Options.     (line  196)
* sub_umbrella:                          Darwin Options.     (line  196)
* symbolic:                              Link Options.       (line  193)
* sysroot:                               Directory Options.  (line   97)
* T:                                     Link Options.       (line  199)
* target-help <1>:                       Preprocessor Options.
                                                             (line  702)
* target-help:                           Overall Options.    (line  230)
* threads:                               HPPA Options.       (line  204)
* time:                                  Debugging Options.  (line 1263)
* tno-android-cc:                        GNU/Linux Options.  (line   31)
* tno-android-ld:                        GNU/Linux Options.  (line   35)
* traditional <1>:                       Incompatibilities.  (line    6)
* traditional:                           C Dialect Options.  (line  309)
* traditional-cpp <1>:                   Preprocessor Options.
                                                             (line  680)
* traditional-cpp:                       C Dialect Options.  (line  309)
* trigraphs <1>:                         Preprocessor Options.
                                                             (line  684)
* trigraphs:                             C Dialect Options.  (line  304)
* twolevel_namespace:                    Darwin Options.     (line  196)
* u:                                     Link Options.       (line  231)
* U:                                     Preprocessor Options.
                                                             (line   69)
* umbrella:                              Darwin Options.     (line  196)
* undef:                                 Preprocessor Options.
                                                             (line   73)
* undefined:                             Darwin Options.     (line  196)
* unexported_symbols_list:               Darwin Options.     (line  196)
* v <1>:                                 Preprocessor Options.
                                                             (line  706)
* v:                                     Overall Options.    (line  203)
* version <1>:                           Preprocessor Options.
                                                             (line  719)
* version:                               Overall Options.    (line  338)
* W:                                     Incompatibilities.  (line   64)
* w:                                     Preprocessor Options.
                                                             (line  171)
* W:                                     Warning Options.    (line  168)
* w:                                     Warning Options.    (line   25)
* Wa:                                    Assembler Options.  (line    9)
* Wabi:                                  C++ Dialect Options.
                                                             (line  362)
* Waddr-space-convert:                   AVR Options.        (line  213)
* Waddress:                              Warning Options.    (line 1177)
* Waggregate-return:                     Warning Options.    (line 1195)
* Waggressive-loop-optimizations:        Warning Options.    (line 1200)
* Wall <1>:                              Standard Libraries. (line    6)
* Wall <2>:                              Preprocessor Options.
                                                             (line   93)
* Wall:                                  Warning Options.    (line  119)
* Warray-bounds:                         Warning Options.    (line  833)
* Wassign-intercept:                     Objective-C and Objective-C++ Dialect Options.
                                                             (line  157)
* Wattributes:                           Warning Options.    (line 1205)
* Wbad-function-cast:                    Warning Options.    (line 1051)
* Wbuiltin-macro-redefined:              Warning Options.    (line 1211)
* Wcast-align:                           Warning Options.    (line 1082)
* Wcast-qual:                            Warning Options.    (line 1066)
* Wchar-subscripts:                      Warning Options.    (line  207)
* Wclobbered:                            Warning Options.    (line 1102)
* Wcomment <1>:                          Preprocessor Options.
                                                             (line  101)
* Wcomment:                              Warning Options.    (line  212)
* Wcomments:                             Preprocessor Options.
                                                             (line  101)
* Wconversion:                           Warning Options.    (line 1106)
* Wconversion-null:                      Warning Options.    (line 1124)
* Wctor-dtor-privacy:                    C++ Dialect Options.
                                                             (line  472)
* Wdeclaration-after-statement:          Warning Options.    (line  966)
* Wdelete-non-virtual-dtor:              C++ Dialect Options.
                                                             (line  479)
* Wdeprecated:                           Warning Options.    (line 1326)
* Wdeprecated-declarations:              Warning Options.    (line 1330)
* Wdisabled-optimization:                Warning Options.    (line 1486)
* Wdiv-by-zero:                          Warning Options.    (line  838)
* Wdouble-promotion:                     Warning Options.    (line  236)
* weak_reference_mismatches:             Darwin Options.     (line  196)
* Weffc++:                               C++ Dialect Options.
                                                             (line  558)
* Wempty-body:                           Warning Options.    (line 1135)
* Wendif-labels <1>:                     Preprocessor Options.
                                                             (line  148)
* Wendif-labels:                         Warning Options.    (line  976)
* Wenum-compare:                         Warning Options.    (line 1139)
* Werror <1>:                            Preprocessor Options.
                                                             (line  161)
* Werror:                                Warning Options.    (line   28)
* Werror=:                               Warning Options.    (line   31)
* Wextra:                                Warning Options.    (line  168)
* Wfatal-errors:                         Warning Options.    (line   48)
* Wfloat-equal:                          Warning Options.    (line  865)
* Wformat <1>:                           Function Attributes.
                                                             (line  419)
* Wformat:                               Warning Options.    (line  255)
* Wformat-contains-nul:                  Warning Options.    (line  292)
* Wformat-extra-args:                    Warning Options.    (line  296)
* Wformat-nonliteral <1>:                Function Attributes.
                                                             (line  485)
* Wformat-nonliteral:                    Warning Options.    (line  320)
* Wformat-security:                      Warning Options.    (line  325)
* Wformat-y2k:                           Warning Options.    (line  337)
* Wformat-zero-length:                   Warning Options.    (line  310)
* Wformat=:                              Warning Options.    (line  255)
* Wframe-larger-than:                    Warning Options.    (line  990)
* Wfree-nonheap-object:                  Warning Options.    (line  999)
* whatsloaded:                           Darwin Options.     (line  196)
* whyload:                               Darwin Options.     (line  196)
* Wignored-qualifiers:                   Warning Options.    (line  377)
* Wimplicit:                             Warning Options.    (line  373)
* Wimplicit-function-declaration:        Warning Options.    (line  367)
* Wimplicit-int:                         Warning Options.    (line  363)
* Winherited-variadic-ctor:              Warning Options.    (line 1396)
* Winit-self:                            Warning Options.    (line  348)
* Winline <1>:                           Inline.             (line   63)
* Winline:                               Warning Options.    (line 1401)
* Wint-to-pointer-cast:                  Warning Options.    (line 1428)
* Winvalid-offsetof:                     Warning Options.    (line 1414)
* Winvalid-pch:                          Warning Options.    (line 1437)
* Wjump-misses-init:                     Warning Options.    (line 1145)
* Wl:                                    Link Options.       (line  223)
* Wlarger-than-LEN:                      Warning Options.    (line  987)
* Wlarger-than=LEN:                      Warning Options.    (line  987)
* Wliteral-suffix:                       C++ Dialect Options.
                                                             (line  486)
* Wlogical-op:                           Warning Options.    (line 1190)
* Wlong-long:                            Warning Options.    (line 1441)
* Wmain:                                 Warning Options.    (line  388)
* Wmaybe-uninitialized:                  Warning Options.    (line  648)
* Wmissing-braces:                       Warning Options.    (line  395)
* Wmissing-declarations:                 Warning Options.    (line 1250)
* Wmissing-field-initializers:           Warning Options.    (line 1260)
* Wmissing-format-attribute:             Warning Options.    (line  812)
* Wmissing-include-dirs:                 Warning Options.    (line  406)
* Wmissing-parameter-type:               Warning Options.    (line 1232)
* Wmissing-prototypes:                   Warning Options.    (line 1240)
* Wmultichar:                            Warning Options.    (line 1278)
* Wnarrowing:                            C++ Dialect Options.
                                                             (line  507)
* Wnested-externs:                       Warning Options.    (line 1393)
* Wno-abi:                               C++ Dialect Options.
                                                             (line  362)
* Wno-address:                           Warning Options.    (line 1177)
* Wno-aggregate-return:                  Warning Options.    (line 1195)
* Wno-aggressive-loop-optimizations:     Warning Options.    (line 1200)
* Wno-all:                               Warning Options.    (line  119)
* Wno-array-bounds:                      Warning Options.    (line  833)
* Wno-assign-intercept:                  Objective-C and Objective-C++ Dialect Options.
                                                             (line  157)
* Wno-attributes:                        Warning Options.    (line 1205)
* Wno-bad-function-cast:                 Warning Options.    (line 1051)
* Wno-builtin-macro-redefined:           Warning Options.    (line 1211)
* Wno-cast-align:                        Warning Options.    (line 1082)
* Wno-cast-qual:                         Warning Options.    (line 1066)
* Wno-char-subscripts:                   Warning Options.    (line  207)
* Wno-clobbered:                         Warning Options.    (line 1102)
* Wno-comment:                           Warning Options.    (line  212)
* Wno-conversion:                        Warning Options.    (line 1106)
* Wno-conversion-null:                   Warning Options.    (line 1124)
* Wno-coverage-mismatch:                 Warning Options.    (line  217)
* Wno-ctor-dtor-privacy:                 C++ Dialect Options.
                                                             (line  472)
* Wno-declaration-after-statement:       Warning Options.    (line  966)
* Wno-delete-non-virtual-dtor:           C++ Dialect Options.
                                                             (line  479)
* Wno-deprecated:                        Warning Options.    (line 1326)
* Wno-deprecated-declarations:           Warning Options.    (line 1330)
* Wno-disabled-optimization:             Warning Options.    (line 1486)
* Wno-div-by-zero:                       Warning Options.    (line  838)
* Wno-double-promotion:                  Warning Options.    (line  236)
* Wno-effc++:                            C++ Dialect Options.
                                                             (line  558)
* Wno-empty-body:                        Warning Options.    (line 1135)
* Wno-endif-labels:                      Warning Options.    (line  976)
* Wno-enum-compare:                      Warning Options.    (line 1139)
* Wno-error:                             Warning Options.    (line   28)
* Wno-error=:                            Warning Options.    (line   31)
* Wno-extra:                             Warning Options.    (line  168)
* Wno-fatal-errors:                      Warning Options.    (line   48)
* Wno-float-equal:                       Warning Options.    (line  865)
* Wno-format:                            Warning Options.    (line  255)
* Wno-format-contains-nul:               Warning Options.    (line  292)
* Wno-format-extra-args:                 Warning Options.    (line  296)
* Wno-format-nonliteral:                 Warning Options.    (line  320)
* Wno-format-security:                   Warning Options.    (line  325)
* Wno-format-y2k:                        Warning Options.    (line  337)
* Wno-format-zero-length:                Warning Options.    (line  310)
* Wno-free-nonheap-object:               Warning Options.    (line  999)
* Wno-ignored-qualifiers:                Warning Options.    (line  377)
* Wno-implicit:                          Warning Options.    (line  373)
* Wno-implicit-function-declaration:     Warning Options.    (line  367)
* Wno-implicit-int:                      Warning Options.    (line  363)
* Wno-inherited-variadic-ctor:           Warning Options.    (line 1396)
* Wno-init-self:                         Warning Options.    (line  348)
* Wno-inline:                            Warning Options.    (line 1401)
* Wno-int-to-pointer-cast:               Warning Options.    (line 1428)
* Wno-invalid-offsetof:                  Warning Options.    (line 1414)
* Wno-invalid-pch:                       Warning Options.    (line 1437)
* Wno-jump-misses-init:                  Warning Options.    (line 1145)
* Wno-literal-suffix:                    C++ Dialect Options.
                                                             (line  486)
* Wno-logical-op:                        Warning Options.    (line 1190)
* Wno-long-long:                         Warning Options.    (line 1441)
* Wno-main:                              Warning Options.    (line  388)
* Wno-maybe-uninitialized:               Warning Options.    (line  648)
* Wno-missing-braces:                    Warning Options.    (line  395)
* Wno-missing-declarations:              Warning Options.    (line 1250)
* Wno-missing-field-initializers:        Warning Options.    (line 1260)
* Wno-missing-format-attribute:          Warning Options.    (line  812)
* Wno-missing-include-dirs:              Warning Options.    (line  406)
* Wno-missing-parameter-type:            Warning Options.    (line 1232)
* Wno-missing-prototypes:                Warning Options.    (line 1240)
* Wno-mudflap:                           Warning Options.    (line 1506)
* Wno-multichar:                         Warning Options.    (line 1278)
* Wno-narrowing:                         C++ Dialect Options.
                                                             (line  507)
* Wno-nested-externs:                    Warning Options.    (line 1393)
* Wno-noexcept:                          C++ Dialect Options.
                                                             (line  520)
* Wno-non-template-friend:               C++ Dialect Options.
                                                             (line  596)
* Wno-non-virtual-dtor:                  C++ Dialect Options.
                                                             (line  526)
* Wno-nonnull:                           Warning Options.    (line  341)
* Wno-old-style-cast:                    C++ Dialect Options.
                                                             (line  612)
* Wno-old-style-declaration:             Warning Options.    (line 1222)
* Wno-old-style-definition:              Warning Options.    (line 1228)
* Wno-overflow:                          Warning Options.    (line 1336)
* Wno-overlength-strings:                Warning Options.    (line 1510)
* Wno-overloaded-virtual:                C++ Dialect Options.
                                                             (line  618)
* Wno-override-init:                     Warning Options.    (line 1339)
* Wno-packed:                            Warning Options.    (line 1347)
* Wno-packed-bitfield-compat:            Warning Options.    (line 1364)
* Wno-padded:                            Warning Options.    (line 1381)
* Wno-parentheses:                       Warning Options.    (line  409)
* Wno-pedantic-ms-format:                Warning Options.    (line 1031)
* Wno-pmf-conversions <1>:               Bound member functions.
                                                             (line   35)
* Wno-pmf-conversions:                   C++ Dialect Options.
                                                             (line  637)
* Wno-pointer-arith:                     Warning Options.    (line 1037)
* Wno-pointer-sign:                      Warning Options.    (line 1495)
* Wno-pointer-to-int-cast:               Warning Options.    (line 1433)
* Wno-pragmas:                           Warning Options.    (line  698)
* Wno-protocol:                          Objective-C and Objective-C++ Dialect Options.
                                                             (line  161)
* Wno-redundant-decls:                   Warning Options.    (line 1388)
* Wno-reorder:                           C++ Dialect Options.
                                                             (line  533)
* Wno-return-local-addr:                 Warning Options.    (line  504)
* Wno-return-type:                       Warning Options.    (line  508)
* Wno-selector:                          Objective-C and Objective-C++ Dialect Options.
                                                             (line  171)
* Wno-sequence-point:                    Warning Options.    (line  458)
* Wno-shadow:                            Warning Options.    (line  980)
* Wno-sign-compare:                      Warning Options.    (line 1156)
* Wno-sign-conversion:                   Warning Options.    (line 1163)
* Wno-sign-promo:                        C++ Dialect Options.
                                                             (line  641)
* Wno-sizeof-pointer-memaccess:          Warning Options.    (line 1169)
* Wno-stack-protector:                   Warning Options.    (line 1501)
* Wno-strict-aliasing:                   Warning Options.    (line  703)
* Wno-strict-null-sentinel:              C++ Dialect Options.
                                                             (line  588)
* Wno-strict-overflow:                   Warning Options.    (line  743)
* Wno-strict-prototypes:                 Warning Options.    (line 1216)
* Wno-strict-selector-match:             Objective-C and Objective-C++ Dialect Options.
                                                             (line  183)
* Wno-suggest-attribute=:                Warning Options.    (line  793)
* Wno-suggest-attribute=const:           Warning Options.    (line  799)
* Wno-suggest-attribute=format:          Warning Options.    (line  812)
* Wno-suggest-attribute=noreturn:        Warning Options.    (line  799)
* Wno-suggest-attribute=pure:            Warning Options.    (line  799)
* Wno-switch:                            Warning Options.    (line  523)
* Wno-switch-default:                    Warning Options.    (line  531)
* Wno-switch-enum:                       Warning Options.    (line  534)
* Wno-sync-nand:                         Warning Options.    (line  543)
* Wno-system-headers:                    Warning Options.    (line  843)
* Wno-traditional:                       Warning Options.    (line  880)
* Wno-traditional-conversion:            Warning Options.    (line  958)
* Wno-trampolines:                       Warning Options.    (line  854)
* Wno-trigraphs:                         Warning Options.    (line  548)
* Wno-type-limits:                       Warning Options.    (line 1044)
* Wno-undeclared-selector:               Objective-C and Objective-C++ Dialect Options.
                                                             (line  191)
* Wno-undef:                             Warning Options.    (line  973)
* Wno-uninitialized:                     Warning Options.    (line  625)
* Wno-unknown-pragmas:                   Warning Options.    (line  691)
* Wno-unsafe-loop-optimizations:         Warning Options.    (line 1025)
* Wno-unused:                            Warning Options.    (line  618)
* Wno-unused-but-set-parameter:          Warning Options.    (line  553)
* Wno-unused-but-set-variable:           Warning Options.    (line  562)
* Wno-unused-function:                   Warning Options.    (line  572)
* Wno-unused-label:                      Warning Options.    (line  577)
* Wno-unused-parameter:                  Warning Options.    (line  588)
* Wno-unused-result:                     Warning Options.    (line  595)
* Wno-unused-value:                      Warning Options.    (line  608)
* Wno-unused-variable:                   Warning Options.    (line  600)
* Wno-useless-cast:                      Warning Options.    (line 1132)
* Wno-varargs:                           Warning Options.    (line 1452)
* Wno-variadic-macros:                   Warning Options.    (line 1446)
* Wno-vector-operation-performance:      Warning Options.    (line 1457)
* Wno-virtual-move-assign:               Warning Options.    (line 1467)
* Wno-vla:                               Warning Options.    (line 1476)
* Wno-volatile-register-var:             Warning Options.    (line 1480)
* Wno-write-strings:                     Warning Options.    (line 1088)
* Wno-zero-as-null-pointer-constant:     Warning Options.    (line 1128)
* Wnoexcept:                             C++ Dialect Options.
                                                             (line  520)
* Wnon-template-friend:                  C++ Dialect Options.
                                                             (line  596)
* Wnon-virtual-dtor:                     C++ Dialect Options.
                                                             (line  526)
* Wnonnull:                              Warning Options.    (line  341)
* Wnormalized=:                          Warning Options.    (line 1284)
* Wold-style-cast:                       C++ Dialect Options.
                                                             (line  612)
* Wold-style-declaration:                Warning Options.    (line 1222)
* Wold-style-definition:                 Warning Options.    (line 1228)
* Woverflow:                             Warning Options.    (line 1336)
* Woverlength-strings:                   Warning Options.    (line 1510)
* Woverloaded-virtual:                   C++ Dialect Options.
                                                             (line  618)
* Woverride-init:                        Warning Options.    (line 1339)
* Wp:                                    Preprocessor Options.
                                                             (line   14)
* Wpacked:                               Warning Options.    (line 1347)
* Wpacked-bitfield-compat:               Warning Options.    (line 1364)
* Wpadded:                               Warning Options.    (line 1381)
* Wparentheses:                          Warning Options.    (line  409)
* Wpedantic:                             Warning Options.    (line   73)
* Wpedantic-ms-format:                   Warning Options.    (line 1031)
* Wpmf-conversions:                      C++ Dialect Options.
                                                             (line  637)
* Wpointer-arith <1>:                    Pointer Arith.      (line   13)
* Wpointer-arith:                        Warning Options.    (line 1037)
* Wpointer-sign:                         Warning Options.    (line 1495)
* Wpointer-to-int-cast:                  Warning Options.    (line 1433)
* Wpragmas:                              Warning Options.    (line  698)
* Wprotocol:                             Objective-C and Objective-C++ Dialect Options.
                                                             (line  161)
* wrapper:                               Overall Options.    (line  341)
* Wredundant-decls:                      Warning Options.    (line 1388)
* Wreorder:                              C++ Dialect Options.
                                                             (line  533)
* Wreturn-local-addr:                    Warning Options.    (line  504)
* Wreturn-type:                          Warning Options.    (line  508)
* Wselector:                             Objective-C and Objective-C++ Dialect Options.
                                                             (line  171)
* Wsequence-point:                       Warning Options.    (line  458)
* Wshadow:                               Warning Options.    (line  980)
* Wsign-compare:                         Warning Options.    (line 1156)
* Wsign-conversion:                      Warning Options.    (line 1163)
* Wsign-promo:                           C++ Dialect Options.
                                                             (line  641)
* Wsizeof-pointer-memaccess:             Warning Options.    (line 1169)
* Wstack-protector:                      Warning Options.    (line 1501)
* Wstack-usage:                          Warning Options.    (line 1003)
* Wstrict-aliasing:                      Warning Options.    (line  703)
* Wstrict-aliasing=n:                    Warning Options.    (line  711)
* Wstrict-null-sentinel:                 C++ Dialect Options.
                                                             (line  588)
* Wstrict-overflow:                      Warning Options.    (line  743)
* Wstrict-prototypes:                    Warning Options.    (line 1216)
* Wstrict-selector-match:                Objective-C and Objective-C++ Dialect Options.
                                                             (line  183)
* Wsuggest-attribute=:                   Warning Options.    (line  793)
* Wsuggest-attribute=const:              Warning Options.    (line  799)
* Wsuggest-attribute=format:             Warning Options.    (line  812)
* Wsuggest-attribute=noreturn:           Warning Options.    (line  799)
* Wsuggest-attribute=pure:               Warning Options.    (line  799)
* Wswitch:                               Warning Options.    (line  523)
* Wswitch-default:                       Warning Options.    (line  531)
* Wswitch-enum:                          Warning Options.    (line  534)
* Wsync-nand:                            Warning Options.    (line  543)
* Wsystem-headers <1>:                   Preprocessor Options.
                                                             (line  165)
* Wsystem-headers:                       Warning Options.    (line  843)
* Wtraditional <1>:                      Preprocessor Options.
                                                             (line  118)
* Wtraditional:                          Warning Options.    (line  880)
* Wtraditional-conversion:               Warning Options.    (line  958)
* Wtrampolines:                          Warning Options.    (line  854)
* Wtrigraphs <1>:                        Preprocessor Options.
                                                             (line  106)
* Wtrigraphs:                            Warning Options.    (line  548)
* Wtype-limits:                          Warning Options.    (line 1044)
* Wundeclared-selector:                  Objective-C and Objective-C++ Dialect Options.
                                                             (line  191)
* Wundef <1>:                            Preprocessor Options.
                                                             (line  124)
* Wundef:                                Warning Options.    (line  973)
* Wuninitialized:                        Warning Options.    (line  625)
* Wunknown-pragmas:                      Warning Options.    (line  691)
* Wunsafe-loop-optimizations:            Warning Options.    (line 1025)
* Wunsuffixed-float-constants:           Warning Options.    (line 1525)
* Wunused:                               Warning Options.    (line  618)
* Wunused-but-set-parameter:             Warning Options.    (line  553)
* Wunused-but-set-variable:              Warning Options.    (line  562)
* Wunused-function:                      Warning Options.    (line  572)
* Wunused-label:                         Warning Options.    (line  577)
* Wunused-local-typedefs:                Warning Options.    (line  584)
* Wunused-macros:                        Preprocessor Options.
                                                             (line  129)
* Wunused-parameter:                     Warning Options.    (line  588)
* Wunused-result:                        Warning Options.    (line  595)
* Wunused-value:                         Warning Options.    (line  608)
* Wunused-variable:                      Warning Options.    (line  600)
* Wuseless-cast:                         Warning Options.    (line 1132)
* Wvarargs:                              Warning Options.    (line 1452)
* Wvariadic-macros:                      Warning Options.    (line 1446)
* Wvector-operation-performance:         Warning Options.    (line 1457)
* Wvirtual-move-assign:                  Warning Options.    (line 1467)
* Wvla:                                  Warning Options.    (line 1476)
* Wvolatile-register-var:                Warning Options.    (line 1480)
* Wwrite-strings:                        Warning Options.    (line 1088)
* Wzero-as-null-pointer-constant:        Warning Options.    (line 1128)
* x <1>:                                 Preprocessor Options.
                                                             (line  322)
* x:                                     Overall Options.    (line  126)
* Xassembler:                            Assembler Options.  (line   13)
* Xbind-lazy:                            VxWorks Options.    (line   26)
* Xbind-now:                             VxWorks Options.    (line   30)
* Xlinker:                               Link Options.       (line  205)
* 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
*************

 [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 1878)
* $:                                     Dollar Signs.       (line    6)
* % in constraint:                       Modifiers.          (line   45)
* %include:                              Spec Files.         (line   27)
* %include_noerr:                        Spec Files.         (line   31)
* %rename:                               Spec Files.         (line   35)
* & in constraint:                       Modifiers.          (line   25)
* ':                                     Incompatibilities.  (line  116)
* * in constraint:                       Modifiers.          (line   62)
* *__builtin_assume_aligned:             Other Builtins.     (line  339)
* + 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   92)
* -mcpu feature modifiers:               AArch64 Options.    (line   92)
* -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  743)
* //:                                    C++ Comments.       (line    6)
* 0 in constraint:                       Simple Constraints. (line  127)
* < in constraint:                       Simple Constraints. (line   48)
* = in constraint:                       Modifiers.          (line    8)
* > in constraint:                       Simple Constraints. (line   61)
* ? in constraint:                       Multi-Alternative.  (line   27)
* ?: extensions:                         Conditionals.       (line    6)
* ?: side effect:                        Conditionals.       (line   20)
* _ in variables in macros:              Typeof.             (line   46)
* __atomic_add_fetch:                    __atomic Builtins.  (line  169)
* __atomic_always_lock_free:             __atomic Builtins.  (line  247)
* __atomic_and_fetch:                    __atomic Builtins.  (line  173)
* __atomic_clear:                        __atomic Builtins.  (line  221)
* __atomic_compare_exchange:             __atomic Builtins.  (line  161)
* __atomic_compare_exchange_n:           __atomic Builtins.  (line  138)
* __atomic_exchange:                     __atomic Builtins.  (line  130)
* __atomic_exchange_n:                   __atomic Builtins.  (line  119)
* __atomic_fetch_add:                    __atomic Builtins.  (line  189)
* __atomic_fetch_and:                    __atomic Builtins.  (line  193)
* __atomic_fetch_nand:                   __atomic Builtins.  (line  199)
* __atomic_fetch_or:                     __atomic Builtins.  (line  197)
* __atomic_fetch_sub:                    __atomic Builtins.  (line  191)
* __atomic_fetch_xor:                    __atomic Builtins.  (line  195)
* __atomic_is_lock_free:                 __atomic Builtins.  (line  261)
* __atomic_load:                         __atomic Builtins.  (line   98)
* __atomic_load_n:                       __atomic Builtins.  (line   89)
* __atomic_nand_fetch:                   __atomic Builtins.  (line  179)
* __atomic_or_fetch:                     __atomic Builtins.  (line  177)
* __atomic_signal_fence:                 __atomic Builtins.  (line  239)
* __atomic_store:                        __atomic Builtins.  (line  113)
* __atomic_store_n:                      __atomic Builtins.  (line  104)
* __atomic_sub_fetch:                    __atomic Builtins.  (line  171)
* __atomic_test_and_set:                 __atomic Builtins.  (line  210)
* __atomic_thread_fence:                 __atomic Builtins.  (line  232)
* __atomic_xor_fetch:                    __atomic Builtins.  (line  175)
* __builtin___clear_cache:               Other Builtins.     (line  372)
* __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)
* __builtin_apply:                       Constructing Calls. (line   31)
* __builtin_apply_args:                  Constructing Calls. (line   20)
* __builtin_bswap16:                     Other Builtins.     (line  603)
* __builtin_bswap32:                     Other Builtins.     (line  607)
* __builtin_bswap64:                     Other Builtins.     (line  611)
* __builtin_choose_expr:                 Other Builtins.     (line  157)
* __builtin_clrsb:                       Other Builtins.     (line  532)
* __builtin_clrsbl:                      Other Builtins.     (line  555)
* __builtin_clrsbll:                     Other Builtins.     (line  578)
* __builtin_clz:                         Other Builtins.     (line  524)
* __builtin_clzl:                        Other Builtins.     (line  547)
* __builtin_clzll:                       Other Builtins.     (line  570)
* __builtin_complex:                     Other Builtins.     (line  197)
* __builtin_constant_p:                  Other Builtins.     (line  207)
* __builtin_cpu_init:                    X86 Built-in Functions.
                                                             (line   63)
* __builtin_cpu_is:                      X86 Built-in Functions.
                                                             (line   92)
* __builtin_cpu_supports:                X86 Built-in Functions.
                                                             (line  161)
* __builtin_ctz:                         Other Builtins.     (line  528)
* __builtin_ctzl:                        Other Builtins.     (line  551)
* __builtin_ctzll:                       Other Builtins.     (line  574)
* __builtin_expect:                      Other Builtins.     (line  257)
* __builtin_extract_return_addr:         Return Address.     (line   36)
* __builtin_ffs:                         Other Builtins.     (line  520)
* __builtin_ffsl:                        Other Builtins.     (line  543)
* __builtin_ffsll:                       Other Builtins.     (line  566)
* __builtin_FILE:                        Other Builtins.     (line  366)
* __builtin_fpclassify:                  Other Builtins.     (line    6)
* __builtin_frame_address:               Return Address.     (line   49)
* __builtin_frob_return_address:         Return Address.     (line   45)
* __builtin_FUNCTION:                    Other Builtins.     (line  361)
* __builtin_huge_val:                    Other Builtins.     (line  423)
* __builtin_huge_valf:                   Other Builtins.     (line  428)
* __builtin_huge_vall:                   Other Builtins.     (line  431)
* __builtin_huge_valq:                   X86 Built-in Functions.
                                                             (line   57)
* __builtin_inf:                         Other Builtins.     (line  446)
* __builtin_infd128:                     Other Builtins.     (line  456)
* __builtin_infd32:                      Other Builtins.     (line  450)
* __builtin_infd64:                      Other Builtins.     (line  453)
* __builtin_inff:                        Other Builtins.     (line  460)
* __builtin_infl:                        Other Builtins.     (line  465)
* __builtin_infq:                        X86 Built-in Functions.
                                                             (line   53)
* __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_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  356)
* __builtin_nan:                         Other Builtins.     (line  476)
* __builtin_nand128:                     Other Builtins.     (line  498)
* __builtin_nand32:                      Other Builtins.     (line  492)
* __builtin_nand64:                      Other Builtins.     (line  495)
* __builtin_nanf:                        Other Builtins.     (line  502)
* __builtin_nanl:                        Other Builtins.     (line  505)
* __builtin_nans:                        Other Builtins.     (line  509)
* __builtin_nansf:                       Other Builtins.     (line  513)
* __builtin_nansl:                       Other Builtins.     (line  516)
* __builtin_non_tx_store:                S/390 System z Built-in Functions.
                                                             (line  104)
* __builtin_object_size:                 Object Size Checking.
                                                             (line    6)
* __builtin_offsetof:                    Offsetof.           (line    6)
* __builtin_parity:                      Other Builtins.     (line  540)
* __builtin_parityl:                     Other Builtins.     (line  562)
* __builtin_parityll:                    Other Builtins.     (line  586)
* __builtin_popcount:                    Other Builtins.     (line  537)
* __builtin_popcountl:                   Other Builtins.     (line  558)
* __builtin_popcountll:                  Other Builtins.     (line  582)
* __builtin_powi:                        Other Builtins.     (line    6)
* __builtin_powif:                       Other Builtins.     (line    6)
* __builtin_powil:                       Other Builtins.     (line    6)
* __builtin_prefetch:                    Other Builtins.     (line  384)
* __builtin_return:                      Constructing Calls. (line   48)
* __builtin_return_address:              Return Address.     (line   11)
* __builtin_rx_brk:                      RX Built-in Functions.
                                                             (line   11)
* __builtin_rx_clrpsw:                   RX Built-in Functions.
                                                             (line   14)
* __builtin_rx_int:                      RX Built-in Functions.
                                                             (line   18)
* __builtin_rx_machi:                    RX Built-in Functions.
                                                             (line   22)
* __builtin_rx_maclo:                    RX Built-in Functions.
                                                             (line   27)
* __builtin_rx_mulhi:                    RX Built-in Functions.
                                                             (line   32)
* __builtin_rx_mullo:                    RX Built-in Functions.
                                                             (line   37)
* __builtin_rx_mvfachi:                  RX Built-in Functions.
                                                             (line   42)
* __builtin_rx_mvfacmi:                  RX Built-in Functions.
                                                             (line   46)
* __builtin_rx_mvfc:                     RX Built-in Functions.
                                                             (line   50)
* __builtin_rx_mvtachi:                  RX Built-in Functions.
                                                             (line   54)
* __builtin_rx_mvtaclo:                  RX Built-in Functions.
                                                             (line   58)
* __builtin_rx_mvtc:                     RX Built-in Functions.
                                                             (line   62)
* __builtin_rx_mvtipl:                   RX Built-in Functions.
                                                             (line   66)
* __builtin_rx_racw:                     RX Built-in Functions.
                                                             (line   70)
* __builtin_rx_revw:                     RX Built-in Functions.
                                                             (line   74)
* __builtin_rx_rmpa:                     RX Built-in Functions.
                                                             (line   79)
* __builtin_rx_round:                    RX Built-in Functions.
                                                             (line   83)
* __builtin_rx_sat:                      RX Built-in Functions.
                                                             (line   88)
* __builtin_rx_setpsw:                   RX Built-in Functions.
                                                             (line   92)
* __builtin_rx_wait:                     RX Built-in Functions.
                                                             (line   96)
* __builtin_set_thread_pointer:          SH Built-in Functions.
                                                             (line   10)
* __builtin_tabort:                      S/390 System z Built-in Functions.
                                                             (line   87)
* __builtin_tbegin:                      S/390 System z Built-in Functions.
                                                             (line    7)
* __builtin_tbegin_nofloat:              S/390 System z Built-in Functions.
                                                             (line   59)
* __builtin_tbegin_retry:                S/390 System z Built-in Functions.
                                                             (line   65)
* __builtin_tbegin_retry_nofloat:        S/390 System z Built-in Functions.
                                                             (line   72)
* __builtin_tbeginc:                     S/390 System z Built-in Functions.
                                                             (line   78)
* __builtin_tend:                        S/390 System z Built-in Functions.
                                                             (line   82)
* __builtin_thread_pointer:              SH Built-in Functions.
                                                             (line   20)
* __builtin_trap:                        Other Builtins.     (line  281)
* __builtin_tx_assist:                   S/390 System z Built-in Functions.
                                                             (line   92)
* __builtin_tx_nesting_depth:            S/390 System z Built-in Functions.
                                                             (line   98)
* __builtin_types_compatible_p:          Other Builtins.     (line  111)
* __builtin_unreachable:                 Other Builtins.     (line  288)
* __builtin_va_arg_pack:                 Constructing Calls. (line   53)
* __builtin_va_arg_pack_len:             Constructing Calls. (line   76)
* __complex__ keyword:                   Complex.            (line    6)
* __declspec(dllexport):                 Function Attributes.
                                                             (line  258)
* __declspec(dllimport):                 Function Attributes.
                                                             (line  293)
* __ea SPU Named Address Spaces:         Named Address Spaces.
                                                             (line  155)
* __extension__:                         Alternate Keywords. (line   30)
* __far M32C Named Address Spaces:       Named Address Spaces.
                                                             (line  139)
* __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)
* __func__ identifier:                   Function Names.     (line    6)
* __FUNCTION__ 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)
* _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   48)
* _Sat data type:                        Fixed-Point.        (line    6)
* _xabort:                               X86 transactional memory intrinsics.
                                                             (line   68)
* _xbegin:                               X86 transactional memory intrinsics.
                                                             (line   20)
* _xend:                                 X86 transactional memory intrinsics.
                                                             (line   59)
* _xtest:                                X86 transactional memory intrinsics.
                                                             (line   64)
* 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 <1>:               C++ Volatiles.      (line    6)
* accessing volatiles:                   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)
* additional floating types:             Floating Types.     (line    6)
* address constraints:                   Simple Constraints. (line  154)
* address of a label:                    Labels as Values.   (line    6)
* address_operand:                       Simple Constraints. (line  158)
* alias attribute:                       Function Attributes.
                                                             (line   37)
* aligned attribute <1>:                 Type Attributes.    (line   31)
* aligned attribute <2>:                 Variable Attributes.
                                                             (line   23)
* aligned attribute:                     Function Attributes.
                                                             (line   50)
* alignment:                             Alignment.          (line    6)
* alloc_size attribute:                  Function Attributes.
                                                             (line   70)
* alloca:                                Other Builtins.     (line    6)
* alloca vs variable-length arrays:      Variable Length.    (line   26)
* Allow nesting in an interrupt handler on the Blackfin processor.: Function Attributes.
                                                             (line  943)
* alternate keywords:                    Alternate Keywords. (line    6)
* always_inline function attribute:      Function Attributes.
                                                             (line   91)
* 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)
* ARM [Annotated C++ Reference Manual]:  Backwards Compatibility.
                                                             (line    6)
* ARM options:                           ARM Options.        (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  134)
* 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)
* 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  584)
* 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)
* bounds checking:                       Optimize Options.   (line  407)
* bug criteria:                          Bug Criteria.       (line    6)
* bugs:                                  Bugs.               (line    6)
* bugs, known:                           Trouble.            (line    6)
* built-in functions <1>:                Other Builtins.     (line    6)
* built-in functions:                    C Dialect Options.  (line  205)
* 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  307)
* 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)
* C_INCLUDE_PATH:                        Environment Variables.
                                                             (line  130)
* 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  893)
* calling functions through the function vector on H8/300, M16C, M32C and SH2A processors: Function Attributes.
                                                             (line  532)
* calloc:                                Other Builtins.     (line    6)
* 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 1284)
* 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 1166)
* cold label attribute:                  Function Attributes.
                                                             (line 1184)
* command options:                       Invoking GCC.       (line    6)
* comments, C++ style:                   C++ Comments.       (line    6)
* common attribute:                      Variable Attributes.
                                                             (line  105)
* comparison of signed and unsigned values, warning: Warning Options.
                                                             (line 1156)
* 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  183)
* constants in constraints:              Simple Constraints. (line   70)
* constraint modifier characters:        Modifiers.          (line    6)
* constraint, matching:                  Simple Constraints. (line  139)
* 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  211)
* 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  129)
* CPLUS_INCLUDE_PATH:                    Environment Variables.
                                                             (line  131)
* 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)
* 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)
* 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  157)
* dependencies, make:                    Preprocessor Options.
                                                             (line  185)
* DEPENDENCIES_OUTPUT:                   Environment Variables.
                                                             (line  156)
* dependent name lookup:                 Name lookup.        (line    6)
* deprecated attribute:                  Variable Attributes.
                                                             (line  114)
* deprecated attribute.:                 Function Attributes.
                                                             (line  233)
* designated initializers:               Designated Inits.   (line    6)
* designator lists:                      Designated Inits.   (line   94)
* designators:                           Designated Inits.   (line   61)
* destructor function attribute:         Function Attributes.
                                                             (line  211)
* 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  127)
* directory options:                     Directory Options.  (line    6)
* disinterrupt attribute:                Function Attributes.
                                                             (line  253)
* 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   89)
* earlyclobber operand:                  Modifiers.          (line   25)
* eight-bit data on the H8/300, H8/300H, and H8S: Function Attributes.
                                                             (line  346)
* EIND:                                  AVR Options.        (line  220)
* empty structures:                      Empty Structures.   (line    6)
* 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  153)
* error messages:                        Warnings and Errors.
                                                             (line    6)
* escaped newlines:                      Escaped Newlines.   (line    6)
* exception handler functions on the Blackfin processor: Function Attributes.
                                                             (line  356)
* 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  163)
* 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  362)
* F in constraint:                       Simple Constraints. (line   94)
* 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  146)
* 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 1874)
* 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 1226)
* format function attribute:             Function Attributes.
                                                             (line  419)
* format_arg function attribute:         Function Attributes.
                                                             (line  485)
* Fortran:                               G++ and GCC.        (line    6)
* forwarder_section attribute:           Function Attributes.
                                                             (line  685)
* 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  853)
* 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  920)
* function, size of pointer to:          Pointer Arith.      (line    6)
* functions called via pointer on the RS/6000 and PowerPC: Function Attributes.
                                                             (line  808)
* 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 behave like malloc:     Function Attributes.
                                                             (line    6)
* functions that do not handle memory bank switching on 68HC11/68HC12: Function Attributes.
                                                             (line  933)
* 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  177)
* functions that handle memory bank switching: Function Attributes.
                                                             (line  375)
* 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 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  120)
* G in constraint:                       Simple Constraints. (line   98)
* g++:                                   Invoking G++.       (line   14)
* G++:                                   G++ and GCC.        (line   30)
* gamma:                                 Other Builtins.     (line    6)
* gamma_r:                               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)
* GCC:                                   G++ and GCC.        (line    6)
* GCC command options:                   Invoking GCC.       (line    6)
* GCC_COMPARE_DEBUG:                     Environment Variables.
                                                             (line   52)
* GCC_EXEC_PREFIX:                       Environment Variables.
                                                             (line   57)
* gcc_struct:                            Type Attributes.    (line  324)
* gcc_struct attribute:                  Variable Attributes.
                                                             (line  445)
* gcov:                                  Debugging Options.  (line  411)
* gettext:                               Other Builtins.     (line    6)
* global offset table:                   Code Gen Options.   (line  280)
* 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   96)
* Go:                                    G++ and GCC.        (line    6)
* goto with computed label:              Labels as Values.   (line    6)
* gprof:                                 Debugging Options.  (line  333)
* grouping options:                      Invoking GCC.       (line   26)
* H in constraint:                       Simple Constraints. (line   98)
* half-precision floating point:         Half-Precision.     (line    6)
* hardware models and configurations, specifying: Submodel Options.
                                                             (line    6)
* hex floats:                            Hex Floats.         (line    6)
* HK fixed-suffix:                       Fixed-Point.        (line    6)
* hk fixed-suffix:                       Fixed-Point.        (line    6)
* hosted environment <1>:                C Dialect Options.  (line  239)
* hosted environment:                    Standards.          (line   13)
* hosted implementation:                 Standards.          (line   13)
* hot function attribute:                Function Attributes.
                                                             (line 1144)
* hot label attribute:                   Function Attributes.
                                                             (line 1156)
* hotpatch attribute:                    Function Attributes.
                                                             (line  912)
* 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   81)
* i in constraint:                       Simple Constraints. (line   70)
* 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  593)
* 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 ARM:                 Function Attributes.
                                                             (line  798)
* indirect calls on MIPS:                Function Attributes.
                                                             (line  820)
* init_priority attribute:               C++ Attributes.     (line   30)
* initializations in expressions:        Compound Literals.  (line    6)
* initializers with labeled elements:    Designated Inits.   (line    6)
* initializers, non-constant:            Initializers.       (line    6)
* 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  141)
* interrupt handler functions on the AVR processors: Function Attributes.
                                                             (line 1321)
* interrupt handler functions on the Blackfin, m68k, H8/300 and SH processors: Function Attributes.
                                                             (line  735)
* interrupt service routines on ARM:     Function Attributes.
                                                             (line  750)
* interrupt thread functions on fido:    Function Attributes.
                                                             (line  742)
* 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   50)
* 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  707)
* keywords, alternate:                   Alternate Keywords. (line    6)
* known causes of trouble:               Trouble.            (line    6)
* l1_data variable attribute:            Variable Attributes.
                                                             (line  356)
* l1_data_A variable attribute:          Variable Attributes.
                                                             (line  356)
* l1_data_B variable attribute:          Variable Attributes.
                                                             (line  356)
* l1_text function attribute:            Function Attributes.
                                                             (line  759)
* l2 function attribute:                 Function Attributes.
                                                             (line  765)
* l2 variable attribute:                 Variable Attributes.
                                                             (line  364)
* 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)
* 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  771)
* length-zero arrays:                    Zero Length.        (line    6)
* lgamma:                                Other Builtins.     (line    6)
* lgamma_r:                              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)
* Libraries:                             Link Options.       (line   24)
* LIBRARY_PATH:                          Environment Variables.
                                                             (line   97)
* link options:                          Link Options.       (line    6)
* linker script:                         Link Options.       (line  199)
* 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  154)
* 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)
* 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  674)
* 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  238)
* 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  830)
* matching constraint:                   Simple Constraints. (line  139)
* 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)
* middle-operands, omitted:              Conditionals.       (line    6)
* MIPS options:                          MIPS Options.       (line    6)
* mips16 attribute:                      Function Attributes.
                                                             (line  839)
* 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  134)
* 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)
* ms_abi attribute:                      Function Attributes.
                                                             (line  881)
* ms_hook_prologue attribute:            Function Attributes.
                                                             (line  906)
* ms_struct:                             Type Attributes.    (line  324)
* ms_struct attribute:                   Variable Attributes.
                                                             (line  445)
* mudflap:                               Optimize Options.   (line  407)
* multiple alternative constraints:      Multi-Alternative.  (line    6)
* multiprecision arithmetic:             Long Long.          (line    6)
* n in constraint:                       Simple Constraints. (line   75)
* 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)
* nearbyint:                             Other Builtins.     (line    6)
* nearbyintf:                            Other Builtins.     (line    6)
* nearbyintl:                            Other Builtins.     (line    6)
* nested functions:                      Nested Functions.   (line    6)
* 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 1284)
* NFKC:                                  Warning Options.    (line 1284)
* NMI handler functions on the Blackfin processor: Function Attributes.
                                                             (line  948)
* no_instrument_function function attribute: Function Attributes.
                                                             (line  954)
* no_sanitize_address function attribute: Function Attributes.
                                                             (line 1194)
* no_split_stack function attribute:     Function Attributes.
                                                             (line  959)
* noclone function attribute:            Function Attributes.
                                                             (line  976)
* nocommon attribute:                    Variable Attributes.
                                                             (line  105)
* noinline function attribute:           Function Attributes.
                                                             (line  965)
* nomips16 attribute:                    Function Attributes.
                                                             (line  839)
* non-constant initializers:             Initializers.       (line    6)
* non-static inline function:            Inline.             (line   85)
* nonnull function attribute:            Function Attributes.
                                                             (line  982)
* noreturn function attribute:           Function Attributes.
                                                             (line 1006)
* nosave_low_regs attribute:             Function Attributes.
                                                             (line 1056)
* nothrow function attribute:            Function Attributes.
                                                             (line 1048)
* o in constraint:                       Simple Constraints. (line   23)
* OBJC_INCLUDE_PATH:                     Environment Variables.
                                                             (line  132)
* Objective-C <1>:                       Standards.          (line  163)
* Objective-C:                           G++ and GCC.        (line    6)
* Objective-C and Objective-C++ options, command-line: Objective-C and Objective-C++ Dialect Options.
                                                             (line    6)
* Objective-C++ <1>:                     Standards.          (line  163)
* Objective-C++:                         G++ and GCC.        (line    6)
* 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  256)
* operand constraints, asm:              Constraints.        (line    6)
* optimize function attribute:           Function Attributes.
                                                             (line 1062)
* 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 1079)
* OS_task AVR function attribute:        Function Attributes.
                                                             (line 1079)
* other register constraints:            Simple Constraints. (line  163)
* output file option:                    Overall Options.    (line  191)
* overloaded virtual function, warning:  C++ Dialect Options.
                                                             (line  618)
* p in constraint:                       Simple Constraints. (line  154)
* packed attribute:                      Variable Attributes.
                                                             (line  145)
* parameter forward declaration:         Variable Length.    (line   59)
* Pascal:                                G++ and GCC.        (line   23)
* pcs function attribute:                Function Attributes.
                                                             (line 1104)
* PDP-11 Options:                        PDP-11 Options.     (line    6)
* PIC:                                   Code Gen Options.   (line  280)
* picoChip options:                      picoChip Options.   (line    6)
* pmf:                                   Bound member functions.
                                                             (line    6)
* pointer arguments:                     Function Attributes.
                                                             (line  188)
* 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 optimize:                   Function Specific Option Pragmas.
                                                             (line   21)
* 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   44)
* 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, disinterrupt:                  MeP Pragmas.        (line   38)
* pragma, fini:                          Solaris Pragmas.    (line   19)
* pragma, init:                          Solaris Pragmas.    (line   24)
* pragma, long_calls:                    ARM Pragmas.        (line   11)
* pragma, long_calls_off:                ARM Pragmas.        (line   17)
* pragma, longcall:                      RS/6000 and PowerPC Pragmas.
                                                             (line   14)
* 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 1878)
* 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  691)
* 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  327)
* progmem AVR variable attribute:        Variable Attributes.
                                                             (line  318)
* promotion of formal parameters:        Function Prototypes.
                                                             (line    6)
* pure function attribute:               Function Attributes.
                                                             (line 1122)
* push address instruction:              Simple Constraints. (line  154)
* 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)
* R fixed-suffix:                        Fixed-Point.        (line    6)
* r fixed-suffix:                        Fixed-Point.        (line    6)
* r in constraint:                       Simple Constraints. (line   66)
* RAMPD:                                 AVR Options.        (line  336)
* RAMPX:                                 AVR Options.        (line  336)
* RAMPY:                                 AVR Options.        (line  336)
* RAMPZ:                                 AVR Options.        (line  336)
* ranges in case statements:             Case Ranges.        (line    6)
* read-only strings:                     Incompatibilities.  (line    9)
* 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   66)
* registers, global allocation:          Explicit Reg Vars.  (line    6)
* registers, global variables in:        Global Reg Vars.    (line    6)
* regparm attribute:                     Function Attributes.
                                                             (line 1202)
* relocation truncated to fit (ColdFire): M680x0 Options.    (line  329)
* relocation truncated to fit (MIPS):    MIPS Options.       (line  200)
* 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 1234)
* reordering, warning:                   C++ Dialect Options.
                                                             (line  533)
* reporting bugs:                        Bugs.               (line    6)
* resbank attribute:                     Function Attributes.
                                                             (line 1238)
* 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_twice attribute:               Function Attributes.
                                                             (line 1252)
* 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  102)
* 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 1261)
* save volatile registers on the MicroBlaze: Function Attributes.
                                                             (line 1266)
* 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)
* 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 1274)
* section variable attribute:            Variable Attributes.
                                                             (line  166)
* sentinel function attribute:           Function Attributes.
                                                             (line 1290)
* setjmp:                                Global Reg Vars.    (line   65)
* setjmp incompatibilities:              Incompatibilities.  (line   39)
* shared strings:                        Incompatibilities.  (line    9)
* shared variable attribute:             Variable Attributes.
                                                             (line  211)
* 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 1156)
* significand:                           Other Builtins.     (line    6)
* significandf:                          Other Builtins.     (line    6)
* significandl:                          Other Builtins.     (line    6)
* 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 (PowerPC):     RS/6000 and PowerPC Options.
                                                             (line  743)
* snprintf:                              Other Builtins.     (line    6)
* Solaris 2 options:                     Solaris 2 Options.  (line    6)
* sp_switch attribute:                   Function Attributes.
                                                             (line 1339)
* 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)
* 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 1219)
* 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   54)
* 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  172)
* 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 1354)
* system headers, warnings from:         Warning Options.    (line  843)
* sysv_abi attribute:                    Function Attributes.
                                                             (line  881)
* 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 1361)
* target machine, specifying:            Target Options.     (line    6)
* target options:                        Target Options.     (line    6)
* target("abm") attribute:               Function Attributes.
                                                             (line 1387)
* target("aes") attribute:               Function Attributes.
                                                             (line 1392)
* target("align-stringops") attribute:   Function Attributes.
                                                             (line 1486)
* target("altivec") attribute:           Function Attributes.
                                                             (line 1512)
* target("arch=ARCH") attribute:         Function Attributes.
                                                             (line 1495)
* target("avoid-indexed-addresses") attribute: Function Attributes.
                                                             (line 1633)
* target("cld") attribute:               Function Attributes.
                                                             (line 1457)
* target("cmpb") attribute:              Function Attributes.
                                                             (line 1518)
* target("cpu=CPU") attribute:           Function Attributes.
                                                             (line 1648)
* target("default") attribute:           Function Attributes.
                                                             (line 1395)
* target("dlmzb") attribute:             Function Attributes.
                                                             (line 1524)
* target("fancy-math-387") attribute:    Function Attributes.
                                                             (line 1461)
* target("fma4") attribute:              Function Attributes.
                                                             (line 1441)
* target("fpmath=FPMATH") attribute:     Function Attributes.
                                                             (line 1503)
* target("fprnd") attribute:             Function Attributes.
                                                             (line 1531)
* target("friz") attribute:              Function Attributes.
                                                             (line 1624)
* target("fused-madd") attribute:        Function Attributes.
                                                             (line 1466)
* target("hard-dfp") attribute:          Function Attributes.
                                                             (line 1537)
* target("ieee-fp") attribute:           Function Attributes.
                                                             (line 1471)
* target("inline-all-stringops") attribute: Function Attributes.
                                                             (line 1476)
* target("inline-stringops-dynamically") attribute: Function Attributes.
                                                             (line 1480)
* target("isel") attribute:              Function Attributes.
                                                             (line 1543)
* target("longcall") attribute:          Function Attributes.
                                                             (line 1643)
* target("lwp") attribute:               Function Attributes.
                                                             (line 1449)
* target("mfcrf") attribute:             Function Attributes.
                                                             (line 1547)
* target("mfpgpr") attribute:            Function Attributes.
                                                             (line 1554)
* target("mmx") attribute:               Function Attributes.
                                                             (line 1400)
* target("mulhw") attribute:             Function Attributes.
                                                             (line 1561)
* target("multiple") attribute:          Function Attributes.
                                                             (line 1568)
* target("paired") attribute:            Function Attributes.
                                                             (line 1638)
* target("pclmul") attribute:            Function Attributes.
                                                             (line 1404)
* target("popcnt") attribute:            Function Attributes.
                                                             (line 1408)
* target("popcntb") attribute:           Function Attributes.
                                                             (line 1579)
* target("popcntd") attribute:           Function Attributes.
                                                             (line 1586)
* target("powerpc-gfxopt") attribute:    Function Attributes.
                                                             (line 1592)
* target("powerpc-gpopt") attribute:     Function Attributes.
                                                             (line 1598)
* target("recip") attribute:             Function Attributes.
                                                             (line 1490)
* target("recip-precision") attribute:   Function Attributes.
                                                             (line 1604)
* target("sse") attribute:               Function Attributes.
                                                             (line 1412)
* target("sse2") attribute:              Function Attributes.
                                                             (line 1416)
* target("sse3") attribute:              Function Attributes.
                                                             (line 1420)
* target("sse4") attribute:              Function Attributes.
                                                             (line 1424)
* target("sse4.1") attribute:            Function Attributes.
                                                             (line 1429)
* target("sse4.2") attribute:            Function Attributes.
                                                             (line 1433)
* target("sse4a") attribute:             Function Attributes.
                                                             (line 1437)
* target("ssse3") attribute:             Function Attributes.
                                                             (line 1453)
* target("string") attribute:            Function Attributes.
                                                             (line 1610)
* target("tune=TUNE") attribute:         Function Attributes.
                                                             (line 1499)
* target("update") attribute:            Function Attributes.
                                                             (line 1573)
* target("vsx") attribute:               Function Attributes.
                                                             (line 1616)
* target("xop") attribute:               Function Attributes.
                                                             (line 1445)
* 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 1677)
* TLS:                                   Thread-Local.       (line    6)
* tls_model attribute:                   Variable Attributes.
                                                             (line  235)
* 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  307)
* trap_exit attribute:                   Function Attributes.
                                                             (line 1684)
* trapa_handler attribute:               Function Attributes.
                                                             (line 1689)
* 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)
* type_info:                             Vague Linkage.      (line   42)
* typedef names as function parameters:  Incompatibilities.  (line   97)
* typeof:                                Typeof.             (line    6)
* 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  691)
* unresolved references and -nodefaultlibs: Link Options.    (line   85)
* unresolved references and -nostdlib:   Link Options.       (line   85)
* unused attribute.:                     Function Attributes.
                                                             (line 1693)
* UR fixed-suffix:                       Fixed-Point.        (line    6)
* ur fixed-suffix:                       Fixed-Point.        (line    6)
* use_debug_exception_return attribute:  Function Attributes.
                                                             (line  712)
* use_shadow_register_set attribute:     Function Attributes.
                                                             (line  703)
* used attribute.:                       Function Attributes.
                                                             (line 1698)
* User stack pointer in interrupts on the Blackfin: Function Attributes.
                                                             (line  754)
* 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  853)
* variable addressability on the M32R/D: Variable Attributes.
                                                             (line  374)
* variable alignment:                    Alignment.          (line    6)
* variable attributes:                   Variable Attributes.
                                                             (line    6)
* variable number of arguments:          Variadic Macros.    (line    6)
* 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 1708)
* vfprintf:                              Other Builtins.     (line    6)
* vfscanf:                               Other Builtins.     (line    6)
* visibility attribute:                  Function Attributes.
                                                             (line 1718)
* VLAs:                                  Variable Length.    (line    6)
* vliw attribute:                        Function Attributes.
                                                             (line 1811)
* void pointers, arithmetic:             Pointer Arith.      (line    6)
* void, size of pointer to:              Pointer Arith.      (line    6)
* volatile access <1>:                   C++ Volatiles.      (line    6)
* volatile access:                       Volatiles.          (line    6)
* volatile applied to function:          Function Attributes.
                                                             (line    6)
* volatile read <1>:                     C++ Volatiles.      (line    6)
* volatile read:                         Volatiles.          (line    6)
* volatile write <1>:                    C++ Volatiles.      (line    6)
* volatile write:                        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)
* warn_unused_result attribute:          Function Attributes.
                                                             (line 1817)
* warning for comparison of signed and unsigned values: Warning Options.
                                                             (line 1156)
* warning for overloaded virtual function: C++ Dialect Options.
                                                             (line  618)
* warning for reordering of member initializers: C++ Dialect Options.
                                                             (line  533)
* warning for unknown pragmas:           Warning Options.    (line  691)
* warning function attribute:            Function Attributes.
                                                             (line  166)
* warning messages:                      Warning Options.    (line    6)
* warnings from system headers:          Warning Options.    (line  843)
* warnings vs errors:                    Warnings and Errors.
                                                             (line    6)
* weak attribute:                        Function Attributes.
                                                             (line 1834)
* weakref attribute:                     Function Attributes.
                                                             (line 1843)
* whitespace:                            Incompatibilities.  (line  112)
* X in constraint:                       Simple Constraints. (line  124)
* X3.159-1989:                           Standards.          (line   13)
* x86-64 options:                        x86-64 Options.     (line    6)
* x86-64 Options:                        i386 and 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: Top1926
Node: G++ and GCC3712
Node: Standards5781
Node: Invoking GCC17959
Node: Option Summary21704
Node: Overall Options61886
Node: Invoking G++76124
Node: C Dialect Options77647
Node: C++ Dialect Options93486
Node: Objective-C and Objective-C++ Dialect Options121588
Node: Language Independent Options132096
Node: Warning Options134295
Node: Debugging Options203496
Node: Optimize Options260887
Ref: Type-punning319725
Node: Preprocessor Options397955
Ref: Wtrigraphs402737
Ref: dashMF407485
Ref: fdollars-in-identifiers418349
Node: Assembler Options428616
Node: Link Options429308
Ref: Link Options-Footnote-1440552
Node: Directory Options440886
Node: Spec Files447445
Node: Target Options468843
Node: Submodel Options469242
Node: AArch64 Options470935
Node: Adapteva Epiphany Options474843
Node: ARM Options480794
Node: AVR Options497342
Node: Blackfin Options517460
Node: C6X Options525475
Node: CRIS Options527018
Node: CR16 Options530762
Node: Darwin Options531669
Node: DEC Alpha Options539102
Node: FR30 Options550690
Node: FRV Options551255
Node: GNU/Linux Options557974
Node: H8/300 Options559235
Node: HPPA Options560685
Node: i386 and x86-64 Options570169
Node: i386 and x86-64 Windows Options607255
Node: IA-64 Options610111
Node: LM32 Options618175
Node: M32C Options618699
Node: M32R/D Options619973
Node: M680x0 Options623519
Node: MCore Options637565
Node: MeP Options639068
Node: MicroBlaze Options643027
Node: MIPS Options645823
Node: MMIX Options674723
Node: MN10300 Options677205
Node: Moxie Options679748
Node: PDP-11 Options680119
Node: picoChip Options681811
Node: PowerPC Options683952
Node: RL78 Options684173
Node: RS/6000 and PowerPC Options684835
Node: RX Options723856
Node: S/390 and zSeries Options731190
Node: Score Options739750
Node: SH Options740592
Node: Solaris 2 Options759447
Node: SPARC Options760678
Node: SPU Options773928
Node: System V Options778865
Node: TILE-Gx Options779691
Node: TILEPro Options780615
Node: V850 Options781119
Node: VAX Options787832
Node: VMS Options788367
Node: VxWorks Options789178
Node: x86-64 Options790333
Node: Xstormy16 Options790551
Node: Xtensa Options790840
Node: zSeries Options795151
Node: Code Gen Options795347
Node: Environment Variables825900
Node: Precompiled Headers833901
Node: C Implementation839909
Node: Translation implementation841578
Node: Environment implementation842152
Node: Identifiers implementation842702
Node: Characters implementation843756
Node: Integers implementation846562
Node: Floating point implementation848387
Node: Arrays and pointers implementation851316
Ref: Arrays and pointers implementation-Footnote-1852751
Node: Hints implementation852875
Node: Structures unions enumerations and bit-fields implementation854341
Node: Qualifiers implementation856327
Node: Declarators implementation858099
Node: Statements implementation858441
Node: Preprocessing directives implementation858768
Node: Library functions implementation860873
Node: Architecture implementation861513
Node: Locale-specific behavior implementation862216
Node: C++ Implementation862521
Node: Conditionally-supported behavior863803
Node: Exception handling864313
Node: C Extensions864722
Node: Statement Exprs869716
Node: Local Labels874175
Node: Labels as Values877148
Ref: Labels as Values-Footnote-1879673
Node: Nested Functions879856
Node: Constructing Calls883814
Node: Typeof888532
Node: Conditionals891840
Node: __int128892730
Node: Long Long893254
Node: Complex894730
Node: Floating Types897319
Node: Half-Precision898447
Node: Decimal Float900629
Node: Hex Floats902484
Node: Fixed-Point903520
Node: Named Address Spaces906802
Ref: AVR Named Address Spaces907483
Node: Zero Length912689
Node: Empty Structures915976
Node: Variable Length916382
Node: Variadic Macros919058
Node: Escaped Newlines921436
Node: Subscripting922275
Node: Pointer Arith923001
Node: Initializers923569
Node: Compound Literals924065
Node: Designated Inits927426
Node: Case Ranges931058
Node: Cast to Union931739
Node: Mixed Declarations932830
Node: Function Attributes933340
Node: Attribute Syntax1019668
Node: Function Prototypes1030059
Node: C++ Comments1031840
Node: Dollar Signs1032359
Node: Character Escapes1032824
Node: Variable Attributes1033118
Ref: AVR Variable Attributes1046785
Ref: MeP Variable Attributes1049446
Ref: i386 Variable Attributes1051392
Node: Type Attributes1057056
Ref: MeP Type Attributes1070944
Ref: i386 Type Attributes1071218
Ref: PowerPC Type Attributes1071909
Ref: SPU Type Attributes1072771
Node: Alignment1073062
Node: Inline1074432
Node: Volatiles1079407
Node: Extended Asm1082289
Ref: Example of asm with clobbered asm reg1088193
Ref: Extended asm with goto1097900
Node: Constraints1105751
Node: Simple Constraints1106835
Node: Multi-Alternative1114156
Node: Modifiers1115873
Node: Machine Constraints1118887
Node: Asm Labels1169060
Node: Explicit Reg Vars1170736
Node: Global Reg Vars1172339
Node: Local Reg Vars1176835
Node: Alternate Keywords1179252
Node: Incomplete Enums1180738
Node: Function Names1181494
Node: Return Address1183655
Node: Vector Extensions1187162
Node: Offsetof1193337
Node: __sync Builtins1194150
Node: __atomic Builtins1199620
Node: x86 specific memory model extensions for transactional memory1211259
Node: Object Size Checking1212521
Node: Other Builtins1218010
Node: Target Builtins1247154
Node: Alpha Built-in Functions1248417
Node: ARM iWMMXt Built-in Functions1251426
Node: ARM NEON Intrinsics1258406
Node: ARM ACLE Intrinsics1475889
Node: AVR Built-in Functions1477268
Node: Blackfin Built-in Functions1480338
Node: FR-V Built-in Functions1480955
Node: Argument Types1481814
Node: Directly-mapped Integer Functions1483566
Node: Directly-mapped Media Functions1484648
Node: Raw read/write Functions1491680
Node: Other Built-in Functions1492592
Node: X86 Built-in Functions1493776
Node: X86 transactional memory intrinsics1552726
Node: MIPS DSP Built-in Functions1555400
Node: MIPS Paired-Single Support1567910
Node: MIPS Loongson Built-in Functions1569409
Node: Paired-Single Arithmetic1575929
Node: Paired-Single Built-in Functions1576877
Node: MIPS-3D Built-in Functions1579544
Node: Other MIPS Built-in Functions1584921
Node: picoChip Built-in Functions1585445
Node: PowerPC Built-in Functions1586794
Node: PowerPC AltiVec/VSX Built-in Functions1590502
Node: PowerPC Hardware Transactional Memory Built-in Functions1723400
Node: RX Built-in Functions1729941
Node: S/390 System z Built-in Functions1733974
Node: SH Built-in Functions1739211
Node: SPARC VIS Built-in Functions1740604
Node: SPU Built-in Functions1746208
Node: TI C6X Built-in Functions1748024
Node: TILE-Gx Built-in Functions1749048
Node: TILEPro Built-in Functions1750165
Node: Target Format Checks1751232
Node: Solaris Format Checks1751664
Node: Darwin Format Checks1752090
Node: Pragmas1752908
Node: ARM Pragmas1753618
Node: M32C Pragmas1754221
Node: MeP Pragmas1755295
Node: RS/6000 and PowerPC Pragmas1757364
Node: Darwin Pragmas1758105
Node: Solaris Pragmas1759172
Node: Symbol-Renaming Pragmas1760333
Node: Structure-Packing Pragmas1761887
Node: Weak Pragmas1763537
Node: Diagnostic Pragmas1764271
Node: Visibility Pragmas1767378
Node: Push/Pop Macro Pragmas1768130
Node: Function Specific Option Pragmas1769102
Node: Unnamed Fields1771359
Node: Thread-Local1773587
Node: C99 Thread-Local Edits1775692
Node: C++98 Thread-Local Edits1777704
Node: Binary constants1781148
Node: C++ Extensions1781819
Node: C++ Volatiles1783530
Node: Restricted Pointers1785878
Node: Vague Linkage1787469
Node: C++ Interface1791093
Ref: C++ Interface-Footnote-11795379
Node: Template Instantiation1795515
Node: Bound member functions1802102
Node: C++ Attributes1803634
Node: Function Multiversioning1806290
Node: Namespace Association1808105
Node: Type Traits1809485
Node: Java Exceptions1815973
Node: Deprecated Features1817363
Node: Backwards Compatibility1820328
Node: Objective-C1821680
Node: GNU Objective-C runtime API1822289
Node: Modern GNU Objective-C runtime API1823296
Node: Traditional GNU Objective-C runtime API1825733
Node: Executing code before main1826461
Node: What you can and what you cannot do in +load1829199
Node: Type encoding1831589
Node: Legacy type encoding1836665
Node: @encode1837756
Node: Method signatures1838297
Node: Garbage Collection1840292
Node: Constant string objects1842981
Node: compatibility_alias1845489
Node: Exceptions1846211
Node: Synchronization1848922
Node: Fast enumeration1850106
Node: Using fast enumeration1850418
Node: c99-like fast enumeration syntax1851629
Node: Fast enumeration details1852332
Node: Fast enumeration protocol1854673
Node: Messaging with the GNU Objective-C runtime1857825
Node: Dynamically registering methods1859196
Node: Forwarding hook1860887
Node: Compatibility1863927
Node: Gcov1870494
Node: Gcov Intro1871027
Node: Invoking Gcov1873745
Node: Gcov and Optimization1886656
Node: Gcov Data Files1889656
Node: Cross-profiling1891051
Node: Trouble1892902
Node: Actual Bugs1894314
Node: Interoperation1894761
Node: Incompatibilities1901653
Node: Fixed Headers1909804
Node: Standard Libraries1911467
Node: Disappointments1912839
Node: C++ Misunderstandings1917197
Node: Static Definitions1918008
Node: Name lookup1919061
Ref: Name lookup-Footnote-11923839
Node: Temporaries1924026
Node: Copy Assignment1926002
Node: Non-bugs1927809
Node: Warnings and Errors1938316
Node: Bugs1940078
Node: Bug Criteria1940642
Node: Bug Reporting1942852
Node: Service1943099
Node: Contributing1943918
Node: Funding1944658
Node: GNU Project1947147
Node: Copying1947793
Node: GNU Free Documentation License1985321
Node: Contributors2010458
Node: Option Index2047860
Node: Keyword Index2241012

End Tag Table
